5 #include <nlohmann/detail/meta/void_t.hpp>
6 #include <nlohmann/detail/meta/cpp_future.hpp>
12 template <
typename It,
typename =
void>
13 struct iterator_types {};
15 template <
typename It>
16 struct iterator_types <
18 void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
19 typename It::reference, typename It::iterator_category >>
21 using difference_type =
typename It::difference_type;
22 using value_type =
typename It::value_type;
23 using pointer =
typename It::pointer;
24 using reference =
typename It::reference;
25 using iterator_category =
typename It::iterator_category;
30 template <
typename T,
typename =
void>
31 struct iterator_traits
36 struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
42 struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
44 using iterator_category = std::random_access_iterator_tag;
46 using difference_type = ptrdiff_t;