|
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 auto spout = out->get_cpu_accessible();
29 nt_out *pout = spout.get();
31 for (
unsigned long i = 0; i < n; ++i)
32 pout[i] =
static_cast<nt_out
>(op(parg1[i], parg2[i], parg3[i]));
38 template <
typename nt_larg,
typename nt_rarg,
typename operator_t,
41 const nt_larg *plarg,
const nt_rarg *prarg,
const operator_t &op)
43 using nt_out =
typename type_select_t::type;
48 auto spout = out->get_cpu_accessible();
49 nt_out *pout = spout.get();
51 for (
unsigned long i = 0; i < n; ++i)
52 pout[i] =
static_cast<nt_out
>(op(plarg[i], prarg[i]));
58 template <
typename nt_arg,
typename operator_t>
60 const nt_arg *parg,
const operator_t &op)
65 auto spout = out->get_cpu_accessible();
66 nt_arg *pout = spout.get();
68 for (
unsigned long i = 0; i < n; ++i)
69 pout[i] =
static_cast<nt_arg
>(op(parg[i]));
77 template <
typename operator_t>
84 auto sparg1 =
static_cast<TT_1*
>(arg1.get())->get_cpu_accessible();
85 auto parg1 = sparg1.get();
88 auto sparg2 =
static_cast<TT_2*
>(arg2.get())->get_cpu_accessible();
89 auto parg2 = sparg2.get();
92 auto sparg3 =
static_cast<TT_3*
>(arg3.get())->get_cpu_accessible();
93 auto parg3 = sparg3.get();
94 return internal::apply(arg1->size(), parg1, parg2, parg3, op);
98 TECA_ERROR(
"failed to apply " << operator_t::name() <<
". unsupported type.")
103 template <
typename operator_t>
109 auto splarg =
static_cast<TT_LEFT*
>(larg.get())->get_cpu_accessible();
110 auto plarg = splarg.get();
113 auto sprarg =
static_cast<TT_RIGHT*
>(rarg.get())->get_cpu_accessible();
114 auto prarg = sprarg.get();
115 return internal::apply(larg->size(), plarg, prarg, op);
118 TECA_ERROR(
"failed to apply " << operator_t::name() <<
". unsupported type.")
123 template <
typename operator_t>
129 auto splarg =
static_cast<TT_LEFT*
>(larg.get())->get_cpu_accessible();
130 auto plarg = splarg.get();
133 auto sprarg =
static_cast<TT_RIGHT*
>(rarg.get())->get_cpu_accessible();
134 auto prarg = sprarg.get();
135 return internal::apply(larg->size(), plarg, prarg, op);
138 TECA_ERROR(
"failed to apply " << operator_t::name() <<
". unsupported type.")
143 template <
typename operator_t>
145 const operator_t &op)
149 auto sparg =
static_cast<TT*
>(arg.get())->get_cpu_accessible();
150 auto parg = sparg.get();
151 return internal::apply(arg->size(), parg, op);
153 TECA_ERROR(
"failed to apply " << operator_t::name() <<
". unsupported type.")
159 template<
typename nt_arg1,
typename nt_arg2,
typename nt_arg3,
161 nt_out operator()(
const nt_arg1 &arg1,
const nt_arg2 &arg2,
const nt_arg3 &arg3)
const
162 {
return (arg1 ?
static_cast<nt_out
>(arg2) :
static_cast<nt_out
>(arg3)); }
163 static constexpr
const char *name(){
return "ternary_condition"; }
166 #define binary_operator(_name, _op) \
169 template<typename nt_larg, typename nt_rarg, \
170 typename nt_out = typename teca_type_select::elevate<nt_larg, nt_rarg>::type> \
171 nt_out operator()(const nt_larg &larg, const nt_rarg &rarg) const \
172 { return static_cast<nt_out>(larg) _op static_cast<nt_out>(rarg); } \
173 static constexpr const char *name(){ return #_op; } \
190 #define binary_operator_fun(_name, _op) \
193 template<typename nt_larg, typename nt_rarg, \
194 typename nt_out = typename teca_type_select::elevate<nt_larg, nt_rarg>::type> \
195 nt_out operator()(const nt_larg &larg, const nt_rarg &rarg) const \
196 { return _op(static_cast<nt_out>(larg), static_cast<nt_out>(rarg)); } \
197 static constexpr const char *name(){ return #_op; } \
200 binary_operator_fun(
power, std::pow)
202 #define unary_operator(_name, _op) \
205 template<typename nt_arg> \
206 nt_arg operator()(const nt_arg &arg) const \
207 { return static_cast<nt_arg>(_op arg); } \
208 static constexpr const char *name(){ return #_op; } \
224 TECA_ERROR(
"binary operation " << op <<
" is not implemented")
232 case '=': r = apply(a1, a2,
equal());
return 0;
233 case '!': r = apply(a1, a2,
not_equal());
return 0;
235 if (op[1] ==
'=') r = apply(a1, a2,
less_equal());
236 else r = apply(a1, a2,
less());
240 else r = apply(a1, a2,
greater());
242 case '&': r = apply(a1, a2,
logical_and());
return 0;
243 case '|': r = apply(a1, a2,
logical_or());
return 0;
244 case '+': r = apply(a1, a2,
add());
return 0;
245 case '-': r = apply(a1, a2,
subtract());
return 0;
247 if (op[1] ==
'*') r = apply(a1, a2,
power());
250 case '/': r = apply(a1, a2,
divide());
return 0;
251 case '%': r = apply_i(a1, a2,
modulo());
return 0;
255 TECA_ERROR(
"binary operation " << op <<
" is not implemented")
265 r = teca_variant_array_operator::apply(a1,
logical_not());
270 TECA_ERROR(
"unary operation " << op <<
" is not implemented")
void get(size_t i, U &val) const
Definition: teca_variant_array_impl.h:444
Definition: teca_variant_array_operator.h:182
The concrete implementation of our type agnostic container for contiguous arrays.
Definition: teca_variant_array_impl.h:39
Definition: teca_variant_array_operator.h:177
Definition: teca_variant_array_operator.h:186
Definition: teca_variant_array_operator.h:213
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:20
Definition: teca_variant_array_operator.h:183
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:70
#define NESTED_TEMPLATE_DISPATCH(t, p, i, body)
Definition: teca_variant_array_impl.h:276
#define NESTED_TEMPLATE_DISPATCH_I(t, p, i, body)
Definition: teca_variant_array_impl.h:255
Definition: teca_variant_array_operator.h:181
Definition: teca_variant_array_operator.h:184
Definition: teca_variant_array_operator.h:187
std::shared_ptr< const teca_variant_array > const_p_teca_variant_array
Definition: teca_variant_array.h:27
Definition: teca_variant_array_operator.h:188
Definition: teca_variant_array_operator.h:211
Definition: teca_variant_array_operator.h:178
std::shared_ptr< teca_variant_array > p_teca_variant_array
Definition: teca_variant_array.h:27
Definition: teca_variant_array_operator.h:200
Definition: teca_variant_array_operator.h:179
Definition: teca_variant_array_operator.h:180
Definition: teca_variant_array_operator.h:176
Definition: teca_variant_array_operator.h:157
std::shared_ptr< teca_variant_array_impl< T > > p_teca_variant_array_impl
Definition: teca_variant_array_impl.h:39
#define TECA_ERROR(_msg)
Constructs an error message and sends it to the stderr stream.
Definition: teca_common.h:146
Definition: teca_variant_array_operator.h:185
#define TEMPLATE_DISPATCH(t, p, body)
Definition: teca_variant_array_impl.h:209
static std::shared_ptr< teca_variant_array_impl< T > > New()
Definition: teca_variant_array_impl.h:326