26 #ifndef TILEDARRAY_TILE_INTERFACE_CAST_H__INCLUDED 27 #define TILEDARRAY_TILE_INTERFACE_CAST_H__INCLUDED 29 #include "../type_traits.h" 34 template <
typename Result,
typename Arg,
typename Enabler =
void>
class Cast;
36 namespace tile_interface {
38 template <
typename Result,
typename Arg,
typename Enabler>
50 template <
typename Result,
typename Arg>
52 std::enable_if_t<detail::has_conversion_operator<
53 Arg, madness::Future<Result>>::value ||
54 detail::is_convertible<Arg, Result>::value>
61 static const constexpr
bool is_nonblocking =
63 madness::Future<result_type>>::value;
67 std::is_same<
result_type, std::decay_t<result_type>>::value,
68 "Cast<Result,Arg>: Result must be a non-const non-ref type");
70 std::is_same<
argument_type, std::decay_t<argument_type>>::value,
71 "Cast<Result,Arg>: Arg must be a non-const non-ref type");
76 "Cast<Result,Arg> does not know how to construct Result or " 77 "Future<Result> from Arg");
80 template <
typename Result_,
typename Arg_,
82 std::decay_t<Arg_>, Result_>::value>>
83 static auto invoker(Arg_&& arg) {
84 auto exec = [](Arg_&& arg) {
85 return static_cast<Result_
>(std::forward<Arg_>(arg));
89 template <
typename Result_,
typename Arg_>
93 std::decay_t<Arg_>, madness::Future<Result_>>::value>* =
95 auto exec = [](Arg_&& arg) {
96 return static_cast<madness::Future<Result_>
>(std::forward<Arg_>(arg));
105 template <
typename Arg_,
typename = std::enable_if_t<std::is_same<
106 argument_type, std::decay_t<Arg_>>::value>>
108 return this->invoker<result_type>(arg);
122 template <
typename Result,
typename Arg>
124 typename
std::enable_if<
125 is_lazy_tile<Arg>::value &&
126 ! std::is_same<Result, typename TiledArray::eval_trait<Arg>::type>::value
150 template <
typename Arg_,
typename = std::enable_if_t<std::is_same<
156 return invoke(cast_to_result,
invoke(cast_to_eval, arg));
170 template <
typename Result,
typename Arg,
typename Enabler>
177 template <
typename Arg,
typename Result =
typename TiledArray::eval_trait<std::decay_t<Arg>>::type>
185 #endif // TILEDARRAY_TILE_INTERFACE_CAST_H__INCLUDED
auto invoke_cast(Arg &&arg)
auto operator()(Arg_ &&arg) const
Result result_type
Result tile type.
Arg argument_type
Argument tile type.
Result result_type
Result tile type.
Arg argument_type
Argument tile type.
auto operator()(Arg_ &&arg) const
Tile cast operation.