26 #include "mdarray.hpp"
27 #include "index_map/index_maps.hpp"
28 #include "../types/complex_utils.hpp"
30 #include "../algorithms.hpp"
31 #include "../utilities/sfinae_macros.hpp"
51 using map_type =
typename T::map_type;
54 using ipa_type =
typename T::inplace_arithmetic;
89 return return_type(a.map(),operator_type(a,b));
116 is_array<LHS>,not_t<is_array<T>>
119 mdarray<add_op<LHS,scalar<T>>,map_type<LHS>,ipa_type<LHS>>
122 typedef add_op<LHS,scalar<T>> operator_type;
123 typedef mdarray<operator_type,map_type<LHS>,ipa_type<LHS>> return_type;
125 return return_type(a.map(),operator_type(a,b));
152 not_t<is_array<T>>,is_array<RHS>
155 mdarray<add_op<scalar<T>,RHS>,map_type<RHS>,ipa_type<RHS>>
158 typedef add_op<scalar<T>,RHS> operator_type;
159 typedef mdarray<operator_type,map_type<RHS>,ipa_type<RHS>> result_type;
160 typedef scalar<T> scalar_type;
162 return result_type(b.map(),operator_type(scalar_type(a),b));
189 typename = enable_if<and_t<is_array<LHS>,is_array<RHS>>>
191 mdarray<sub_op<LHS,RHS >,map_type<LHS>,ipa_type<LHS>>
194 typedef sub_op<LHS,RHS> operator_type;
195 typedef mdarray<operator_type,map_type<LHS>,ipa_type<LHS>> result_type;
197 return result_type(a.map(),operator_type(a,b));
224 is_array<LHS>,not_t<is_array<T>>
227 mdarray<sub_op<LHS,scalar<T> >,map_type<LHS>,ipa_type<LHS>>
230 typedef sub_op<LHS,scalar<T>> operator_type;
231 typedef mdarray<operator_type,map_type<LHS>,ipa_type<LHS>> result_type;
233 return result_type(a.map(),operator_type(a,b));
260 not_t<is_array<T>>,is_array<RHS>
263 mdarray<sub_op<scalar<T>,RHS>,map_type<RHS>,ipa_type<RHS>>
266 typedef sub_op<scalar<T>,RHS> operator_type;
267 typedef mdarray<operator_type,map_type<RHS>,ipa_type<RHS>> result_type;
269 return result_type(b.map(),operator_type(a,b));
295 typename = enable_if<and_t<is_array<LHS>,is_array<RHS>>>
297 mdarray<div_op<LHS,RHS>,map_type<LHS>,ipa_type<LHS>>
298 operator/(
const LHS &a,
const RHS &b)
300 typedef div_op<LHS,RHS> operator_type;
301 typedef mdarray<operator_type,map_type<LHS>,ipa_type<LHS>> result_type;
303 return result_type(a.map(),operator_type(a,b));
330 is_array<LHS>,not_t<is_array<T>>
333 mdarray<div_op<LHS,scalar<T>>,map_type<LHS>,ipa_type<LHS>>
334 operator/(
const LHS &a,
const T &b)
336 typedef div_op<LHS,scalar<T>> operator_type;
337 typedef mdarray<operator_type,map_type<LHS>,ipa_type<LHS>> result_type;
339 return result_type(a.map(),operator_type(a,b));
366 not_t<is_array<T>>,is_array<RHS>
369 mdarray<div_op<scalar<T>,RHS>,map_type<RHS>,ipa_type<RHS>>
370 operator/(
const T &a,
const RHS &b)
372 typedef div_op<scalar<T>,RHS> operator_type;
373 typedef mdarray<operator_type,map_type<RHS>,ipa_type<RHS>> result_type;
375 return result_type(b.map(),operator_type(a,b));
400 typename = enable_if<and_t<is_array<LHS>,is_array<RHS> >>
402 mdarray<mult_op<LHS,RHS>,map_type<LHS>,ipa_type<LHS>>
403 operator*(
const LHS &a,
const RHS &b)
405 typedef mult_op<LHS,RHS> operator_type;
406 typedef mdarray<operator_type,map_type<LHS>,ipa_type<LHS>> result_type;
408 return result_type(a.map(),operator_type(a,b));
435 is_array<LHS>,not_t<is_array<T>>
438 mdarray<mult_op<LHS,scalar<T>>,map_type<LHS>,ipa_type<LHS>>
439 operator*(
const LHS &a,
const T &b)
441 typedef mult_op<LHS,scalar<T>> operator_type;
442 typedef mdarray<operator_type,map_type<LHS>,ipa_type<LHS>> result_type;
444 return result_type(a.map(),operator_type(a,b));
471 not_t<is_array<T>>,is_array<RHS>
474 mdarray<mult_op<scalar<T>,RHS>,map_type<RHS>,ipa_type<RHS>>
475 operator*(
const T &a,
const RHS &b)
477 typedef mult_op<scalar<T>,RHS> operator_type;
478 typedef mdarray<operator_type,map_type<RHS>,ipa_type<RHS>> result_type;
480 return result_type(b.map(),operator_type(a,b));
container trait
Definition: container_trait.hpp:57
Definition: add_op.hpp:29
struct identifying a type as an array type
Definition: array_arithmetic.hpp:42
invoke< std::enable_if< C::value >> enable_if
shortcut for std::enable_if
Definition: sfinae_macros.hpp:108
scalar_iterator< ITERABLE > operator+(const scalar_iterator< ITERABLE > &a, ssize_t b)
add scalar to iterator
Definition: scalar_iterator.hpp:272
template for a multi-dimensional array class
Definition: mdarray.hpp:66
type erasure for POD data
Definition: value.hpp:46
addition expression template
Definition: add_op.hpp:46
scalar_iterator< ITERABLE > operator-(const scalar_iterator< ITERABLE > &a, ssize_t b)
subtract offset from iterator
Definition: scalar_iterator.hpp:312