1// __ _____ _____ _____
2// __| | __| | | | JSON for Modern C++
3// | | |__ | | | | | | version 3.11.3
4// |_____|_____|_____|_|___| https://github.com/nlohmann/json
5//
6// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
7// SPDX-License-Identifier: MIT
8
9#pragma once
10
11#include <iterator> // random_access_iterator_tag
12
13#include <nlohmann/detail/abi_macros.hpp>
14#include <nlohmann/detail/meta/void_t.hpp>
15#include <nlohmann/detail/meta/cpp_future.hpp>
16
17NLOHMANN_JSON_NAMESPACE_BEGIN
18namespace detail
19{
20
21template<typename It, typename = void>
22struct iterator_types {};
23
24template<typename It>
25struct iterator_types <
26 It,
27 void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
28 typename It::reference, typename It::iterator_category >>
29{
30 using difference_type = typename It::difference_type;
31 using value_type = typename It::value_type;
32 using pointer = typename It::pointer;
33 using reference = typename It::reference;
34 using iterator_category = typename It::iterator_category;
35};
36
37// This is required as some compilers implement std::iterator_traits in a way that
38// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341.
39template<typename T, typename = void>
40struct iterator_traits
41{
42};
43
44template<typename T>
45struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
46 : iterator_types<T>
47{
48};
49
50template<typename T>
51struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
52{
53 using iterator_category = std::random_access_iterator_tag;
54 using value_type = T;
55 using difference_type = ptrdiff_t;
56 using pointer = T*;
57 using reference = T&;
58};
59
60} // namespace detail
61NLOHMANN_JSON_NAMESPACE_END
62