Specialises input scalar types to compile-time-constant sp::Scalar derivatives, if possible.
More...
#include <Scalar.hpp>
Static Public Member Functions | |
| template<typename T > | |
| constexpr static bool | test () |
| template<typename ArgType , typename... Stuff> | |
| static auto | specialise (const ArgType &thisArg, sp::int_sequence<>, Stuff &&... stuff) |
| template<int Int, int... Ints, typename ArgType , typename... Stuff> | |
| static auto | specialise (const ArgType &thisArg, sp::int_sequence< Int, Ints... >, Stuff &&... stuff) |
| template<typename ArgType , typename Fn , typename... Stuff> | |
| static auto | run (const ArgType &thisArg, Fn &fn, Stuff &&... stuff) |
Replace scalars with sp::Scalars<> with the appropriate ScalarKind. More... | |
Static Public Member Functions inherited from sp::Specialiser | |
| template<typename T > | |
| static constexpr bool | test () |
| Return true iff the specialiser is able to specialise arguments of type T. More... | |
| template<typename... O, typename ArgType , typename... Stuff> | |
| static auto | run (const ArgType &thisArg, Stuff &&... stuff) |
| Specialise an argument. More... | |
Specialises input scalar types to compile-time-constant sp::Scalar derivatives, if possible.
This Specialiser checks if the runtime value of any scalar argument is equal to an entry in the target functor type's overload of Specialisable::ScalarsToSpecialise. If it is, the argument is replaced by an sp::Scalar of a type that is constexpr-convertible to the scalar value.
This will produce one expansion branch for every entry in the target functor's ScalarsToSpecialise, plus a general case for runtime-determined values.
|
static |
Replace scalars with sp::Scalars<> with the appropriate ScalarKind.
This will lead to the generation of special versions of the target function for degenerate scalar values (like 0, 1, etc.)