26 #ifndef TILEDARRAY_TILE_INTERFACE_ADD_H__INCLUDED 27 #define TILEDARRAY_TILE_INTERFACE_ADD_H__INCLUDED 29 #include "../type_traits.h" 41 template <
typename Left,
typename Right>
42 inline auto add(
const Left& left,
const Right& right) ->
43 decltype(left.add(right))
44 {
return left.add(right); }
55 template <
typename Left,
typename Right,
typename Scalar,
56 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
57 inline auto add(
const Left& left,
const Right& right,
const Scalar factor)
58 {
return left.add(right, factor); }
68 template <
typename Left,
typename Right>
69 inline auto add(
const Left& left,
const Right& right,
const Permutation& perm)
70 {
return left.add(right, perm); }
82 template <
typename Left,
typename Right,
typename Scalar,
83 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
84 inline auto add(
const Left& left,
const Right& right,
const Scalar factor,
86 {
return left.add(right, factor, perm); }
95 template <
typename Result,
typename Arg>
96 inline Result&
add_to(Result& result,
const Arg& arg)
97 {
return result.add_to(arg); }
108 template <
typename Result,
typename Arg,
typename Scalar,
109 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
110 inline Result&
add_to(Result& result,
const Arg& arg,
const Scalar factor)
111 {
return result.add_to(arg, factor); }
114 namespace tile_interface {
119 template <
typename... T>
122 template <
typename... T>
153 template <
typename Result,
typename Left,
typename Right,
154 typename Enabler =
void>
165 return add(left, right);
172 return add(left, right, perm);
178 template <
typename Result,
typename Left,
typename Right>
179 class Add<Result, Left, Right,
180 typename
std::enable_if<
181 ! (std::is_same<Result, result_of_add_t<Left, Right> >::value &&
182 std::is_same<Result, result_of_add_t<Left, Right, Permutation> >::value)
196 return cast(
add(left, right));
204 return cast(
add(left, right, perm));
209 template <
typename Result,
typename Left,
typename Right,
typename Scalar,
210 typename Enabler =
void>
214 "Cannot scale tiles by a non-scalar type");
225 return add(left, right, factor);
232 return add(left, right, factor, perm);
238 template <
typename Result,
typename Left,
typename Right,
typename Scalar>
240 typename
std::enable_if<
241 ! (std::is_same<Result, result_of_add_t<Left, Right, Scalar> >::value &&
242 std::is_same<Result, result_of_add_t<Left, Right, Scalar, Permutation> >::value)
247 "Cannot scale tiles by a non-scalar type");
259 return cast(
add(left, right, factor));
267 return cast(
add(left, right, factor, perm));
272 template <
typename Result,
typename Left,
typename Right,
273 typename Enabler =
void>
283 return add_to(left, right);
289 template <
typename Result,
typename Left,
typename Right>
291 typename
std::enable_if<
292 ! std::is_same<Result, result_of_add_to_t<Left, Right> >::value
312 template <
typename Result,
typename Left,
typename Right,
typename Scalar,
313 typename Enabler =
void>
317 "Cannot scale tiles by a non-scalar type");
326 return add_to(left, right);
331 template <
typename Result,
typename Left,
typename Right,
typename Scalar>
333 typename
std::enable_if<
334 ! std::is_same<Result, result_of_add_to_t<Left, Right, Scalar> >::value
339 "Cannot scale tiles by a non-scalar type");
367 template <
typename Result,
typename Left,
typename Right>
380 template <
typename Result,
typename Left,
typename Right,
typename Scalar>
391 template <
typename Result,
typename Left,
typename Right>
403 template <
typename Result,
typename Left,
typename Right,
typename Scalar>
411 #endif // TILEDARRAY_TILE_INTERFACE_ADD_H__INCLUDED result_type operator()(const left_type &left, const right_type &right, const scalar_type factor, const Permutation &perm) const
result_type operator()(const left_type &left, const right_type &right) const
Left left_type
Left-hand argument tile type.
Right right_type
Right-hand argument tile type.
TiledArray::tile_interface::ScalAdd< Result, Left, Right, Scalar, typename std::enable_if< !(std::is_same< Result, result_of_add_t< Left, Right, Scalar > >::value &&std::is_same< Result, result_of_add_t< Left, Right, Scalar, Permutation > >::value) >::type >::operator() result_type operator()(const left_type &left, const right_type &right, const scalar_type factor) const
result_type operator()(left_type &left, const right_type &right, const scalar_type factor) const
Left left_type
Left-hand argument tile type.
Right right_type
Right-hand argument tile type.
Left left_type
Left-hand argument tile type.
result_type & operator()(left_type &left, const right_type &right) const
result_type operator()(const left_type &left, const right_type &right, const scalar_type factor) const
Tile< Result > & add_to(Tile< Result > &result, const Tile< Arg > &arg)
Add to the result tile.
TiledArray::tile_interface::ScalAdd< Result, Left, Right, Scalar, typename std::enable_if< !(std::is_same< Result, result_of_add_t< Left, Right, Scalar > >::value &&std::is_same< Result, result_of_add_t< Left, Right, Scalar, Permutation > >::value) >::type >::operator() result_type operator()(const left_type &left, const right_type &right, const scalar_type factor, const Permutation &perm) const
Scalar scalar_type
The scaling factor type.
Right right_type
Right-hand argument tile type.
Result result_type
Result tile type.
Result result_type
Result tile type.
decltype(auto) add(const Tile< Left > &left, const Tile< Right > &right)
Add tile arguments.
Scalar scalar_type
The scaling factor type.
Right right_type
Right-hand argument tile type.
Right right_type
Right-hand argument tile type.
Result result_type
Result tile type.
result_type operator()(left_type &left, const right_type &right) const
result_type & operator()(left_type &left, const right_type &right) const
Left left_type
Left-hand argument tile type.
TiledArray::tile_interface::ScalAdd< Result, Left, Right, Scalar, typename std::enable_if< !(std::is_same< Result, result_of_add_t< Left, Right, Scalar > >::value &&std::is_same< Result, result_of_add_t< Left, Right, Scalar, Permutation > >::value) >::type >::result_type Result result_type
Result tile type.
Right right_type
Right-hand argument tile type.
Result result_type
Result tile type.
TiledArray::tile_interface::ScalAdd< Result, Left, Right, Scalar, typename std::enable_if< !(std::is_same< Result, result_of_add_t< Left, Right, Scalar > >::value &&std::is_same< Result, result_of_add_t< Left, Right, Scalar, Permutation > >::value) >::type >::left_type Left left_type
Left-hand argument tile type.
TiledArray::tile_interface::ScalAdd< Result, Left, Right, Scalar, typename std::enable_if< !(std::is_same< Result, result_of_add_t< Left, Right, Scalar > >::value &&std::is_same< Result, result_of_add_t< Left, Right, Scalar, Permutation > >::value) >::type >::right_type Right right_type
Right-hand argument tile type.
result_type operator()(const left_type &left, const right_type &right, const Permutation &perm) const
Right right_type
Right-hand argument tile type.
Add-to and scale tile operation.
Scalar scalar_type
The scaling factor type.
decltype(add_to(std::declval< T >()...)) result_of_add_to_t
result_type operator()(const left_type &left, const right_type &right, const Permutation &perm) const
Result result_type
Result tile type.
Permutation of a sequence of objects indexed by base-0 indices.
decltype(add(std::declval< T >()...)) result_of_add_t
TiledArray::tile_interface::ScalAdd< Result, Left, Right, Scalar, typename std::enable_if< !(std::is_same< Result, result_of_add_t< Left, Right, Scalar > >::value &&std::is_same< Result, result_of_add_t< Left, Right, Scalar, Permutation > >::value) >::type >::scalar_type Scalar scalar_type
The scaling factor type.
result_type operator()(const left_type &left, const right_type &right) const
Left left_type
Left-hand argument tile type.
Left left_type
Left-hand argument tile type.
Left left_type
Left-hand argument tile type.
Result result_type
Result tile type.
Result result_type
Result tile type.