8 #include <nlohmann/detail/macro_scope.hpp>
10 #include <nlohmann/detail/iterators/iterator_traits.hpp>
11 #include <nlohmann/detail/meta/call_std/begin.hpp>
12 #include <nlohmann/detail/meta/call_std/end.hpp>
13 #include <nlohmann/detail/meta/cpp_future.hpp>
14 #include <nlohmann/detail/meta/detected.hpp>
15 #include <nlohmann/json_fwd.hpp>
44 NLOHMANN_BASIC_JSON_TPL_DECLARATION
65 using mapped_type_t =
typename T::mapped_type;
68 using key_type_t =
typename T::key_type;
71 using value_type_t =
typename T::value_type;
74 using difference_type_t =
typename T::difference_type;
77 using pointer_t =
typename T::pointer;
80 using reference_t =
typename T::reference;
83 using iterator_category_t =
typename T::iterator_category;
85 template<
typename T,
typename... Args>
86 using to_json_function = decltype(T::to_json(std::declval<Args>()...));
88 template<
typename T,
typename... Args>
89 using from_json_function = decltype(T::from_json(std::declval<Args>()...));
91 template<
typename T,
typename U>
92 using get_template_function = decltype(std::declval<T>().
template get<U>());
95 template<
typename BasicJsonType,
typename T,
typename =
void>
102 template <
typename BasicJsonType,
typename T>
105 static constexpr
bool value = is_detected<get_template_function, const BasicJsonType&, T>::value;
108 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&,
156 template<
class B1,
class... Bn>
158 : std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};
161 template<
class B>
struct negation : std::integral_constant < bool, !B::value > { };
166 template <
typename T>
169 template <
typename T1,
typename T2>
171 :
conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
173 template <
typename T1,
typename T2>
175 :
conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
177 template <
typename... Ts>
181 template <
typename... Ts>
186 template <
typename T,
typename... Args>
189 template <
typename T1,
typename T2>
192 template <
typename T1,
typename T2>
195 template <
typename... Ts>
198 template <
typename... Ts>
202 template<
typename T,
typename =
void>
212 static constexpr
auto value =
213 is_detected<value_type_t, traits>::value &&
214 is_detected<difference_type_t, traits>::value &&
215 is_detected<pointer_t, traits>::value &&
216 is_detected<iterator_category_t, traits>::value &&
217 is_detected<reference_t, traits>::value;
224 using t_ref =
typename std::add_lvalue_reference<T>::type;
226 using iterator = detected_t<result_of_begin, t_ref>;
227 using sentinel = detected_t<result_of_end, t_ref>;
232 static constexpr
auto is_iterator_begin =
236 static constexpr
bool value = !std::is_same<iterator, nonesuch>::value && !std::is_same<sentinel, nonesuch>::value && is_iterator_begin;
240 using iterator_t = enable_if_t<is_range<R>::value, result_of_begin<decltype(std::declval<R&>())>>;
243 using range_value_t = value_type_t<iterator_traits<iterator_t<T>>>;
249 template<
typename T,
typename =
void>
255 template<
typename BasicJsonType,
typename CompatibleObjectType,
259 template<
typename BasicJsonType,
typename CompatibleObjectType>
261 BasicJsonType, CompatibleObjectType,
262 enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::
value&&
263 is_detected<key_type_t, CompatibleObjectType>::value >>
265 using object_t =
typename BasicJsonType::object_t;
268 static constexpr
bool value =
270 typename CompatibleObjectType::key_type>::value &&
272 typename CompatibleObjectType::mapped_type>::value;
275 template<
typename BasicJsonType,
typename CompatibleObjectType>
279 template<
typename BasicJsonType,
typename ConstructibleObjectType,
283 template<
typename BasicJsonType,
typename ConstructibleObjectType>
285 BasicJsonType, ConstructibleObjectType,
286 enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::
value&&
287 is_detected<key_type_t, ConstructibleObjectType>::value >>
289 using object_t =
typename BasicJsonType::object_t;
291 static constexpr
bool value =
293 (std::is_move_assignable<ConstructibleObjectType>::value ||
294 std::is_copy_assignable<ConstructibleObjectType>::value) &&
296 typename object_t::key_type>::
value &&
298 typename object_t::mapped_type,
299 typename ConstructibleObjectType::mapped_type >::
value)) ||
301 typename ConstructibleObjectType::mapped_type>::
value ||
304 typename ConstructibleObjectType::mapped_type >::
value);
307 template<
typename BasicJsonType,
typename ConstructibleObjectType>
310 ConstructibleObjectType> {};
312 template<
typename BasicJsonType,
typename CompatibleStringType,
316 template<
typename BasicJsonType,
typename CompatibleStringType>
318 BasicJsonType, CompatibleStringType,
319 enable_if_t<is_detected_convertible<typename BasicJsonType::string_t::value_type,
321 CompatibleStringType>::value >>
323 static constexpr
auto value =
327 template<
typename BasicJsonType,
typename ConstructibleStringType>
331 template<
typename BasicJsonType,
typename ConstructibleStringType,
335 template<
typename BasicJsonType,
typename ConstructibleStringType>
337 BasicJsonType, ConstructibleStringType,
338 enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,
339 value_type_t, ConstructibleStringType>::value >>
341 static constexpr
auto value =
343 typename BasicJsonType::string_t>::value;
346 template<
typename BasicJsonType,
typename ConstructibleStringType>
350 template<
typename BasicJsonType,
typename CompatibleArrayType,
typename =
void>
353 template<
typename BasicJsonType,
typename CompatibleArrayType>
355 BasicJsonType, CompatibleArrayType,
357 is_detected<iterator_t, CompatibleArrayType>::
value&&
358 is_iterator_traits<iterator_traits<detected_t<iterator_t, CompatibleArrayType>>>::value >>
360 static constexpr
bool value =
362 range_value_t<CompatibleArrayType>>::value;
365 template<
typename BasicJsonType,
typename CompatibleArrayType>
369 template<
typename BasicJsonType,
typename ConstructibleArrayType,
typename =
void>
372 template<
typename BasicJsonType,
typename ConstructibleArrayType>
374 BasicJsonType, ConstructibleArrayType,
375 enable_if_t<std::is_same<ConstructibleArrayType,
376 typename BasicJsonType::value_type>::value >>
379 template<
typename BasicJsonType,
typename ConstructibleArrayType>
381 BasicJsonType, ConstructibleArrayType,
382 enable_if_t < !std::is_same<ConstructibleArrayType,
383 typename BasicJsonType::value_type>::value&&
386 (std::is_move_assignable<ConstructibleArrayType>::value ||
387 std::is_copy_assignable<ConstructibleArrayType>::value)&&
388 is_detected<iterator_t, ConstructibleArrayType>::value&&
389 is_iterator_traits<iterator_traits<detected_t<iterator_t, ConstructibleArrayType>>>::value&&
390 is_detected<range_value_t, ConstructibleArrayType>::value&&
392 detected_t<range_value_t, ConstructibleArrayType >>::value >>
394 using value_type = range_value_t<ConstructibleArrayType>;
396 static constexpr
bool value =
397 std::is_same<value_type,
398 typename BasicJsonType::array_t::value_type>::value ||
400 value_type>::value ||
406 template<
typename BasicJsonType,
typename ConstructibleArrayType>
410 template<
typename RealIntegerType,
typename CompatibleNumberIntegerType,
414 template<
typename RealIntegerType,
typename CompatibleNumberIntegerType>
416 RealIntegerType, CompatibleNumberIntegerType,
417 enable_if_t < std::is_integral<RealIntegerType>::value&&
418 std::is_integral<CompatibleNumberIntegerType>::value&&
419 !std::is_same<bool, CompatibleNumberIntegerType>::value >>
422 using RealLimits = std::numeric_limits<RealIntegerType>;
423 using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>;
425 static constexpr
auto value =
427 CompatibleNumberIntegerType>::value &&
428 CompatibleLimits::is_integer &&
429 RealLimits::is_signed == CompatibleLimits::is_signed;
432 template<
typename RealIntegerType,
typename CompatibleNumberIntegerType>
435 CompatibleNumberIntegerType> {};
437 template<
typename BasicJsonType,
typename CompatibleType,
typename =
void>
440 template<
typename BasicJsonType,
typename CompatibleType>
442 BasicJsonType, CompatibleType,
445 static constexpr
bool value =
449 template<
typename BasicJsonType,
typename CompatibleType>
453 template<
typename T1,
typename T2>
456 template<
typename T1,
typename... Args>
461 template <
typename T>
471 template <
typename C>
static one test( decltype(&C::capacity) ) ;
472 template <
typename C>
static two test(...);
474 enum { value =
sizeof(test<T>(
nullptr)) ==
sizeof(
char) };
478 template < typename T, typename U, enable_if_t < !std::is_same<T, U>::value,
int > = 0 >
479 T conditional_static_cast(U value)
481 return static_cast<T
>(value);
484 template<typename T, typename U, enable_if_t<std::is_same<T, U>::value,
int> = 0>
485 T conditional_static_cast(U value)
Definition: json_ref.hpp:14
@ value
the parser finished reading a JSON value
namespace for Niels Lohmann
Definition: adl_serializer.hpp:12
Definition: type_traits.hpp:155
Definition: type_traits.hpp:154
Definition: type_traits.hpp:96
Definition: type_traits.hpp:121
Definition: type_traits.hpp:136
Definition: type_traits.hpp:42
Definition: type_traits.hpp:351
Definition: type_traits.hpp:367
Definition: type_traits.hpp:412
Definition: type_traits.hpp:435
Definition: type_traits.hpp:257
Definition: type_traits.hpp:277
Definition: type_traits.hpp:314
Definition: type_traits.hpp:329
Definition: type_traits.hpp:438
Definition: type_traits.hpp:451
Definition: type_traits.hpp:250
Definition: type_traits.hpp:370
Definition: type_traits.hpp:408
Definition: type_traits.hpp:281
Definition: type_traits.hpp:310
Definition: type_traits.hpp:333
Definition: type_traits.hpp:348
Definition: type_traits.hpp:454
Definition: type_traits.hpp:187
Definition: type_traits.hpp:167
Definition: type_traits.hpp:104
Definition: type_traits.hpp:203
Definition: type_traits.hpp:55
Definition: type_traits.hpp:467
Definition: type_traits.hpp:463
Definition: type_traits.hpp:222
Definition: iterator_traits.hpp:32
Definition: type_traits.hpp:161