|
TECA
The Toolkit for Extreme Climate Analysis
|
Go to the documentation of this file. 1 #ifndef teca_variant_array_operator
2 #define teca_variant_array_operator
16 template <
typename nt_arg1,
typename nt_arg2,
typename nt_arg3,
17 typename operator_t,
typename type_select_t =
20 const nt_arg1 *parg1,
const nt_arg2 *parg2,
const nt_arg3 *parg3,
23 using nt_out =
typename type_select_t::type;
28 nt_out *pout = out->get();
30 for (
unsigned long i = 0; i < n; ++i)
31 pout[i] =
static_cast<nt_out
>(op(parg1[i], parg2[i], parg3[i]));
37 template <
typename nt_larg,
typename nt_rarg,
typename operator_t,
40 const nt_larg *plarg,
const nt_rarg *prarg,
const operator_t &op)
42 using nt_out =
typename type_select_t::type;
47 nt_out *pout = out->get();
49 for (
unsigned long i = 0; i < n; ++i)
50 pout[i] =
static_cast<nt_out
>(op(plarg[i], prarg[i]));
56 template <
typename nt_arg,
typename operator_t>
58 const nt_arg *parg,
const operator_t &op)
63 nt_arg *pout = out->get();
65 for (
unsigned long i = 0; i < n; ++i)
66 pout[i] =
static_cast<nt_arg
>(op(parg[i]));
74 template <
typename operator_t>
81 const NT_1 *parg1 = std::static_pointer_cast<TT_1>(arg1)->get();
84 const NT_2 *parg2 = std::static_pointer_cast<TT_2>(arg2)->get();
87 const NT_3 *parg3 = std::static_pointer_cast<TT_3>(arg3)->get();
88 return internal::apply(arg1->size(), parg1, parg2, parg3, op);
92 TECA_ERROR(
"failed to apply " << operator_t::name() <<
". unsupported type.")
97 template <
typename operator_t>
103 const NT_LEFT *plarg = std::static_pointer_cast<TT_LEFT>(larg)->get();
106 const NT_RIGHT *prarg = std::static_pointer_cast<TT_RIGHT>(rarg)->get();
107 return internal::apply(larg->size(), plarg, prarg, op);
110 TECA_ERROR(
"failed to apply " << operator_t::name() <<
". unsupported type.")
115 template <
typename operator_t>
121 const NT_LEFT *plarg = std::static_pointer_cast<TT_LEFT>(larg)->get();
124 const NT_RIGHT *prarg = std::static_pointer_cast<TT_RIGHT>(rarg)->get();
125 return internal::apply(larg->size(), plarg, prarg, op);
128 TECA_ERROR(
"failed to apply " << operator_t::name() <<
". unsupported type.")
133 template <
typename operator_t>
135 const operator_t &op)
139 const NT *parg = std::static_pointer_cast<TT>(arg)->get();
140 return internal::apply(arg->size(), parg, op);
142 TECA_ERROR(
"failed to apply " << operator_t::name() <<
". unsupported type.")
148 template<
typename nt_arg1,
typename nt_arg2,
typename nt_arg3,
150 nt_out operator()(
const nt_arg1 &arg1,
const nt_arg2 &arg2,
const nt_arg3 &arg3)
const
151 {
return (arg1 ?
static_cast<nt_out
>(arg2) :
static_cast<nt_out
>(arg3)); }
152 static constexpr
const char *name(){
return "ternary_condition"; }
155 #define binary_operator(_name, _op) \
158 template<typename nt_larg, typename nt_rarg, \
159 typename nt_out = typename teca_type_select::elevate<nt_larg, nt_rarg>::type> \
160 nt_out operator()(const nt_larg &larg, const nt_rarg &rarg) const \
161 { return static_cast<nt_out>(larg) _op static_cast<nt_out>(rarg); } \
162 static constexpr const char *name(){ return #_op; } \
179 #define binary_operator_fun(_name, _op) \
182 template<typename nt_larg, typename nt_rarg, \
183 typename nt_out = typename teca_type_select::elevate<nt_larg, nt_rarg>::type> \
184 nt_out operator()(const nt_larg &larg, const nt_rarg &rarg) const \
185 { return _op(static_cast<nt_out>(larg), static_cast<nt_out>(rarg)); } \
186 static constexpr const char *name(){ return #_op; } \
189 binary_operator_fun(
power, std::pow)
191 #define unary_operator(_name, _op) \
194 template<typename nt_arg> \
195 nt_arg operator()(const nt_arg &arg) const \
196 { return static_cast<nt_arg>(_op arg); } \
197 static constexpr const char *name(){ return #_op; } \
213 TECA_ERROR(
"binary operation " << op <<
" is not implemented")
221 case '=': r = apply(a1, a2,
equal());
return 0;
222 case '!': r = apply(a1, a2,
not_equal());
return 0;
224 if (op[1] ==
'=') r = apply(a1, a2,
less_equal());
225 else r = apply(a1, a2,
less());
229 else r = apply(a1, a2,
greater());
231 case '&': r = apply(a1, a2,
logical_and());
return 0;
232 case '|': r = apply(a1, a2,
logical_or());
return 0;
233 case '+': r = apply(a1, a2,
add());
return 0;
234 case '-': r = apply(a1, a2,
subtract());
return 0;
236 if (op[1] ==
'*') r = apply(a1, a2,
power());
239 case '/': r = apply(a1, a2,
divide());
return 0;
240 case '%': r = apply_i(a1, a2,
modulo());
return 0;
244 TECA_ERROR(
"binary operation " << op <<
" is not implemented")
254 r = teca_variant_array_operator::apply(a1,
logical_not());
259 TECA_ERROR(
"unary operation " << op <<
" is not implemented")
Definition: teca_variant_array_operator.h:171
The concrete implementation of our type agnostic container for contiguous arrays.
Definition: teca_variant_array.h:23
Definition: teca_variant_array_operator.h:166
Definition: teca_variant_array_operator.h:175
Definition: teca_variant_array_operator.h:202
#define NESTED_TEMPLATE_DISPATCH(t, p, i, body)
Definition: teca_variant_array.h:276
Codes dealing with run time specified operations on teca_variant_arrays.
Definition: teca_variant_array_operator.h:10
Select the higher precision type.
Definition: teca_type_select.h:18
Definition: teca_variant_array_operator.h:172
bool equal(T a, T b, T relTol=equal_tt< T >::relTol(), T absTol=equal_tt< T >::absTol(), typename std::enable_if< std::is_floating_point< T >::value >::type *=0)
Definition: teca_coordinate_util.h:61
T & get(unsigned long i)
Get the ith value.
Definition: teca_variant_array.h:565
Definition: teca_variant_array_operator.h:170
Definition: teca_variant_array_operator.h:173
Definition: teca_variant_array_operator.h:176
std::shared_ptr< const teca_variant_array > const_p_teca_variant_array
Definition: teca_variant_array.h:22
Definition: teca_variant_array_operator.h:177
#define TEMPLATE_DISPATCH(t, p, body)
Definition: teca_variant_array.h:231
static std::shared_ptr< teca_variant_array_impl< T > > New()
Definition: teca_variant_array.h:525
#define NESTED_TEMPLATE_DISPATCH_I(t, p, i, body)
Definition: teca_variant_array.h:255
Definition: teca_variant_array_operator.h:200
Definition: teca_variant_array_operator.h:167
std::shared_ptr< teca_variant_array_impl< T > > p_teca_variant_array_impl
Definition: teca_variant_array.h:23
std::shared_ptr< teca_variant_array > p_teca_variant_array
Definition: teca_variant_array.h:22
Definition: teca_variant_array_operator.h:189
Definition: teca_variant_array_operator.h:168
Definition: teca_variant_array_operator.h:169
Definition: teca_variant_array_operator.h:165
Definition: teca_variant_array_operator.h:146
#define TECA_ERROR(_msg)
Constructs an error message and sends it to the stderr stream.
Definition: teca_common.h:138
Definition: teca_variant_array_operator.h:174