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>
44NLOHMANN_BASIC_JSON_TPL_DECLARATION
65using mapped_type_t =
typename T::mapped_type;
68using key_type_t =
typename T::key_type;
71using value_type_t =
typename T::value_type;
74using difference_type_t =
typename T::difference_type;
77using pointer_t =
typename T::pointer;
80using reference_t =
typename T::reference;
83using iterator_category_t =
typename T::iterator_category;
85template<
typename T,
typename... Args>
86using to_json_function =
decltype(T::to_json(std::declval<Args>()...));
88template<
typename T,
typename... Args>
89using from_json_function =
decltype(T::from_json(std::declval<Args>()...));
91template<
typename T,
typename U>
92using get_template_function =
decltype(std::declval<T>().template get<U>());
95template<
typename BasicJsonType,
typename T,
typename =
void>
102template <
typename BasicJsonType,
typename T>
105 static constexpr bool value = is_detected<get_template_function, const BasicJsonType&, T>::value;
108template<
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;
120template<
typename BasicJsonType,
typename T,
typename =
void>
123template<
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,
135template<
typename BasicJsonType,
typename T,
typename =
void>
138template<
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&,
156template<
class B1,
class... Bn>
158: std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};
161template<
class B>
struct negation : std::integral_constant < bool, !B::value > { };
169template <
typename T1,
typename T2>
171 :
conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
173template <
typename T1,
typename T2>
175 :
conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
177template <
typename... Ts>
181template <
typename... Ts>
186template <
typename T,
typename... Args>
189template <
typename T1,
typename T2>
192template <
typename T1,
typename T2>
195template <
typename... Ts>
198template <
typename... Ts>
202template<
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;
240using iterator_t = enable_if_t<is_range<R>::value, result_of_begin<decltype(std::declval<R&>())>>;
243using range_value_t = value_type_t<iterator_traits<iterator_t<T>>>;
249template<
typename T,
typename =
void>
255template<
typename BasicJsonType,
typename CompatibleObjectType,
259template<
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;
275template<
typename BasicJsonType,
typename CompatibleObjectType>
279template<
typename BasicJsonType,
typename ConstructibleObjectType,
283template<
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);
307template<
typename BasicJsonType,
typename ConstructibleObjectType>
310 ConstructibleObjectType> {};
312template<
typename BasicJsonType,
typename CompatibleStringType,
316template<
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 =
327template<
typename BasicJsonType,
typename ConstructibleStringType>
331template<
typename BasicJsonType,
typename ConstructibleStringType,
335template<
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;
346template<
typename BasicJsonType,
typename ConstructibleStringType>
350template<
typename BasicJsonType,
typename CompatibleArrayType,
typename =
void>
353template<
typename BasicJsonType,
typename CompatibleArrayType>
355 BasicJsonType, CompatibleArrayType,
357 is_detected<iterator_t, CompatibleArrayType>::
value&&
360 static constexpr bool value =
362 range_value_t<CompatibleArrayType>>
::value;
365template<
typename BasicJsonType,
typename CompatibleArrayType>
369template<
typename BasicJsonType,
typename ConstructibleArrayType,
typename =
void>
372template<
typename BasicJsonType,
typename ConstructibleArrayType>
374 BasicJsonType, ConstructibleArrayType,
375 enable_if_t<std::is_same<ConstructibleArrayType,
376 typename BasicJsonType::value_type>
::value >>
379template<
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)&&
388is_detected<iterator_t, ConstructibleArrayType>
::value&&
390is_detected<range_value_t, ConstructibleArrayType>
::value&&
392detected_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 ||
406template<
typename BasicJsonType,
typename ConstructibleArrayType>
410template<
typename RealIntegerType,
typename CompatibleNumberIntegerType,
414template<
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;
432template<
typename RealIntegerType,
typename CompatibleNumberIntegerType>
435 CompatibleNumberIntegerType> {};
437template<
typename BasicJsonType,
typename CompatibleType,
typename =
void>
440template<
typename BasicJsonType,
typename CompatibleType>
442 BasicJsonType, CompatibleType,
445 static constexpr bool value =
449template<
typename BasicJsonType,
typename CompatibleType>
453template<
typename T1,
typename T2>
456template<
typename T1,
typename... Args>
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) };
478template < typename T, typename U, enable_if_t < !std::is_same<T, U>::value,
int > = 0 >
479T conditional_static_cast(U
value)
481 return static_cast<T
>(
value);
484template<typename T, typename U, enable_if_t<std::is_same<T, U>::value,
int> = 0>
485T 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: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