20 #ifndef TPIE_PIPELINING_NODE_TRAITS_H
21 #define TPIE_PIPELINING_NODE_TRAITS_H
23 #include <type_traits>
35 typedef typename remove<T>::type type;
40 typedef typename remove<T>::type type;
45 typedef typename remove<T>::type type;
51 template <
typename ClassType,
typename ArgType>
59 template <
typename ClassType,
typename RetType>
65 using void_if_valid = void;
73 static yes& test(void_if_valid<typename C::item_type> *);
78 static const bool value =
sizeof(test<T>(
nullptr)) ==
sizeof(yes);
87 static yes& test(void_if_valid<
typename push_traits<decltype(&C::push)>::type> *);
92 static const bool value =
sizeof(test<T>(
nullptr)) ==
sizeof(yes);
100 template <
typename C>
101 static yes& test(void_if_valid<
typename pull_traits<decltype(&C::pull)>::type> *);
104 static no& test(...);
106 static const bool value =
sizeof(test<T>(
nullptr)) ==
sizeof(yes);
109 template <
typename T,
typename default_type,
bool has_push_method,
bool has_item_type>
111 typedef default_type type;
114 template <
typename T,
typename default_type,
bool has_push_method>
116 typedef typename T::item_type type;
119 template <
typename T,
typename default_type>
121 typedef typename push_traits<decltype(&T::push)>::type type_;
122 typedef typename std::decay<type_>::type type;
125 template <
typename T,
typename default_type,
bool has_push_method,
bool has_item_type>
127 typedef default_type type;
130 template <
typename T,
typename default_type,
bool has_pull_method>
132 typedef typename T::item_type type;
135 template <
typename T,
typename default_type>
137 typedef typename pull_traits<decltype(&T::pull)>::type type_;
138 typedef typename std::decay<type_>::type type;
141 struct pull_type_base_tag;
143 template <
typename T,
template <
typename>
typename map>
146 template <
template <
typename>
typename map>
157 template <
typename T,
typename default_type =
void>
159 typedef typename std::decay<T>::type node_type;
161 static_assert(!std::is_void<type>::value,
"Could not deduce push type.");
164 template <
typename T,
typename default_type =
void>
166 typedef typename std::decay<T>::type node_type;
168 static_assert(!std::is_void<type>::value,
"Could not deduce pull type.");
172 template <
typename T>
173 using push_type_map_identity = T;
175 template <
typename T,
template <
typename>
typename map = push_type_map_identity>
180 #endif // TPIE_PIPELINING_NODE_TRAITS_H