7 #include <nlohmann/detail/iterators/iterator_traits.hpp>
8 #include <nlohmann/detail/macro_scope.hpp>
9 #include <nlohmann/detail/meta/cpp_future.hpp>
10 #include <nlohmann/detail/meta/detected.hpp>
11 #include <nlohmann/json_fwd.hpp>
40 NLOHMANN_BASIC_JSON_TPL_DECLARATION
61 using mapped_type_t =
typename T::mapped_type;
64 using key_type_t =
typename T::key_type;
67 using value_type_t =
typename T::value_type;
70 using difference_type_t =
typename T::difference_type;
73 using pointer_t =
typename T::pointer;
76 using reference_t =
typename T::reference;
79 using iterator_category_t =
typename T::iterator_category;
82 using iterator_t =
typename T::iterator;
84 template<
typename T,
typename... Args>
85 using to_json_function = decltype(T::to_json(std::declval<Args>()...));
87 template<
typename T,
typename... Args>
88 using from_json_function = decltype(T::from_json(std::declval<Args>()...));
90 template<
typename T,
typename U>
91 using get_template_function = decltype(std::declval<T>().
template get<U>());
94 template<
typename BasicJsonType,
typename T,
typename =
void>
101 template <
typename BasicJsonType,
typename T>
104 static constexpr
bool value = is_detected<get_template_function, const BasicJsonType&, T>::value;
107 template<
typename BasicJsonType,
typename T>
111 using serializer =
typename BasicJsonType::template json_serializer<T, void>;
113 static constexpr
bool value =
114 is_detected_exact<void, from_json_function, serializer,
115 const BasicJsonType&, T&>::value;
120 template<
typename BasicJsonType,
typename T,
typename =
void>
123 template<
typename BasicJsonType,
typename T>
126 using serializer =
typename BasicJsonType::template json_serializer<T, void>;
128 static constexpr
bool value =
129 is_detected_exact<T, from_json_function, serializer,
130 const BasicJsonType&>::value;
135 template<
typename BasicJsonType,
typename T,
typename =
void>
138 template<
typename BasicJsonType,
typename T>
141 using serializer =
typename BasicJsonType::template json_serializer<T, void>;
143 static constexpr
bool value =
144 is_detected_exact<void, to_json_function, serializer, BasicJsonType&,
153 template<
typename T,
typename =
void>
163 static constexpr
auto value =
164 is_detected<value_type_t, traits>::value &&
165 is_detected<difference_type_t, traits>::value &&
166 is_detected<pointer_t, traits>::value &&
167 is_detected<iterator_category_t, traits>::value &&
168 is_detected<reference_t, traits>::value;
173 template<
typename T,
typename =
void>
179 template<
typename BasicJsonType,
typename CompatibleObjectType,
183 template<
typename BasicJsonType,
typename CompatibleObjectType>
185 BasicJsonType, CompatibleObjectType,
186 enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::
value&&
187 is_detected<key_type_t, CompatibleObjectType>::value >>
190 using object_t =
typename BasicJsonType::object_t;
193 static constexpr
bool value =
194 std::is_constructible<
typename object_t::key_type,
195 typename CompatibleObjectType::key_type>::value &&
196 std::is_constructible<
typename object_t::mapped_type,
197 typename CompatibleObjectType::mapped_type>::value;
200 template<
typename BasicJsonType,
typename CompatibleObjectType>
204 template<
typename BasicJsonType,
typename ConstructibleObjectType,
208 template<
typename BasicJsonType,
typename ConstructibleObjectType>
210 BasicJsonType, ConstructibleObjectType,
211 enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::
value&&
212 is_detected<key_type_t, ConstructibleObjectType>::value >>
214 using object_t =
typename BasicJsonType::object_t;
216 static constexpr
bool value =
217 (std::is_default_constructible<ConstructibleObjectType>::value &&
218 (std::is_move_assignable<ConstructibleObjectType>::value ||
219 std::is_copy_assignable<ConstructibleObjectType>::value) &&
220 (std::is_constructible<
typename ConstructibleObjectType::key_type,
221 typename object_t::key_type>::
value &&
223 typename object_t::mapped_type,
224 typename ConstructibleObjectType::mapped_type >::
value)) ||
226 typename ConstructibleObjectType::mapped_type>::
value ||
229 typename ConstructibleObjectType::mapped_type >::
value);
232 template<
typename BasicJsonType,
typename ConstructibleObjectType>
235 ConstructibleObjectType> {};
237 template<
typename BasicJsonType,
typename CompatibleStringType,
241 template<
typename BasicJsonType,
typename CompatibleStringType>
243 BasicJsonType, CompatibleStringType,
244 enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,
245 value_type_t, CompatibleStringType>::value >>
247 static constexpr
auto value =
248 std::is_constructible<typename BasicJsonType::string_t, CompatibleStringType>::value;
251 template<
typename BasicJsonType,
typename ConstructibleStringType>
255 template<
typename BasicJsonType,
typename ConstructibleStringType,
259 template<
typename BasicJsonType,
typename ConstructibleStringType>
261 BasicJsonType, ConstructibleStringType,
262 enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,
263 value_type_t, ConstructibleStringType>::value >>
265 static constexpr
auto value =
266 std::is_constructible<ConstructibleStringType,
267 typename BasicJsonType::string_t>::value;
270 template<
typename BasicJsonType,
typename ConstructibleStringType>
274 template<
typename BasicJsonType,
typename CompatibleArrayType,
typename =
void>
277 template<
typename BasicJsonType,
typename CompatibleArrayType>
279 BasicJsonType, CompatibleArrayType,
280 enable_if_t < is_detected<value_type_t, CompatibleArrayType>::
value&&
281 is_detected<iterator_t, CompatibleArrayType>::value&&
286 iterator_traits<CompatibleArrayType >>::value >>
288 static constexpr
bool value =
289 std::is_constructible<BasicJsonType,
290 typename CompatibleArrayType::value_type>::value;
293 template<
typename BasicJsonType,
typename CompatibleArrayType>
297 template<
typename BasicJsonType,
typename ConstructibleArrayType,
typename =
void>
300 template<
typename BasicJsonType,
typename ConstructibleArrayType>
302 BasicJsonType, ConstructibleArrayType,
303 enable_if_t<std::is_same<ConstructibleArrayType,
304 typename BasicJsonType::value_type>::value >>
307 template<
typename BasicJsonType,
typename ConstructibleArrayType>
309 BasicJsonType, ConstructibleArrayType,
310 enable_if_t < !std::is_same<ConstructibleArrayType,
311 typename BasicJsonType::value_type>::value&&
312 std::is_default_constructible<ConstructibleArrayType>::value&&
313 (std::is_move_assignable<ConstructibleArrayType>::value ||
314 std::is_copy_assignable<ConstructibleArrayType>::value)&&
315 is_detected<value_type_t, ConstructibleArrayType>::value&&
316 is_detected<iterator_t, ConstructibleArrayType>::value&&
318 detected_t<value_type_t, ConstructibleArrayType >>::value >>
320 static constexpr
bool value =
328 (std::is_same<
typename ConstructibleArrayType::value_type,
329 typename BasicJsonType::array_t::value_type>::value ||
331 typename ConstructibleArrayType::value_type>::value ||
333 BasicJsonType,
typename ConstructibleArrayType::value_type >::value);
336 template<
typename BasicJsonType,
typename ConstructibleArrayType>
340 template<
typename RealIntegerType,
typename CompatibleNumberIntegerType,
344 template<
typename RealIntegerType,
typename CompatibleNumberIntegerType>
346 RealIntegerType, CompatibleNumberIntegerType,
347 enable_if_t < std::is_integral<RealIntegerType>::value&&
348 std::is_integral<CompatibleNumberIntegerType>::value&&
349 !std::is_same<bool, CompatibleNumberIntegerType>::value >>
352 using RealLimits = std::numeric_limits<RealIntegerType>;
353 using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>;
355 static constexpr
auto value =
356 std::is_constructible<RealIntegerType,
357 CompatibleNumberIntegerType>::value &&
358 CompatibleLimits::is_integer &&
359 RealLimits::is_signed == CompatibleLimits::is_signed;
362 template<
typename RealIntegerType,
typename CompatibleNumberIntegerType>
365 CompatibleNumberIntegerType> {};
367 template<
typename BasicJsonType,
typename CompatibleType,
typename =
void>
370 template<
typename BasicJsonType,
typename CompatibleType>
372 BasicJsonType, CompatibleType,
375 static constexpr
bool value =
379 template<
typename BasicJsonType,
typename CompatibleType>
386 template<
class B1,
class... Bn>
388 : std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};
390 template<
typename T1,
typename T2>
393 template<
typename T1,
typename... Args>
Definition: json_ref.hpp:14
@ value
the parser finished reading a JSON value
namespace for Niels Lohmann
Definition: adl_serializer.hpp:9
Definition: type_traits.hpp:385
Definition: type_traits.hpp:384
Definition: type_traits.hpp:95
Definition: type_traits.hpp:121
Definition: type_traits.hpp:136
Definition: type_traits.hpp:38
Definition: type_traits.hpp:275
Definition: type_traits.hpp:295
Definition: type_traits.hpp:342
Definition: type_traits.hpp:365
Definition: type_traits.hpp:181
Definition: type_traits.hpp:202
Definition: type_traits.hpp:239
Definition: type_traits.hpp:253
Definition: type_traits.hpp:368
Definition: type_traits.hpp:381
Definition: type_traits.hpp:174
Definition: type_traits.hpp:298
Definition: type_traits.hpp:338
Definition: type_traits.hpp:206
Definition: type_traits.hpp:235
Definition: type_traits.hpp:257
Definition: type_traits.hpp:272
Definition: type_traits.hpp:391
Definition: type_traits.hpp:103
Definition: type_traits.hpp:154
Definition: type_traits.hpp:51
Definition: iterator_traits.hpp:32