17 #ifndef OPENKALMAN_SCALAR_CONSTANT_OPERATION_HPP 18 #define OPENKALMAN_SCALAR_CONSTANT_OPERATION_HPP 32 template<
typename Operation,
typename...Args>
36 template<
typename Operation,
value...Args> requires (... or not fixed<Args>) or
37 (not requires { std::bool_constant<(Operation{}(
to_number(Args{})...),
true)>::
value; })
38 struct operation<Operation, Args...>
41 using value_type = std::decay_t<decltype(std::declval<const Operation&>()(
to_number(std::declval<Args&&>())...))>;
43 constexpr
operator value_type()
const {
return value; }
44 constexpr value_type operator()()
const {
return value; }
56 struct operation<Operation, Args...>
59 explicit constexpr
operation(
const Operation&,
const Args&...) {};
61 using value_type = std::decay_t<decltype(value)>;
63 constexpr
operator value_type()
const {
return value; }
64 constexpr value_type operator()()
const {
return value; }
68 template<
typename Operation,
typename...Args>
74 template<
typename Operation,
typename = void,
typename...Args>
78 template<
typename Op,
typename = void,
typename...Args>
81 template<
typename Op,
typename...Args>
87 template<
typename Operation,
typename...Args>
89 ((... or not fixed<Args>) or not operation_invocable<Operation, void, Args...>::value)>, Args...>
92 using value_type = std::decay_t<decltype(std::declval<const Operation&>()(
values::to_number(std::declval<Args&&>())...))>;
93 using type = operation<Operation, Args...>;
94 constexpr
operator value_type()
const {
return value; }
95 constexpr value_type operator()()
const {
return value; }
103 template<
typename Operation,
typename...Args>
105 (... and values::fixed<Args>) and operation_invocable<Operation, void, Args...>::value>, Args...>
110 using value_type = std::decay_t<decltype(value)>;
111 using type = operation<Operation, Args...>;
112 constexpr
operator value_type()
const {
return value; }
113 constexpr value_type operator()()
const {
return value; }
114 constexpr
auto operator+() {
return static_cast<type&
>(*this); }
115 constexpr
auto operator-() {
return operation {std::negate<value_type>{},
static_cast<type&
>(*this)}; }
120 template<
typename Operation,
typename...Args>
134 template<
typename Operation,
typename...Args>
135 explicit operation(
const Operation&,
const Args&...) -> operation<Operation, Args...>;
139 #endif //OPENKALMAN_SCALAR_CONSTANT_OPERATION_HPP Definition for values::to_number.
An operation involving some number of values.
Definition: operation.hpp:69
Definition: tuple_reverse.hpp:103
constexpr bool value
T is numerical value or is reducible to a numerical value.
Definition: value.hpp:31
constexpr auto to_number(Arg arg)
Convert any values::value to a values::number.
Definition: to_number.hpp:34
Definition: operation.hpp:79
Definition for values::abs.
Definition: constant_coefficient.hpp:25
constexpr bool fixed
T is a values::value that is determinable at compile time.
Definition: fixed.hpp:60
operation(const Operation &, const Args &...) -> operation< Operation, Args... >
Deduction guide.
Definition: operation.hpp:75