20 #ifndef TPIE_PIPELINING_NODE_TRAITS_H
21 #define TPIE_PIPELINING_NODE_TRAITS_H
23 #include <type_traits>
27 namespace pipelining {
38 typedef typename remove<T>::type type;
43 typedef typename remove<T>::type type;
48 typedef typename remove<T>::type type;
54 template <
typename ClassType,
typename ArgType>
62 template <
typename ClassType,
typename RetType>
68 using void_if_valid = void;
76 static yes& test(void_if_valid<typename C::item_type> *);
81 static const bool value =
sizeof(test<T>(
nullptr)) ==
sizeof(yes);
90 static yes& test(void_if_valid<
typename push_traits<decltype(&C::push)>::type> *);
95 static const bool value =
sizeof(test<T>(
nullptr)) ==
sizeof(yes);
103 template <
typename C>
104 static yes& test(void_if_valid<
typename pull_traits<decltype(&C::pull)>::type> *);
107 static no& test(...);
109 static const bool value =
sizeof(test<T>(
nullptr)) ==
sizeof(yes);
112 template <
typename T,
typename default_type,
bool has_push_method,
bool has_item_type>
114 typedef default_type type;
117 template <
typename T,
typename default_type,
bool has_push_method>
119 typedef typename T::item_type type;
122 template <
typename T,
typename default_type>
125 typedef typename std::decay<type_>::type type;
128 template <
typename T,
typename default_type,
bool has_push_method,
bool has_item_type>
130 typedef default_type type;
133 template <
typename T,
typename default_type,
bool has_pull_method>
135 typedef typename T::item_type type;
138 template <
typename T,
typename default_type>
141 typedef typename std::decay<type_>::type type;
151 template <
typename T,
typename default_type =
void>
153 typedef typename std::decay<T>::type node_type;
155 static_assert(!std::is_void<type>::value,
"Could not deduce push type.");
158 template <
typename T,
typename default_type =
void>
160 typedef typename std::decay<T>::type node_type;
162 static_assert(!std::is_void<type>::value,
"Could not deduce pull type.");
171 #endif // TPIE_PIPELINING_NODE_TRAITS_H
Class to deduce the item_type of a node of type T.