Functors: avoid generating std::integral_constant when a plain int also works
Avoid generating std::integral_constant as argument type in functor code when a plain int also works -- which reduces the load on the compiler, as it reduces the number of template instances that will be generated - and thus reduces the memory requirements for compiling functors.
As an example, the python snippet in_range( 0, M, 1600 )
would end up with 0
and 1600
turned into std::integral_constant<int,0>{}
and std::integral_constant<int,1600>{}
in the generated C++ code, leading to different in_range
overloads being generated for every (integer) numerical value, even if the functor M
would be the same.
Note: this particular case (which triggered this fix) could also be fixed by specifying in_range( 0., M, 1600. )
but why impose that burden on the user of in_range
-- and in addition, the same also holds for eg SIZE == 2
, which this MR also addresses.