• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //     __ _____ _____ _____
2 //  __|  |   __|     |   | |  JSON for Modern C++
3 // |  |  |__   |  |  | | | |  version 3.11.2
4 // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5 //
6 // SPDX-FileCopyrightText: 2013-2022 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