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 <cstdint> // size_t |
12 | #include <utility> // declval |
13 | #include <string> // string |
14 | |
15 | #include <nlohmann/detail/abi_macros.hpp> |
16 | #include <nlohmann/detail/meta/detected.hpp> |
17 | #include <nlohmann/detail/meta/type_traits.hpp> |
18 | |
19 | NLOHMANN_JSON_NAMESPACE_BEGIN |
20 | namespace detail |
21 | { |
22 | |
23 | template<typename T> |
24 | using null_function_t = decltype(std::declval<T&>().null()); |
25 | |
26 | template<typename T> |
27 | using boolean_function_t = |
28 | decltype(std::declval<T&>().boolean(std::declval<bool>())); |
29 | |
30 | template<typename T, typename Integer> |
31 | using number_integer_function_t = |
32 | decltype(std::declval<T&>().number_integer(std::declval<Integer>())); |
33 | |
34 | template<typename T, typename Unsigned> |
35 | using number_unsigned_function_t = |
36 | decltype(std::declval<T&>().number_unsigned(std::declval<Unsigned>())); |
37 | |
38 | template<typename T, typename Float, typename String> |
39 | using number_float_function_t = decltype(std::declval<T&>().number_float( |
40 | std::declval<Float>(), std::declval<const String&>())); |
41 | |
42 | template<typename T, typename String> |
43 | using string_function_t = |
44 | decltype(std::declval<T&>().string(std::declval<String&>())); |
45 | |
46 | template<typename T, typename Binary> |
47 | using binary_function_t = |
48 | decltype(std::declval<T&>().binary(std::declval<Binary&>())); |
49 | |
50 | template<typename T> |
51 | using start_object_function_t = |
52 | decltype(std::declval<T&>().start_object(std::declval<std::size_t>())); |
53 | |
54 | template<typename T, typename String> |
55 | using key_function_t = |
56 | decltype(std::declval<T&>().key(std::declval<String&>())); |
57 | |
58 | template<typename T> |
59 | using end_object_function_t = decltype(std::declval<T&>().end_object()); |
60 | |
61 | template<typename T> |
62 | using start_array_function_t = |
63 | decltype(std::declval<T&>().start_array(std::declval<std::size_t>())); |
64 | |
65 | template<typename T> |
66 | using end_array_function_t = decltype(std::declval<T&>().end_array()); |
67 | |
68 | template<typename T, typename Exception> |
69 | using parse_error_function_t = decltype(std::declval<T&>().parse_error( |
70 | std::declval<std::size_t>(), std::declval<const std::string&>(), |
71 | std::declval<const Exception&>())); |
72 | |
73 | template<typename SAX, typename BasicJsonType> |
74 | struct is_sax |
75 | { |
76 | private: |
77 | static_assert(is_basic_json<BasicJsonType>::value, |
78 | "BasicJsonType must be of type basic_json<...>" ); |
79 | |
80 | using number_integer_t = typename BasicJsonType::number_integer_t; |
81 | using number_unsigned_t = typename BasicJsonType::number_unsigned_t; |
82 | using number_float_t = typename BasicJsonType::number_float_t; |
83 | using string_t = typename BasicJsonType::string_t; |
84 | using binary_t = typename BasicJsonType::binary_t; |
85 | using exception_t = typename BasicJsonType::exception; |
86 | |
87 | public: |
88 | static constexpr bool value = |
89 | is_detected_exact<bool, null_function_t, SAX>::value && |
90 | is_detected_exact<bool, boolean_function_t, SAX>::value && |
91 | is_detected_exact<bool, number_integer_function_t, SAX, number_integer_t>::value && |
92 | is_detected_exact<bool, number_unsigned_function_t, SAX, number_unsigned_t>::value && |
93 | is_detected_exact<bool, number_float_function_t, SAX, number_float_t, string_t>::value && |
94 | is_detected_exact<bool, string_function_t, SAX, string_t>::value && |
95 | is_detected_exact<bool, binary_function_t, SAX, binary_t>::value && |
96 | is_detected_exact<bool, start_object_function_t, SAX>::value && |
97 | is_detected_exact<bool, key_function_t, SAX, string_t>::value && |
98 | is_detected_exact<bool, end_object_function_t, SAX>::value && |
99 | is_detected_exact<bool, start_array_function_t, SAX>::value && |
100 | is_detected_exact<bool, end_array_function_t, SAX>::value && |
101 | is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value; |
102 | }; |
103 | |
104 | template<typename SAX, typename BasicJsonType> |
105 | struct is_sax_static_asserts |
106 | { |
107 | private: |
108 | static_assert(is_basic_json<BasicJsonType>::value, |
109 | "BasicJsonType must be of type basic_json<...>" ); |
110 | |
111 | using number_integer_t = typename BasicJsonType::number_integer_t; |
112 | using number_unsigned_t = typename BasicJsonType::number_unsigned_t; |
113 | using number_float_t = typename BasicJsonType::number_float_t; |
114 | using string_t = typename BasicJsonType::string_t; |
115 | using binary_t = typename BasicJsonType::binary_t; |
116 | using exception_t = typename BasicJsonType::exception; |
117 | |
118 | public: |
119 | static_assert(is_detected_exact<bool, null_function_t, SAX>::value, |
120 | "Missing/invalid function: bool null()" ); |
121 | static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value, |
122 | "Missing/invalid function: bool boolean(bool)" ); |
123 | static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value, |
124 | "Missing/invalid function: bool boolean(bool)" ); |
125 | static_assert( |
126 | is_detected_exact<bool, number_integer_function_t, SAX, |
127 | number_integer_t>::value, |
128 | "Missing/invalid function: bool number_integer(number_integer_t)" ); |
129 | static_assert( |
130 | is_detected_exact<bool, number_unsigned_function_t, SAX, |
131 | number_unsigned_t>::value, |
132 | "Missing/invalid function: bool number_unsigned(number_unsigned_t)" ); |
133 | static_assert(is_detected_exact<bool, number_float_function_t, SAX, |
134 | number_float_t, string_t>::value, |
135 | "Missing/invalid function: bool number_float(number_float_t, const string_t&)" ); |
136 | static_assert( |
137 | is_detected_exact<bool, string_function_t, SAX, string_t>::value, |
138 | "Missing/invalid function: bool string(string_t&)" ); |
139 | static_assert( |
140 | is_detected_exact<bool, binary_function_t, SAX, binary_t>::value, |
141 | "Missing/invalid function: bool binary(binary_t&)" ); |
142 | static_assert(is_detected_exact<bool, start_object_function_t, SAX>::value, |
143 | "Missing/invalid function: bool start_object(std::size_t)" ); |
144 | static_assert(is_detected_exact<bool, key_function_t, SAX, string_t>::value, |
145 | "Missing/invalid function: bool key(string_t&)" ); |
146 | static_assert(is_detected_exact<bool, end_object_function_t, SAX>::value, |
147 | "Missing/invalid function: bool end_object()" ); |
148 | static_assert(is_detected_exact<bool, start_array_function_t, SAX>::value, |
149 | "Missing/invalid function: bool start_array(std::size_t)" ); |
150 | static_assert(is_detected_exact<bool, end_array_function_t, SAX>::value, |
151 | "Missing/invalid function: bool end_array()" ); |
152 | static_assert( |
153 | is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value, |
154 | "Missing/invalid function: bool parse_error(std::size_t, const " |
155 | "std::string&, const exception&)" ); |
156 | }; |
157 | |
158 | } // namespace detail |
159 | NLOHMANN_JSON_NAMESPACE_END |
160 | |