1 #ifndef GENESIS_UTILS_CORE_TYPE_TRAITS_H_
2 #define GENESIS_UTILS_CORE_TYPE_TRAITS_H_
35 #include <type_traits>
49 template <
typename... >
80 template <
class T,
typename =
void>
100 <T, typename std::enable_if<
102 std::input_iterator_tag, typename std::iterator_traits<T>::iterator_category
105 std::output_iterator_tag, typename std::iterator_traits<T>::iterator_category
107 >::type> : std::true_type {};
118 template <
class T,
class =
void>
128 <T, typename std::enable_if<
130 std::input_iterator_tag, typename std::iterator_traits<T>::iterator_category
132 >::type> : std::true_type {};
143 template <
class T,
class =
void>
153 <T, typename std::enable_if<
155 std::output_iterator_tag, typename std::iterator_traits<T>::iterator_category
157 >::type> : std::true_type {};
168 template <
class T,
class =
void>
178 <T, typename std::enable_if<
180 std::forward_iterator_tag, typename std::iterator_traits<T>::iterator_category
182 >::type> : std::true_type {};
193 template <
class T,
class =
void>
203 <T, typename std::enable_if<
205 std::bidirectional_iterator_tag, typename std::iterator_traits<T>::iterator_category
207 >::type> : std::true_type {};
218 template <
class T,
class =
void>
228 <T, typename std::enable_if<
230 std::random_access_iterator_tag, typename std::iterator_traits<T>::iterator_category
232 >::type> : std::true_type {};
242 template <
class T,
class =
void>
247 void_t<decltype(++std::declval<T&>()),
248 decltype(*std::declval<T&>()),
249 decltype(std::declval<T&>() == std::declval<T&>())>>
255 #endif // include guard