18#ifndef INCLUDE_NLOHMANN_JSON_HPP_
19#define INCLUDE_NLOHMANN_JSON_HPP_
24#include <initializer_list>
60#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
61#if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)
62#if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 3
63#warning "Already included a different version of the library!"
68#define NLOHMANN_JSON_VERSION_MAJOR 3
69#define NLOHMANN_JSON_VERSION_MINOR 11
70#define NLOHMANN_JSON_VERSION_PATCH 3
72#ifndef JSON_DIAGNOSTICS
73#define JSON_DIAGNOSTICS 0
76#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
77#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0
81#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag
83#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS
86#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
87#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp
89#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON
92#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION
93#define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0
97#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b
98#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \
99 NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b)
101#define NLOHMANN_JSON_ABI_TAGS \
102 NLOHMANN_JSON_ABI_TAGS_CONCAT( \
103 NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \
104 NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON)
107#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \
108 _v ## major ## _ ## minor ## _ ## patch
109#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \
110 NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch)
112#if NLOHMANN_JSON_NAMESPACE_NO_VERSION
113#define NLOHMANN_JSON_NAMESPACE_VERSION
115#define NLOHMANN_JSON_NAMESPACE_VERSION \
116 NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \
117 NLOHMANN_JSON_VERSION_MINOR, \
118 NLOHMANN_JSON_VERSION_PATCH)
122#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b
123#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \
124 NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b)
126#ifndef NLOHMANN_JSON_NAMESPACE
127#define NLOHMANN_JSON_NAMESPACE \
128 nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \
129 NLOHMANN_JSON_ABI_TAGS, \
130 NLOHMANN_JSON_NAMESPACE_VERSION)
133#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN
134#define NLOHMANN_JSON_NAMESPACE_BEGIN \
137 inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \
138 NLOHMANN_JSON_ABI_TAGS, \
139 NLOHMANN_JSON_NAMESPACE_VERSION) \
143#ifndef NLOHMANN_JSON_NAMESPACE_END
144#define NLOHMANN_JSON_NAMESPACE_END \
162#include <forward_list>
167#include <type_traits>
168#include <unordered_map>
231#include <type_traits>
276 template<
class Default,
278 template<
class...>
class Op,
286 template<
class Default,
template<
class...>
class Op,
class... Args>
293 template<
template<
class...>
class Op,
class... Args>
296 template<
template<
class...>
class Op,
class... Args>
299 template<
template<
class...>
class Op,
class... Args>
302 template<
class Default,
template<
class...>
class Op,
class... Args>
305 template<
class Default,
template<
class...>
class Op,
class... Args>
308 template<
class Expected,
template<
class...>
class Op,
class... Args>
311 template<
class To,
template<
class...>
class Op,
class... Args>
313 std::is_convertible<
detected_t<Op, Args...>, To>;
334#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15)
335#if defined(JSON_HEDLEY_VERSION)
336#undef JSON_HEDLEY_VERSION
338#define JSON_HEDLEY_VERSION 15
340#if defined(JSON_HEDLEY_STRINGIFY_EX)
341#undef JSON_HEDLEY_STRINGIFY_EX
343#define JSON_HEDLEY_STRINGIFY_EX(x) #x
345#if defined(JSON_HEDLEY_STRINGIFY)
346#undef JSON_HEDLEY_STRINGIFY
348#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x)
350#if defined(JSON_HEDLEY_CONCAT_EX)
351#undef JSON_HEDLEY_CONCAT_EX
353#define JSON_HEDLEY_CONCAT_EX(a,b) a##b
355#if defined(JSON_HEDLEY_CONCAT)
356#undef JSON_HEDLEY_CONCAT
358#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b)
360#if defined(JSON_HEDLEY_CONCAT3_EX)
361#undef JSON_HEDLEY_CONCAT3_EX
363#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c
365#if defined(JSON_HEDLEY_CONCAT3)
366#undef JSON_HEDLEY_CONCAT3
368#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c)
370#if defined(JSON_HEDLEY_VERSION_ENCODE)
371#undef JSON_HEDLEY_VERSION_ENCODE
373#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision))
375#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR)
376#undef JSON_HEDLEY_VERSION_DECODE_MAJOR
378#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000)
380#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR)
381#undef JSON_HEDLEY_VERSION_DECODE_MINOR
383#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000)
385#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION)
386#undef JSON_HEDLEY_VERSION_DECODE_REVISION
388#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000)
390#if defined(JSON_HEDLEY_GNUC_VERSION)
391#undef JSON_HEDLEY_GNUC_VERSION
393#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)
394#define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
395#elif defined(__GNUC__)
396#define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0)
399#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK)
400#undef JSON_HEDLEY_GNUC_VERSION_CHECK
402#if defined(JSON_HEDLEY_GNUC_VERSION)
403#define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
405#define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0)
408#if defined(JSON_HEDLEY_MSVC_VERSION)
409#undef JSON_HEDLEY_MSVC_VERSION
411#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL)
412#define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100)
413#elif defined(_MSC_FULL_VER) && !defined(__ICL)
414#define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10)
415#elif defined(_MSC_VER) && !defined(__ICL)
416#define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0)
419#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK)
420#undef JSON_HEDLEY_MSVC_VERSION_CHECK
422#if !defined(JSON_HEDLEY_MSVC_VERSION)
423#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0)
424#elif defined(_MSC_VER) && (_MSC_VER >= 1400)
425#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch)))
426#elif defined(_MSC_VER) && (_MSC_VER >= 1200)
427#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch)))
429#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor)))
432#if defined(JSON_HEDLEY_INTEL_VERSION)
433#undef JSON_HEDLEY_INTEL_VERSION
435#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL)
436#define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE)
437#elif defined(__INTEL_COMPILER) && !defined(__ICL)
438#define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)
441#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK)
442#undef JSON_HEDLEY_INTEL_VERSION_CHECK
444#if defined(JSON_HEDLEY_INTEL_VERSION)
445#define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
447#define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0)
450#if defined(JSON_HEDLEY_INTEL_CL_VERSION)
451#undef JSON_HEDLEY_INTEL_CL_VERSION
453#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL)
454#define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0)
457#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK)
458#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK
460#if defined(JSON_HEDLEY_INTEL_CL_VERSION)
461#define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
463#define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0)
466#if defined(JSON_HEDLEY_PGI_VERSION)
467#undef JSON_HEDLEY_PGI_VERSION
469#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)
470#define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)
473#if defined(JSON_HEDLEY_PGI_VERSION_CHECK)
474#undef JSON_HEDLEY_PGI_VERSION_CHECK
476#if defined(JSON_HEDLEY_PGI_VERSION)
477#define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
479#define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0)
482#if defined(JSON_HEDLEY_SUNPRO_VERSION)
483#undef JSON_HEDLEY_SUNPRO_VERSION
485#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000)
486#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10)
487#elif defined(__SUNPRO_C)
488#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf)
489#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000)
490#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10)
491#elif defined(__SUNPRO_CC)
492#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf)
495#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK)
496#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK
498#if defined(JSON_HEDLEY_SUNPRO_VERSION)
499#define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
501#define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0)
504#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)
505#undef JSON_HEDLEY_EMSCRIPTEN_VERSION
507#if defined(__EMSCRIPTEN__)
508#define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__)
511#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK)
512#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK
514#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)
515#define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
517#define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0)
520#if defined(JSON_HEDLEY_ARM_VERSION)
521#undef JSON_HEDLEY_ARM_VERSION
523#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION)
524#define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100)
525#elif defined(__CC_ARM) && defined(__ARMCC_VERSION)
526#define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100)
529#if defined(JSON_HEDLEY_ARM_VERSION_CHECK)
530#undef JSON_HEDLEY_ARM_VERSION_CHECK
532#if defined(JSON_HEDLEY_ARM_VERSION)
533#define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
535#define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0)
538#if defined(JSON_HEDLEY_IBM_VERSION)
539#undef JSON_HEDLEY_IBM_VERSION
541#if defined(__ibmxl__)
542#define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__)
543#elif defined(__xlC__) && defined(__xlC_ver__)
544#define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff)
545#elif defined(__xlC__)
546#define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0)
549#if defined(JSON_HEDLEY_IBM_VERSION_CHECK)
550#undef JSON_HEDLEY_IBM_VERSION_CHECK
552#if defined(JSON_HEDLEY_IBM_VERSION)
553#define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
555#define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0)
558#if defined(JSON_HEDLEY_TI_VERSION)
559#undef JSON_HEDLEY_TI_VERSION
562 defined(__TI_COMPILER_VERSION__) && \
564 defined(__TMS470__) || defined(__TI_ARM__) || \
565 defined(__MSP430__) || \
566 defined(__TMS320C2000__) \
568#if (__TI_COMPILER_VERSION__ >= 16000000)
569#define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
573#if defined(JSON_HEDLEY_TI_VERSION_CHECK)
574#undef JSON_HEDLEY_TI_VERSION_CHECK
576#if defined(JSON_HEDLEY_TI_VERSION)
577#define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
579#define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0)
582#if defined(JSON_HEDLEY_TI_CL2000_VERSION)
583#undef JSON_HEDLEY_TI_CL2000_VERSION
585#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__)
586#define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
589#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK)
590#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK
592#if defined(JSON_HEDLEY_TI_CL2000_VERSION)
593#define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
595#define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0)
598#if defined(JSON_HEDLEY_TI_CL430_VERSION)
599#undef JSON_HEDLEY_TI_CL430_VERSION
601#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__)
602#define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
605#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK)
606#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK
608#if defined(JSON_HEDLEY_TI_CL430_VERSION)
609#define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
611#define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0)
614#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)
615#undef JSON_HEDLEY_TI_ARMCL_VERSION
617#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__))
618#define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
621#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK)
622#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK
624#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)
625#define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
627#define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0)
630#if defined(JSON_HEDLEY_TI_CL6X_VERSION)
631#undef JSON_HEDLEY_TI_CL6X_VERSION
633#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__)
634#define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
637#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK)
638#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK
640#if defined(JSON_HEDLEY_TI_CL6X_VERSION)
641#define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
643#define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0)
646#if defined(JSON_HEDLEY_TI_CL7X_VERSION)
647#undef JSON_HEDLEY_TI_CL7X_VERSION
649#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__)
650#define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
653#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK)
654#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK
656#if defined(JSON_HEDLEY_TI_CL7X_VERSION)
657#define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
659#define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0)
662#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)
663#undef JSON_HEDLEY_TI_CLPRU_VERSION
665#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__)
666#define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
669#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK)
670#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK
672#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)
673#define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
675#define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0)
678#if defined(JSON_HEDLEY_CRAY_VERSION)
679#undef JSON_HEDLEY_CRAY_VERSION
682#if defined(_RELEASE_PATCHLEVEL)
683#define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL)
685#define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0)
689#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK)
690#undef JSON_HEDLEY_CRAY_VERSION_CHECK
692#if defined(JSON_HEDLEY_CRAY_VERSION)
693#define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
695#define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0)
698#if defined(JSON_HEDLEY_IAR_VERSION)
699#undef JSON_HEDLEY_IAR_VERSION
701#if defined(__IAR_SYSTEMS_ICC__)
703#define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000))
705#define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0)
709#if defined(JSON_HEDLEY_IAR_VERSION_CHECK)
710#undef JSON_HEDLEY_IAR_VERSION_CHECK
712#if defined(JSON_HEDLEY_IAR_VERSION)
713#define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
715#define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0)
718#if defined(JSON_HEDLEY_TINYC_VERSION)
719#undef JSON_HEDLEY_TINYC_VERSION
721#if defined(__TINYC__)
722#define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100)
725#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK)
726#undef JSON_HEDLEY_TINYC_VERSION_CHECK
728#if defined(JSON_HEDLEY_TINYC_VERSION)
729#define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
731#define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0)
734#if defined(JSON_HEDLEY_DMC_VERSION)
735#undef JSON_HEDLEY_DMC_VERSION
738#define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf)
741#if defined(JSON_HEDLEY_DMC_VERSION_CHECK)
742#undef JSON_HEDLEY_DMC_VERSION_CHECK
744#if defined(JSON_HEDLEY_DMC_VERSION)
745#define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
747#define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0)
750#if defined(JSON_HEDLEY_COMPCERT_VERSION)
751#undef JSON_HEDLEY_COMPCERT_VERSION
753#if defined(__COMPCERT_VERSION__)
754#define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100)
757#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK)
758#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK
760#if defined(JSON_HEDLEY_COMPCERT_VERSION)
761#define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
763#define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0)
766#if defined(JSON_HEDLEY_PELLES_VERSION)
767#undef JSON_HEDLEY_PELLES_VERSION
770#define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0)
773#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK)
774#undef JSON_HEDLEY_PELLES_VERSION_CHECK
776#if defined(JSON_HEDLEY_PELLES_VERSION)
777#define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
779#define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0)
782#if defined(JSON_HEDLEY_MCST_LCC_VERSION)
783#undef JSON_HEDLEY_MCST_LCC_VERSION
785#if defined(__LCC__) && defined(__LCC_MINOR__)
786#define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__)
789#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK)
790#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK
792#if defined(JSON_HEDLEY_MCST_LCC_VERSION)
793#define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
795#define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0)
798#if defined(JSON_HEDLEY_GCC_VERSION)
799#undef JSON_HEDLEY_GCC_VERSION
802 defined(JSON_HEDLEY_GNUC_VERSION) && \
803 !defined(__clang__) && \
804 !defined(JSON_HEDLEY_INTEL_VERSION) && \
805 !defined(JSON_HEDLEY_PGI_VERSION) && \
806 !defined(JSON_HEDLEY_ARM_VERSION) && \
807 !defined(JSON_HEDLEY_CRAY_VERSION) && \
808 !defined(JSON_HEDLEY_TI_VERSION) && \
809 !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \
810 !defined(JSON_HEDLEY_TI_CL430_VERSION) && \
811 !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \
812 !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \
813 !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \
814 !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \
815 !defined(__COMPCERT__) && \
816 !defined(JSON_HEDLEY_MCST_LCC_VERSION)
817#define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION
820#if defined(JSON_HEDLEY_GCC_VERSION_CHECK)
821#undef JSON_HEDLEY_GCC_VERSION_CHECK
823#if defined(JSON_HEDLEY_GCC_VERSION)
824#define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
826#define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0)
829#if defined(JSON_HEDLEY_HAS_ATTRIBUTE)
830#undef JSON_HEDLEY_HAS_ATTRIBUTE
833 defined(__has_attribute) && \
835 (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \
837# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute)
839# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0)
842#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE)
843#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE
845#if defined(__has_attribute)
846#define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)
848#define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
851#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE)
852#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE
854#if defined(__has_attribute)
855#define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)
857#define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
860#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE)
861#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE
864 defined(__has_cpp_attribute) && \
865 defined(__cplusplus) && \
866 (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0))
867#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute)
869#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0)
872#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS)
873#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS
875#if !defined(__cplusplus) || !defined(__has_cpp_attribute)
876#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)
878 !defined(JSON_HEDLEY_PGI_VERSION) && \
879 !defined(JSON_HEDLEY_IAR_VERSION) && \
880 (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \
881 (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0))
882#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute)
884#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)
887#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE)
888#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
890#if defined(__has_cpp_attribute) && defined(__cplusplus)
891#define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)
893#define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
896#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE)
897#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE
899#if defined(__has_cpp_attribute) && defined(__cplusplus)
900#define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)
902#define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
905#if defined(JSON_HEDLEY_HAS_BUILTIN)
906#undef JSON_HEDLEY_HAS_BUILTIN
908#if defined(__has_builtin)
909#define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin)
911#define JSON_HEDLEY_HAS_BUILTIN(builtin) (0)
914#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN)
915#undef JSON_HEDLEY_GNUC_HAS_BUILTIN
917#if defined(__has_builtin)
918#define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)
920#define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
923#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN)
924#undef JSON_HEDLEY_GCC_HAS_BUILTIN
926#if defined(__has_builtin)
927#define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)
929#define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
932#if defined(JSON_HEDLEY_HAS_FEATURE)
933#undef JSON_HEDLEY_HAS_FEATURE
935#if defined(__has_feature)
936#define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature)
938#define JSON_HEDLEY_HAS_FEATURE(feature) (0)
941#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE)
942#undef JSON_HEDLEY_GNUC_HAS_FEATURE
944#if defined(__has_feature)
945#define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)
947#define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
950#if defined(JSON_HEDLEY_GCC_HAS_FEATURE)
951#undef JSON_HEDLEY_GCC_HAS_FEATURE
953#if defined(__has_feature)
954#define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)
956#define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
959#if defined(JSON_HEDLEY_HAS_EXTENSION)
960#undef JSON_HEDLEY_HAS_EXTENSION
962#if defined(__has_extension)
963#define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension)
965#define JSON_HEDLEY_HAS_EXTENSION(extension) (0)
968#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION)
969#undef JSON_HEDLEY_GNUC_HAS_EXTENSION
971#if defined(__has_extension)
972#define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)
974#define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
977#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION)
978#undef JSON_HEDLEY_GCC_HAS_EXTENSION
980#if defined(__has_extension)
981#define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)
983#define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
986#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE)
987#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE
989#if defined(__has_declspec_attribute)
990#define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute)
992#define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0)
995#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE)
996#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
998#if defined(__has_declspec_attribute)
999#define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)
1001#define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
1004#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE)
1005#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
1007#if defined(__has_declspec_attribute)
1008#define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)
1010#define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
1013#if defined(JSON_HEDLEY_HAS_WARNING)
1014#undef JSON_HEDLEY_HAS_WARNING
1016#if defined(__has_warning)
1017#define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning)
1019#define JSON_HEDLEY_HAS_WARNING(warning) (0)
1022#if defined(JSON_HEDLEY_GNUC_HAS_WARNING)
1023#undef JSON_HEDLEY_GNUC_HAS_WARNING
1025#if defined(__has_warning)
1026#define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)
1028#define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
1031#if defined(JSON_HEDLEY_GCC_HAS_WARNING)
1032#undef JSON_HEDLEY_GCC_HAS_WARNING
1034#if defined(__has_warning)
1035#define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)
1037#define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
1041 (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
1042 defined(__clang__) || \
1043 JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \
1044 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1045 JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \
1046 JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \
1047 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1048 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1049 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \
1050 JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \
1051 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \
1052 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \
1053 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1054 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1055 JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \
1056 JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \
1057 JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \
1058 (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR))
1059#define JSON_HEDLEY_PRAGMA(value) _Pragma(#value)
1060#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
1061#define JSON_HEDLEY_PRAGMA(value) __pragma(value)
1063#define JSON_HEDLEY_PRAGMA(value)
1066#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH)
1067#undef JSON_HEDLEY_DIAGNOSTIC_PUSH
1069#if defined(JSON_HEDLEY_DIAGNOSTIC_POP)
1070#undef JSON_HEDLEY_DIAGNOSTIC_POP
1072#if defined(__clang__)
1073#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push")
1074#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop")
1075#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
1076#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
1077#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
1078#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)
1079#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
1080#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
1082 JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \
1083 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1084#define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push))
1085#define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop))
1086#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0)
1087#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push")
1088#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop")
1090 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1091 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1092 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \
1093 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \
1094 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1095 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
1096#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push")
1097#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop")
1098#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)
1099#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
1100#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
1102#define JSON_HEDLEY_DIAGNOSTIC_PUSH
1103#define JSON_HEDLEY_DIAGNOSTIC_POP
1108#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
1109#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
1111#if defined(__cplusplus)
1112# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat")
1113# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions")
1114# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions")
1115# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
1116 JSON_HEDLEY_DIAGNOSTIC_PUSH \
1117 _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
1118 _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \
1119 _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \
1121 JSON_HEDLEY_DIAGNOSTIC_POP
1123# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
1124 JSON_HEDLEY_DIAGNOSTIC_PUSH \
1125 _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
1126 _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \
1128 JSON_HEDLEY_DIAGNOSTIC_POP
1131# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
1132 JSON_HEDLEY_DIAGNOSTIC_PUSH \
1133 _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
1135 JSON_HEDLEY_DIAGNOSTIC_POP
1139#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
1140#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x
1143#if defined(JSON_HEDLEY_CONST_CAST)
1144#undef JSON_HEDLEY_CONST_CAST
1146#if defined(__cplusplus)
1147# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast<T>(expr))
1149 JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \
1150 JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \
1151 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
1152# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \
1153 JSON_HEDLEY_DIAGNOSTIC_PUSH \
1154 JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \
1156 JSON_HEDLEY_DIAGNOSTIC_POP \
1159# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr))
1162#if defined(JSON_HEDLEY_REINTERPRET_CAST)
1163#undef JSON_HEDLEY_REINTERPRET_CAST
1165#if defined(__cplusplus)
1166#define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast<T>(expr))
1168#define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr))
1171#if defined(JSON_HEDLEY_STATIC_CAST)
1172#undef JSON_HEDLEY_STATIC_CAST
1174#if defined(__cplusplus)
1175#define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast<T>(expr))
1177#define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr))
1180#if defined(JSON_HEDLEY_CPP_CAST)
1181#undef JSON_HEDLEY_CPP_CAST
1183#if defined(__cplusplus)
1184# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast")
1185# define JSON_HEDLEY_CPP_CAST(T, expr) \
1186 JSON_HEDLEY_DIAGNOSTIC_PUSH \
1187 _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \
1189 JSON_HEDLEY_DIAGNOSTIC_POP
1190# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0)
1191# define JSON_HEDLEY_CPP_CAST(T, expr) \
1192 JSON_HEDLEY_DIAGNOSTIC_PUSH \
1193 _Pragma("diag_suppress=Pe137") \
1194 JSON_HEDLEY_DIAGNOSTIC_POP
1196# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr))
1199# define JSON_HEDLEY_CPP_CAST(T, expr) (expr)
1202#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED)
1203#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
1205#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations")
1206#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
1207#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
1208#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)")
1209#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1210#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786))
1211#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0)
1212#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445")
1213#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
1214#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444")
1215#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)
1216#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
1217#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
1218#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996))
1219#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1220#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444")
1222 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1223 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1224 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1225 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1226 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1227 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1228 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1229 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1230 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1231 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1232 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
1233#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718")
1234#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus)
1235#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)")
1236#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus)
1237#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)")
1238#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
1239#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215")
1240#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)
1241#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)")
1243#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
1246#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS)
1247#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
1249#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
1250#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"")
1251#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
1252#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)")
1253#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1254#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161))
1255#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
1256#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675")
1257#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)
1258#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
1259#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
1260#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))
1262 JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \
1263 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \
1264 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1265 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)
1266#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
1267#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0)
1268#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
1269#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
1270#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161")
1271#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1272#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161")
1274#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
1277#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES)
1278#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
1280#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes")
1281#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"")
1282#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)
1283#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
1284#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0)
1285#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)")
1286#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1287#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292))
1288#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0)
1289#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030))
1290#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0)
1291#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098")
1292#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
1293#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097")
1294#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)
1295#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)")
1297 JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \
1298 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \
1299 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0)
1300#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173")
1301#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
1302#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097")
1303#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1304#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097")
1306#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
1309#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL)
1310#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
1312#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual")
1313#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"")
1314#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
1315#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)")
1316#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0)
1317#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"")
1319#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
1322#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION)
1323#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION
1325#if JSON_HEDLEY_HAS_WARNING("-Wunused-function")
1326#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"")
1327#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0)
1328#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"")
1329#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0)
1330#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505))
1331#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1332#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142")
1334#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION
1337#if defined(JSON_HEDLEY_DEPRECATED)
1338#undef JSON_HEDLEY_DEPRECATED
1340#if defined(JSON_HEDLEY_DEPRECATED_FOR)
1341#undef JSON_HEDLEY_DEPRECATED_FOR
1344 JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \
1345 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1346#define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since))
1347#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement))
1349 (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \
1350 JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \
1351 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1352 JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \
1353 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \
1354 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
1355 JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \
1356 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \
1357 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \
1358 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1359 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \
1360 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1361#define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since)))
1362#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement)))
1363#elif defined(__cplusplus) && (__cplusplus >= 201402L)
1364#define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]])
1365#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]])
1367 JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \
1368 JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
1369 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1370 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1371 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1372 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1373 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1374 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1375 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1376 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1377 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1378 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1379 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1380 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1381 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \
1382 JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)
1383#define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))
1384#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))
1386 JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
1387 JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \
1388 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1389#define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated)
1390#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)
1391#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
1392#define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated")
1393#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated")
1395#define JSON_HEDLEY_DEPRECATED(since)
1396#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement)
1399#if defined(JSON_HEDLEY_UNAVAILABLE)
1400#undef JSON_HEDLEY_UNAVAILABLE
1403 JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \
1404 JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \
1405 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1406 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1407#define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since)))
1409#define JSON_HEDLEY_UNAVAILABLE(available_since)
1412#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT)
1413#undef JSON_HEDLEY_WARN_UNUSED_RESULT
1415#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG)
1416#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG
1419 JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \
1420 JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
1421 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1422 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1423 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1424 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1425 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1426 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1427 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1428 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1429 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1430 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1431 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1432 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1433 (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \
1434 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
1435 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1436#define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
1437#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__))
1438#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L)
1439#define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
1440#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]])
1441#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard)
1442#define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
1443#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
1444#elif defined(_Check_return_)
1445#define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_
1446#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_
1448#define JSON_HEDLEY_WARN_UNUSED_RESULT
1449#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg)
1452#if defined(JSON_HEDLEY_SENTINEL)
1453#undef JSON_HEDLEY_SENTINEL
1456 JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \
1457 JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
1458 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1459 JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \
1460 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1461#define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position)))
1463#define JSON_HEDLEY_SENTINEL(position)
1466#if defined(JSON_HEDLEY_NO_RETURN)
1467#undef JSON_HEDLEY_NO_RETURN
1469#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
1470#define JSON_HEDLEY_NO_RETURN __noreturn
1472 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1473 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1474#define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))
1475#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
1476#define JSON_HEDLEY_NO_RETURN _Noreturn
1477#elif defined(__cplusplus) && (__cplusplus >= 201103L)
1478#define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]])
1480 JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \
1481 JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \
1482 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
1483 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1484 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
1485 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1486 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1487 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1488 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1489 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1490 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1491 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1492 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1493 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1494 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1495 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1496 JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)
1497#define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))
1498#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
1499#define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return")
1501 JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
1502 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1503#define JSON_HEDLEY_NO_RETURN __declspec(noreturn)
1504#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)
1505#define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;")
1506#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)
1507#define JSON_HEDLEY_NO_RETURN __attribute((noreturn))
1508#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)
1509#define JSON_HEDLEY_NO_RETURN __declspec(noreturn)
1511#define JSON_HEDLEY_NO_RETURN
1514#if defined(JSON_HEDLEY_NO_ESCAPE)
1515#undef JSON_HEDLEY_NO_ESCAPE
1517#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape)
1518#define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__))
1520#define JSON_HEDLEY_NO_ESCAPE
1523#if defined(JSON_HEDLEY_UNREACHABLE)
1524#undef JSON_HEDLEY_UNREACHABLE
1526#if defined(JSON_HEDLEY_UNREACHABLE_RETURN)
1527#undef JSON_HEDLEY_UNREACHABLE_RETURN
1529#if defined(JSON_HEDLEY_ASSUME)
1530#undef JSON_HEDLEY_ASSUME
1533 JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
1534 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1535 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1536#define JSON_HEDLEY_ASSUME(expr) __assume(expr)
1537#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume)
1538#define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr)
1540 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
1541 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)
1542#if defined(__cplusplus)
1543#define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr)
1545#define JSON_HEDLEY_ASSUME(expr) _nassert(expr)
1549 (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \
1550 JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \
1551 JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \
1552 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1553 JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \
1554 JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \
1555 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1556#define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable()
1557#elif defined(JSON_HEDLEY_ASSUME)
1558#define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)
1560#if !defined(JSON_HEDLEY_ASSUME)
1561#if defined(JSON_HEDLEY_UNREACHABLE)
1562#define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1)))
1564#define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr)
1567#if defined(JSON_HEDLEY_UNREACHABLE)
1569 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
1570 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)
1571#define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value))
1573#define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE()
1576#define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value)
1578#if !defined(JSON_HEDLEY_UNREACHABLE)
1579#define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)
1583#if JSON_HEDLEY_HAS_WARNING("-Wpedantic")
1584#pragma clang diagnostic ignored "-Wpedantic"
1586#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus)
1587#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
1589#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0)
1590#if defined(__clang__)
1591#pragma clang diagnostic ignored "-Wvariadic-macros"
1592#elif defined(JSON_HEDLEY_GCC_VERSION)
1593#pragma GCC diagnostic ignored "-Wvariadic-macros"
1596#if defined(JSON_HEDLEY_NON_NULL)
1597#undef JSON_HEDLEY_NON_NULL
1600 JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \
1601 JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
1602 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1603 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)
1604#define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))
1606#define JSON_HEDLEY_NON_NULL(...)
1610#if defined(JSON_HEDLEY_PRINTF_FORMAT)
1611#undef JSON_HEDLEY_PRINTF_FORMAT
1613#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO)
1614#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check)))
1615#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO)
1616#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check)))
1618 JSON_HEDLEY_HAS_ATTRIBUTE(format) || \
1619 JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
1620 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1621 JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \
1622 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
1623 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1624 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1625 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1626 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1627 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1628 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1629 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1630 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1631 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1632 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1633 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1634 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1635#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check)))
1636#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0)
1637#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check))
1639#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check)
1642#if defined(JSON_HEDLEY_CONSTEXPR)
1643#undef JSON_HEDLEY_CONSTEXPR
1645#if defined(__cplusplus)
1646#if __cplusplus >= 201103L
1647#define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr)
1650#if !defined(JSON_HEDLEY_CONSTEXPR)
1651#define JSON_HEDLEY_CONSTEXPR
1654#if defined(JSON_HEDLEY_PREDICT)
1655#undef JSON_HEDLEY_PREDICT
1657#if defined(JSON_HEDLEY_LIKELY)
1658#undef JSON_HEDLEY_LIKELY
1660#if defined(JSON_HEDLEY_UNLIKELY)
1661#undef JSON_HEDLEY_UNLIKELY
1663#if defined(JSON_HEDLEY_UNPREDICTABLE)
1664#undef JSON_HEDLEY_UNPREDICTABLE
1666#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable)
1667#define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr))
1670 (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \
1671 JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \
1672 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1673# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability))
1674# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability))
1675# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability))
1676# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 )
1677# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 )
1679 (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \
1680 JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \
1681 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1682 (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \
1683 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1684 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
1685 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1686 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \
1687 JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \
1688 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \
1689 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
1690 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1691 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1692 JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \
1693 JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \
1694 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1695# define JSON_HEDLEY_PREDICT(expr, expected, probability) \
1696 (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)))
1697# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \
1699 double hedley_probability_ = (probability); \
1700 ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \
1702# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \
1704 double hedley_probability_ = (probability); \
1705 ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \
1707# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1)
1708# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
1710# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))
1711# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr))
1712# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr))
1713# define JSON_HEDLEY_LIKELY(expr) (!!(expr))
1714# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr))
1716#if !defined(JSON_HEDLEY_UNPREDICTABLE)
1717#define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5)
1720#if defined(JSON_HEDLEY_MALLOC)
1721#undef JSON_HEDLEY_MALLOC
1724 JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \
1725 JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
1726 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1727 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
1728 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1729 JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \
1730 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1731 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1732 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1733 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1734 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1735 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1736 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1737 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1738 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1739 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1740 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1741 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1742#define JSON_HEDLEY_MALLOC __attribute__((__malloc__))
1743#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
1744#define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory")
1746 JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \
1747 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1748#define JSON_HEDLEY_MALLOC __declspec(restrict)
1750#define JSON_HEDLEY_MALLOC
1753#if defined(JSON_HEDLEY_PURE)
1754#undef JSON_HEDLEY_PURE
1757 JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \
1758 JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \
1759 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1760 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
1761 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1762 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
1763 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1764 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1765 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1766 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1767 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1768 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1769 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1770 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1771 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1772 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1773 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1774 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
1775 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1776# define JSON_HEDLEY_PURE __attribute__((__pure__))
1777#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
1778# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data")
1779#elif defined(__cplusplus) && \
1781 JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \
1782 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \
1783 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \
1785# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;")
1787# define JSON_HEDLEY_PURE
1790#if defined(JSON_HEDLEY_CONST)
1791#undef JSON_HEDLEY_CONST
1794 JSON_HEDLEY_HAS_ATTRIBUTE(const) || \
1795 JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \
1796 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1797 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
1798 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1799 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
1800 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1801 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1802 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1803 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1804 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1805 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1806 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1807 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1808 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1809 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1810 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1811 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
1812 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1813#define JSON_HEDLEY_CONST __attribute__((__const__))
1815 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
1816#define JSON_HEDLEY_CONST _Pragma("no_side_effect")
1818#define JSON_HEDLEY_CONST JSON_HEDLEY_PURE
1821#if defined(JSON_HEDLEY_RESTRICT)
1822#undef JSON_HEDLEY_RESTRICT
1824#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus)
1825#define JSON_HEDLEY_RESTRICT restrict
1827 JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
1828 JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \
1829 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1830 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \
1831 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1832 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
1833 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
1834 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1835 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \
1836 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \
1837 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1838 (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \
1839 JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \
1840 defined(__clang__) || \
1841 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1842#define JSON_HEDLEY_RESTRICT __restrict
1843#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus)
1844#define JSON_HEDLEY_RESTRICT _Restrict
1846#define JSON_HEDLEY_RESTRICT
1849#if defined(JSON_HEDLEY_INLINE)
1850#undef JSON_HEDLEY_INLINE
1853 (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
1854 (defined(__cplusplus) && (__cplusplus >= 199711L))
1855#define JSON_HEDLEY_INLINE inline
1857 defined(JSON_HEDLEY_GCC_VERSION) || \
1858 JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0)
1859#define JSON_HEDLEY_INLINE __inline__
1861 JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \
1862 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \
1863 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1864 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \
1865 JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \
1866 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
1867 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \
1868 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1869 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1870 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1871#define JSON_HEDLEY_INLINE __inline
1873#define JSON_HEDLEY_INLINE
1876#if defined(JSON_HEDLEY_ALWAYS_INLINE)
1877#undef JSON_HEDLEY_ALWAYS_INLINE
1880 JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \
1881 JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
1882 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1883 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
1884 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1885 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
1886 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1887 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1888 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1889 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1890 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1891 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1892 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1893 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1894 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1895 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1896 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1897 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \
1898 JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)
1899# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE
1901 JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \
1902 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1903# define JSON_HEDLEY_ALWAYS_INLINE __forceinline
1904#elif defined(__cplusplus) && \
1906 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1907 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1908 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1909 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
1910 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1911 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \
1913# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;")
1914#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
1915# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced")
1917# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE
1920#if defined(JSON_HEDLEY_NEVER_INLINE)
1921#undef JSON_HEDLEY_NEVER_INLINE
1924 JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \
1925 JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
1926 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1927 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
1928 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1929 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
1930 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
1931 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1932 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
1933 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1934 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
1935 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1936 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
1937 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1938 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
1939 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
1940 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
1941 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \
1942 JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)
1943#define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__))
1945 JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
1946 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
1947#define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)
1948#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0)
1949#define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline")
1950#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)
1951#define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;")
1952#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
1953#define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never")
1954#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)
1955#define JSON_HEDLEY_NEVER_INLINE __attribute((noinline))
1956#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)
1957#define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)
1959#define JSON_HEDLEY_NEVER_INLINE
1962#if defined(JSON_HEDLEY_PRIVATE)
1963#undef JSON_HEDLEY_PRIVATE
1965#if defined(JSON_HEDLEY_PUBLIC)
1966#undef JSON_HEDLEY_PUBLIC
1968#if defined(JSON_HEDLEY_IMPORT)
1969#undef JSON_HEDLEY_IMPORT
1971#if defined(_WIN32) || defined(__CYGWIN__)
1972# define JSON_HEDLEY_PRIVATE
1973# define JSON_HEDLEY_PUBLIC __declspec(dllexport)
1974# define JSON_HEDLEY_IMPORT __declspec(dllimport)
1977 JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \
1978 JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
1979 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
1980 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
1981 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
1982 JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
1984 defined(__TI_EABI__) && \
1986 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
1987 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \
1990 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
1991# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden")))
1992# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default")))
1994# define JSON_HEDLEY_PRIVATE
1995# define JSON_HEDLEY_PUBLIC
1997# define JSON_HEDLEY_IMPORT extern
2000#if defined(JSON_HEDLEY_NO_THROW)
2001#undef JSON_HEDLEY_NO_THROW
2004 JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \
2005 JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
2006 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
2007 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
2008#define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__))
2010 JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \
2011 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \
2012 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)
2013#define JSON_HEDLEY_NO_THROW __declspec(nothrow)
2015#define JSON_HEDLEY_NO_THROW
2018#if defined(JSON_HEDLEY_FALL_THROUGH)
2019#undef JSON_HEDLEY_FALL_THROUGH
2022 JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \
2023 JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \
2024 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
2025#define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__))
2026#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough)
2027#define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]])
2028#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough)
2029#define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]])
2030#elif defined(__fallthrough)
2031#define JSON_HEDLEY_FALL_THROUGH __fallthrough
2033#define JSON_HEDLEY_FALL_THROUGH
2036#if defined(JSON_HEDLEY_RETURNS_NON_NULL)
2037#undef JSON_HEDLEY_RETURNS_NON_NULL
2040 JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \
2041 JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \
2042 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
2043#define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__))
2044#elif defined(_Ret_notnull_)
2045#define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_
2047#define JSON_HEDLEY_RETURNS_NON_NULL
2050#if defined(JSON_HEDLEY_ARRAY_PARAM)
2051#undef JSON_HEDLEY_ARRAY_PARAM
2054 defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
2055 !defined(__STDC_NO_VLA__) && \
2056 !defined(__cplusplus) && \
2057 !defined(JSON_HEDLEY_PGI_VERSION) && \
2058 !defined(JSON_HEDLEY_TINYC_VERSION)
2059#define JSON_HEDLEY_ARRAY_PARAM(name) (name)
2061#define JSON_HEDLEY_ARRAY_PARAM(name)
2064#if defined(JSON_HEDLEY_IS_CONSTANT)
2065#undef JSON_HEDLEY_IS_CONSTANT
2067#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR)
2068#undef JSON_HEDLEY_REQUIRE_CONSTEXPR
2072#if defined(JSON_HEDLEY_IS_CONSTEXPR_)
2073#undef JSON_HEDLEY_IS_CONSTEXPR_
2076 JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \
2077 JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
2078 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
2079 JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \
2080 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
2081 JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
2082 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
2083 (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \
2084 JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \
2085 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
2086#define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr)
2088#if !defined(__cplusplus)
2090 JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \
2091 JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
2092 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
2093 JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
2094 JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \
2095 JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \
2096 JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24)
2097#if defined(__INTPTR_TYPE__)
2098#define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*)
2101#define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*)
2105 defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \
2106 !defined(JSON_HEDLEY_SUNPRO_VERSION) && \
2107 !defined(JSON_HEDLEY_PGI_VERSION) && \
2108 !defined(JSON_HEDLEY_IAR_VERSION)) || \
2109 (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \
2110 JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \
2111 JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \
2112 JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \
2113 JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0)
2114#if defined(__INTPTR_TYPE__)
2115#define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0)
2118#define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0)
2121 defined(JSON_HEDLEY_GCC_VERSION) || \
2122 defined(JSON_HEDLEY_INTEL_VERSION) || \
2123 defined(JSON_HEDLEY_TINYC_VERSION) || \
2124 defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \
2125 JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \
2126 defined(JSON_HEDLEY_TI_CL2000_VERSION) || \
2127 defined(JSON_HEDLEY_TI_CL6X_VERSION) || \
2128 defined(JSON_HEDLEY_TI_CL7X_VERSION) || \
2129 defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \
2131# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \
2135 ((void*) ((expr) * 0L) ) : \
2136((struct { char v[sizeof(void) * 2]; } *) 1) \
2142#if defined(JSON_HEDLEY_IS_CONSTEXPR_)
2143#if !defined(JSON_HEDLEY_IS_CONSTANT)
2144#define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr)
2146#define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1))
2148#if !defined(JSON_HEDLEY_IS_CONSTANT)
2149#define JSON_HEDLEY_IS_CONSTANT(expr) (0)
2151#define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr)
2154#if defined(JSON_HEDLEY_BEGIN_C_DECLS)
2155#undef JSON_HEDLEY_BEGIN_C_DECLS
2157#if defined(JSON_HEDLEY_END_C_DECLS)
2158#undef JSON_HEDLEY_END_C_DECLS
2160#if defined(JSON_HEDLEY_C_DECL)
2161#undef JSON_HEDLEY_C_DECL
2163#if defined(__cplusplus)
2164#define JSON_HEDLEY_BEGIN_C_DECLS extern "C" {
2165#define JSON_HEDLEY_END_C_DECLS }
2166#define JSON_HEDLEY_C_DECL extern "C"
2168#define JSON_HEDLEY_BEGIN_C_DECLS
2169#define JSON_HEDLEY_END_C_DECLS
2170#define JSON_HEDLEY_C_DECL
2173#if defined(JSON_HEDLEY_STATIC_ASSERT)
2174#undef JSON_HEDLEY_STATIC_ASSERT
2177 !defined(__cplusplus) && ( \
2178 (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \
2179 (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \
2180 JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \
2181 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
2182 defined(_Static_assert) \
2184# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message)
2186 (defined(__cplusplus) && (__cplusplus >= 201103L)) || \
2187 JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \
2188 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
2189# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message))
2191# define JSON_HEDLEY_STATIC_ASSERT(expr, message)
2194#if defined(JSON_HEDLEY_NULL)
2195#undef JSON_HEDLEY_NULL
2197#if defined(__cplusplus)
2198#if __cplusplus >= 201103L
2199#define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr)
2201#define JSON_HEDLEY_NULL NULL
2203#define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0)
2206#define JSON_HEDLEY_NULL NULL
2208#define JSON_HEDLEY_NULL ((void*) 0)
2211#if defined(JSON_HEDLEY_MESSAGE)
2212#undef JSON_HEDLEY_MESSAGE
2214#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
2215# define JSON_HEDLEY_MESSAGE(msg) \
2216 JSON_HEDLEY_DIAGNOSTIC_PUSH \
2217 JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
2218 JSON_HEDLEY_PRAGMA(message msg) \
2219 JSON_HEDLEY_DIAGNOSTIC_POP
2221 JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \
2222 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
2223# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg)
2224#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0)
2225# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg)
2226#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
2227# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))
2228#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0)
2229# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))
2231# define JSON_HEDLEY_MESSAGE(msg)
2234#if defined(JSON_HEDLEY_WARNING)
2235#undef JSON_HEDLEY_WARNING
2237#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
2238# define JSON_HEDLEY_WARNING(msg) \
2239 JSON_HEDLEY_DIAGNOSTIC_PUSH \
2240 JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
2241 JSON_HEDLEY_PRAGMA(clang warning msg) \
2242 JSON_HEDLEY_DIAGNOSTIC_POP
2244 JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \
2245 JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \
2246 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
2247# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg)
2249 JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \
2250 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
2251# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg))
2253# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg)
2256#if defined(JSON_HEDLEY_REQUIRE)
2257#undef JSON_HEDLEY_REQUIRE
2259#if defined(JSON_HEDLEY_REQUIRE_MSG)
2260#undef JSON_HEDLEY_REQUIRE_MSG
2262#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if)
2263# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat")
2264# define JSON_HEDLEY_REQUIRE(expr) \
2265 JSON_HEDLEY_DIAGNOSTIC_PUSH \
2266 _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
2267 __attribute__((diagnose_if(!(expr), #expr, "error"))) \
2268 JSON_HEDLEY_DIAGNOSTIC_POP
2269# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \
2270 JSON_HEDLEY_DIAGNOSTIC_PUSH \
2271 _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
2272 __attribute__((diagnose_if(!(expr), msg, "error"))) \
2273 JSON_HEDLEY_DIAGNOSTIC_POP
2275# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error")))
2276# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error")))
2279# define JSON_HEDLEY_REQUIRE(expr)
2280# define JSON_HEDLEY_REQUIRE_MSG(expr,msg)
2283#if defined(JSON_HEDLEY_FLAGS)
2284#undef JSON_HEDLEY_FLAGS
2286#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion"))
2287#define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__))
2289#define JSON_HEDLEY_FLAGS
2292#if defined(JSON_HEDLEY_FLAGS_CAST)
2293#undef JSON_HEDLEY_FLAGS_CAST
2295#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0)
2296# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \
2297 JSON_HEDLEY_DIAGNOSTIC_PUSH \
2298 _Pragma("warning(disable:188)") \
2300 JSON_HEDLEY_DIAGNOSTIC_POP \
2303# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr)
2306#if defined(JSON_HEDLEY_EMPTY_BASES)
2307#undef JSON_HEDLEY_EMPTY_BASES
2310 (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \
2311 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
2312#define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases)
2314#define JSON_HEDLEY_EMPTY_BASES
2319#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK)
2320#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
2322#if defined(__clang__)
2323#define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0)
2325#define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
2328#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE)
2329#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE
2331#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)
2333#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE)
2334#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
2336#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute)
2338#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN)
2339#undef JSON_HEDLEY_CLANG_HAS_BUILTIN
2341#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin)
2343#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE)
2344#undef JSON_HEDLEY_CLANG_HAS_FEATURE
2346#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature)
2348#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION)
2349#undef JSON_HEDLEY_CLANG_HAS_EXTENSION
2351#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension)
2353#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE)
2354#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
2356#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute)
2358#if defined(JSON_HEDLEY_CLANG_HAS_WARNING)
2359#undef JSON_HEDLEY_CLANG_HAS_WARNING
2361#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning)
2373#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
2374#if defined(__clang__)
2375#if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
2376#error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
2378#elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
2379#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
2380#error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
2387#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11)
2388#if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
2389#define JSON_HAS_CPP_20
2390#define JSON_HAS_CPP_17
2391#define JSON_HAS_CPP_14
2392#elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1)
2393#define JSON_HAS_CPP_17
2394#define JSON_HAS_CPP_14
2395#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
2396#define JSON_HAS_CPP_14
2399#define JSON_HAS_CPP_11
2403#if __has_include(<version>)
2408#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM)
2409#ifdef JSON_HAS_CPP_17
2410#if defined(__cpp_lib_filesystem)
2411#define JSON_HAS_FILESYSTEM 1
2412#elif defined(__cpp_lib_experimental_filesystem)
2413#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
2414#elif !defined(__has_include)
2415#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
2416#elif __has_include(<filesystem>)
2417#define JSON_HAS_FILESYSTEM 1
2418#elif __has_include(<experimental/filesystem>)
2419#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
2423#if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8
2424#undef JSON_HAS_FILESYSTEM
2425#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
2429#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8
2430#undef JSON_HAS_FILESYSTEM
2431#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
2435#if defined(__clang_major__) && __clang_major__ < 7
2436#undef JSON_HAS_FILESYSTEM
2437#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
2441#if defined(_MSC_VER) && _MSC_VER < 1914
2442#undef JSON_HAS_FILESYSTEM
2443#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
2447#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000
2448#undef JSON_HAS_FILESYSTEM
2449#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
2453#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500
2454#undef JSON_HAS_FILESYSTEM
2455#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
2460#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM
2461#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0
2464#ifndef JSON_HAS_FILESYSTEM
2465#define JSON_HAS_FILESYSTEM 0
2468#ifndef JSON_HAS_THREE_WAY_COMPARISON
2469#if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \
2470 && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L
2471#define JSON_HAS_THREE_WAY_COMPARISON 1
2473#define JSON_HAS_THREE_WAY_COMPARISON 0
2477#ifndef JSON_HAS_RANGES
2479#if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427
2480#define JSON_HAS_RANGES 0
2481#elif defined(__cpp_lib_ranges)
2482#define JSON_HAS_RANGES 1
2484#define JSON_HAS_RANGES 0
2488#ifndef JSON_HAS_STATIC_RTTI
2489#if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0
2490#define JSON_HAS_STATIC_RTTI 1
2492#define JSON_HAS_STATIC_RTTI 0
2496#ifdef JSON_HAS_CPP_17
2497#define JSON_INLINE_VARIABLE inline
2499#define JSON_INLINE_VARIABLE
2502#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address)
2503#define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]]
2505#define JSON_NO_UNIQUE_ADDRESS
2509#if defined(__clang__)
2510#pragma clang diagnostic push
2511#pragma clang diagnostic ignored "-Wdocumentation"
2512#pragma clang diagnostic ignored "-Wdocumentation-unknown-command"
2516#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
2517#define JSON_THROW(exception) throw exception
2519#define JSON_CATCH(exception) catch(exception)
2520#define JSON_INTERNAL_CATCH(exception) catch(exception)
2523#define JSON_THROW(exception) std::abort()
2524#define JSON_TRY if(true)
2525#define JSON_CATCH(exception) if(false)
2526#define JSON_INTERNAL_CATCH(exception) if(false)
2530#if defined(JSON_THROW_USER)
2532#define JSON_THROW JSON_THROW_USER
2534#if defined(JSON_TRY_USER)
2536#define JSON_TRY JSON_TRY_USER
2538#if defined(JSON_CATCH_USER)
2540#define JSON_CATCH JSON_CATCH_USER
2541#undef JSON_INTERNAL_CATCH
2542#define JSON_INTERNAL_CATCH JSON_CATCH_USER
2544#if defined(JSON_INTERNAL_CATCH_USER)
2545#undef JSON_INTERNAL_CATCH
2546#define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER
2550#if !defined(JSON_ASSERT)
2552#define JSON_ASSERT(x) assert(x)
2556#if defined(JSON_TESTS_PRIVATE)
2557#define JSON_PRIVATE_UNLESS_TESTED public
2559#define JSON_PRIVATE_UNLESS_TESTED private
2567#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \
2568 template<typename BasicJsonType> \
2569 inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \
2571 static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
2572 static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
2573 auto it = std::find_if(std::begin(m), std::end(m), \
2574 [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
2576 return ej_pair.first == e; \
2578 j = ((it != std::end(m)) ? it : std::begin(m))->second; \
2580 template<typename BasicJsonType> \
2581 inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \
2583 static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
2584 static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
2585 auto it = std::find_if(std::begin(m), std::end(m), \
2586 [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
2588 return ej_pair.second == j; \
2590 e = ((it != std::end(m)) ? it : std::begin(m))->first; \
2596#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \
2597 template<template<typename, typename, typename...> class ObjectType, \
2598 template<typename, typename...> class ArrayType, \
2599 class StringType, class BooleanType, class NumberIntegerType, \
2600 class NumberUnsignedType, class NumberFloatType, \
2601 template<typename> class AllocatorType, \
2602 template<typename, typename = void> class JSONSerializer, \
2604 class CustomBaseClass>
2606#define NLOHMANN_BASIC_JSON_TPL \
2607 basic_json<ObjectType, ArrayType, StringType, BooleanType, \
2608 NumberIntegerType, NumberUnsignedType, NumberFloatType, \
2609 AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>
2613#define NLOHMANN_JSON_EXPAND( x ) x
2614#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME
2615#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \
2616 NLOHMANN_JSON_PASTE64, \
2617 NLOHMANN_JSON_PASTE63, \
2618 NLOHMANN_JSON_PASTE62, \
2619 NLOHMANN_JSON_PASTE61, \
2620 NLOHMANN_JSON_PASTE60, \
2621 NLOHMANN_JSON_PASTE59, \
2622 NLOHMANN_JSON_PASTE58, \
2623 NLOHMANN_JSON_PASTE57, \
2624 NLOHMANN_JSON_PASTE56, \
2625 NLOHMANN_JSON_PASTE55, \
2626 NLOHMANN_JSON_PASTE54, \
2627 NLOHMANN_JSON_PASTE53, \
2628 NLOHMANN_JSON_PASTE52, \
2629 NLOHMANN_JSON_PASTE51, \
2630 NLOHMANN_JSON_PASTE50, \
2631 NLOHMANN_JSON_PASTE49, \
2632 NLOHMANN_JSON_PASTE48, \
2633 NLOHMANN_JSON_PASTE47, \
2634 NLOHMANN_JSON_PASTE46, \
2635 NLOHMANN_JSON_PASTE45, \
2636 NLOHMANN_JSON_PASTE44, \
2637 NLOHMANN_JSON_PASTE43, \
2638 NLOHMANN_JSON_PASTE42, \
2639 NLOHMANN_JSON_PASTE41, \
2640 NLOHMANN_JSON_PASTE40, \
2641 NLOHMANN_JSON_PASTE39, \
2642 NLOHMANN_JSON_PASTE38, \
2643 NLOHMANN_JSON_PASTE37, \
2644 NLOHMANN_JSON_PASTE36, \
2645 NLOHMANN_JSON_PASTE35, \
2646 NLOHMANN_JSON_PASTE34, \
2647 NLOHMANN_JSON_PASTE33, \
2648 NLOHMANN_JSON_PASTE32, \
2649 NLOHMANN_JSON_PASTE31, \
2650 NLOHMANN_JSON_PASTE30, \
2651 NLOHMANN_JSON_PASTE29, \
2652 NLOHMANN_JSON_PASTE28, \
2653 NLOHMANN_JSON_PASTE27, \
2654 NLOHMANN_JSON_PASTE26, \
2655 NLOHMANN_JSON_PASTE25, \
2656 NLOHMANN_JSON_PASTE24, \
2657 NLOHMANN_JSON_PASTE23, \
2658 NLOHMANN_JSON_PASTE22, \
2659 NLOHMANN_JSON_PASTE21, \
2660 NLOHMANN_JSON_PASTE20, \
2661 NLOHMANN_JSON_PASTE19, \
2662 NLOHMANN_JSON_PASTE18, \
2663 NLOHMANN_JSON_PASTE17, \
2664 NLOHMANN_JSON_PASTE16, \
2665 NLOHMANN_JSON_PASTE15, \
2666 NLOHMANN_JSON_PASTE14, \
2667 NLOHMANN_JSON_PASTE13, \
2668 NLOHMANN_JSON_PASTE12, \
2669 NLOHMANN_JSON_PASTE11, \
2670 NLOHMANN_JSON_PASTE10, \
2671 NLOHMANN_JSON_PASTE9, \
2672 NLOHMANN_JSON_PASTE8, \
2673 NLOHMANN_JSON_PASTE7, \
2674 NLOHMANN_JSON_PASTE6, \
2675 NLOHMANN_JSON_PASTE5, \
2676 NLOHMANN_JSON_PASTE4, \
2677 NLOHMANN_JSON_PASTE3, \
2678 NLOHMANN_JSON_PASTE2, \
2679 NLOHMANN_JSON_PASTE1)(__VA_ARGS__))
2680#define NLOHMANN_JSON_PASTE2(func, v1) func(v1)
2681#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2)
2682#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3)
2683#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4)
2684#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5)
2685#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6)
2686#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7)
2687#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8)
2688#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9)
2689#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10)
2690#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)
2691#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)
2692#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)
2693#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14)
2694#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)
2695#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16)
2696#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17)
2697#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18)
2698#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19)
2699#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20)
2700#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21)
2701#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22)
2702#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)
2703#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24)
2704#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25)
2705#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26)
2706#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27)
2707#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28)
2708#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29)
2709#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30)
2710#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31)
2711#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32)
2712#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33)
2713#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34)
2714#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35)
2715#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36)
2716#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37)
2717#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38)
2718#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39)
2719#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40)
2720#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41)
2721#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42)
2722#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43)
2723#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)
2724#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45)
2725#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46)
2726#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47)
2727#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48)
2728#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49)
2729#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50)
2730#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51)
2731#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52)
2732#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53)
2733#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54)
2734#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)
2735#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)
2736#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)
2737#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)
2738#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59)
2739#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60)
2740#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61)
2741#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62)
2742#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63)
2744#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1;
2745#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1);
2746#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1);
2753#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \
2754 friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
2755 friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
2757#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \
2758 friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
2759 friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
2761#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \
2762 friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
2769#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \
2770 inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
2771 inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
2773#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \
2774 inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
2776#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \
2777 inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
2778 inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
2786#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \
2787 namespace detail { \
2788 using std::std_name; \
2790 template<typename... T> \
2791 using result_of_##std_name = decltype(std_name(std::declval<T>()...)); \
2794 namespace detail2 { \
2795 struct std_name##_tag \
2799 template<typename... T> \
2800 std_name##_tag std_name(T&&...); \
2802 template<typename... T> \
2803 using result_of_##std_name = decltype(std_name(std::declval<T>()...)); \
2805 template<typename... T> \
2806 struct would_call_std_##std_name \
2808 static constexpr auto const value = ::nlohmann::detail:: \
2809 is_detected_exact<std_name##_tag, result_of_##std_name, T...>::value; \
2813 template<typename... T> \
2814 struct would_call_std_##std_name : detail2::would_call_std_##std_name<T...> \
2818#ifndef JSON_USE_IMPLICIT_CONVERSIONS
2819#define JSON_USE_IMPLICIT_CONVERSIONS 1
2822#if JSON_USE_IMPLICIT_CONVERSIONS
2823#define JSON_EXPLICIT
2825#define JSON_EXPLICIT explicit
2828#ifndef JSON_DISABLE_ENUM_SERIALIZATION
2829#define JSON_DISABLE_ENUM_SERIALIZATION 0
2832#ifndef JSON_USE_GLOBAL_UDLS
2833#define JSON_USE_GLOBAL_UDLS 1
2836#if JSON_HAS_THREE_WAY_COMPARISON
2899#if JSON_HAS_THREE_WAY_COMPARISON
2900 inline std::partial_ordering operator<=>(
const value_t lhs,
const value_t rhs)
noexcept
2905 static constexpr std::array<std::uint8_t, 9> order = { {
2912 const auto l_index =
static_cast<std::size_t
>(lhs);
2913 const auto r_index =
static_cast<std::size_t
>(rhs);
2914#if JSON_HAS_THREE_WAY_COMPARISON
2915 if (l_index < order.size() && r_index < order.size())
2917 return order[l_index] <=> order[r_index];
2919 return std::partial_ordering::unordered;
2921 return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index];
2929#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__)
2932 return std::is_lt(lhs <=> rhs);
2970 template<
typename StringType>
2972 const StringType& t)
2975 for (
auto pos = s.find(f);
2976 pos != StringType::npos;
2977 s.replace(pos, f.size(), t),
2978 pos = s.find(f, pos + t.size()))
2990 template<
typename StringType>
3005 template<
typename StringType>
3046 constexpr operator size_t()
const
3071#include <type_traits>
3081 template<
typename T>
3082 using uncvref_t =
typename std::remove_cv<typename std::remove_reference<T>::type>::type;
3084#ifdef JSON_HAS_CPP_14
3087 using std::enable_if_t;
3088 using std::index_sequence;
3089 using std::make_index_sequence;
3090 using std::index_sequence_for;
3095 template<
bool B,
typename T =
void>
3122 template <
typename T,
T... Ints>
3126 static constexpr std::size_t
size() noexcept
3128 return sizeof...(Ints);
3137 template <
size_t... Ints>
3143 template <
typename Seq,
size_t SeqSize,
size_t Rem>
3147 template <
typename T,
T... Ints,
size_t SeqSize>
3153 template <
typename T,
T... Ints,
size_t SeqSize>
3161 template <
typename T,
size_t N>
3168 template <
typename T>
3183 template <
typename T, T N>
3199 template <
typename... Ts>
3211 template<
typename T>
3217#ifndef JSON_HAS_CPP_17
3218 template<
typename T>
3222 template<
typename T,
typename... Args>
3223 inline constexpr std::array<
T,
sizeof...(Args)>
make_array(Args&& ... args)
3225 return std::array<
T,
sizeof...(Args)> {{
static_cast<T>(std::forward<Args>(args))...}};
3243#include <type_traits>
3272 template<
typename It,
typename =
void>
3275 template<
typename It>
3279 typename It::reference, typename It::iterator_category >>
3290 template<
typename T,
typename =
void>
3295 template<
typename T>
3301 template<
typename T>
3369#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_
3370#define INCLUDE_NLOHMANN_JSON_FWD_HPP_
3395template<
typename T =
void,
typename SFINAE =
void>
3400template<
template<
typename U,
typename V,
typename... Args>
class ObjectType =
3402 template<
typename U,
typename... Args>
class ArrayType = std::vector,
3403 class StringType = std::string,
class BooleanType = bool,
3404 class NumberIntegerType = std::int64_t,
3405 class NumberUnsignedType = std::uint64_t,
3406 class NumberFloatType = double,
3407 template<
typename U>
class AllocatorType = std::allocator,
3408 template<
typename T,
typename SFINAE =
void>
class JSONSerializer =
3410 class BinaryType = std::vector<std::uint8_t>,
3411 class CustomBaseClass =
void>
3416template<
typename RefStringType>
3427template<
class Key,
class T,
class IgnoredLess,
class Allocator>
3472 template<
typename BasicJsonContext>
3474 std::integral_constant < bool,
3475 is_basic_json<typename std::remove_cv<typename std::remove_pointer<BasicJsonContext>::type>::type>::value
3476 || std::is_same<BasicJsonContext, std::nullptr_t>::value >
3489 template<
typename T>
3496 template<
typename T>
3499 template<
typename T>
3502 template<
typename T>
3505 template<
typename T>
3508 template<
typename T>
3511 template<
typename T>
3514 template<
typename T>
3517 template<
typename T,
typename... Args>
3520 template<
typename T,
typename... Args>
3523 template<
typename T,
typename U>
3527 template<
typename BasicJsonType,
typename T,
typename =
void>
3534 template <
typename BasicJsonType,
typename T>
3540 template<
typename BasicJsonType,
typename T>
3543 using serializer =
typename BasicJsonType::template json_serializer<T, void>;
3552 template<
typename BasicJsonType,
typename T,
typename =
void>
3555 template<
typename BasicJsonType,
typename T>
3558 using serializer =
typename BasicJsonType::template json_serializer<T, void>;
3567 template<
typename BasicJsonType,
typename T,
typename =
void>
3570 template<
typename BasicJsonType,
typename T>
3573 using serializer =
typename BasicJsonType::template json_serializer<T, void>;
3580 template<
typename T>
3583 template<
typename T>
3584 struct has_key_compare : std::integral_constant<bool, is_detected<detect_key_compare, T>::value> {};
3587 template<
typename BasicJsonType>
3592 using type =
typename std::conditional < has_key_compare<object_t>::value,
3596 template<
typename BasicJsonType>
3604 template<
typename T>
3663 template<
class B,
class... Bn>
3665 : std::conditional<static_cast<bool>(B::value), conjunction<Bn...>, B>::type {};
3668 template<
class B>
struct negation : std::integral_constant < bool, !B::value > { };
3673 template <
typename T>
3676 template <
typename T1,
typename T2>
3678 :
conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
3680 template <
typename T1,
typename T2>
3682 :
conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
3684 template <
typename... Ts>
3686 :
conjunction<is_default_constructible<Ts>...> {};
3688 template <
typename... Ts>
3690 :
conjunction<is_default_constructible<Ts>...> {};
3692 template <
typename T,
typename... Args>
3695 template <
typename T1,
typename T2>
3698 template <
typename T1,
typename T2>
3701 template <
typename... Ts>
3704 template <
typename... Ts>
3707 template<
typename T,
typename =
void>
3710 template<
typename T>
3725 template<
typename T>
3729 using t_ref =
typename std::add_lvalue_reference<T>::type;
3741 static constexpr bool value = !std::is_same<iterator, nonesuch>::value && !std::is_same<sentinel, nonesuch>::value&&
is_iterator_begin;
3744 template<
typename R>
3747 template<
typename T>
3754 template<
typename T,
typename =
void>
3757 template<
typename T>
3760 template<
typename BasicJsonType,
typename CompatibleObjectType,
3764 template<
typename BasicJsonType,
typename CompatibleObjectType>
3766 BasicJsonType, CompatibleObjectType,
3775 typename CompatibleObjectType::key_type>
::value&&
3777 typename CompatibleObjectType::mapped_type>
::value;
3780 template<
typename BasicJsonType,
typename CompatibleObjectType>
3784 template<
typename BasicJsonType,
typename ConstructibleObjectType,
3788 template<
typename BasicJsonType,
typename ConstructibleObjectType>
3790 BasicJsonType, ConstructibleObjectType,
3798 (std::is_move_assignable<ConstructibleObjectType>::value ||
3799 std::is_copy_assignable<ConstructibleObjectType>::value) &&
3801 typename object_t::key_type>
::value &&
3803 typename object_t::mapped_type,
3804 typename ConstructibleObjectType::mapped_type >
::value)) ||
3806 typename ConstructibleObjectType::mapped_type>
::value ||
3809 typename ConstructibleObjectType::mapped_type >
::value);
3812 template<
typename BasicJsonType,
typename ConstructibleObjectType>
3815 ConstructibleObjectType> {};
3817 template<
typename BasicJsonType,
typename CompatibleStringType>
3824 template<
typename BasicJsonType,
typename ConstructibleStringType>
3828#ifdef __INTEL_COMPILER
3829 using laundered_type =
decltype(std::declval<ConstructibleStringType>());
3841 template<
typename BasicJsonType,
typename CompatibleArrayType,
typename =
void>
3844 template<
typename BasicJsonType,
typename CompatibleArrayType>
3846 BasicJsonType, CompatibleArrayType,
3852 !std::is_same<CompatibleArrayType, detected_t<range_value_t, CompatibleArrayType>>
::value >>
3859 template<
typename BasicJsonType,
typename CompatibleArrayType>
3863 template<
typename BasicJsonType,
typename ConstructibleArrayType,
typename =
void>
3866 template<
typename BasicJsonType,
typename ConstructibleArrayType>
3868 BasicJsonType, ConstructibleArrayType,
3870 typename BasicJsonType::value_type>
::value >>
3871 : std::true_type {};
3873 template<
typename BasicJsonType,
typename ConstructibleArrayType>
3875 BasicJsonType, ConstructibleArrayType,
3877 typename BasicJsonType::value_type>
::value &&
3880 (std::is_move_assignable<ConstructibleArrayType>::value ||
3881 std::is_copy_assignable<ConstructibleArrayType>::value) &&
3887 !std::is_same<ConstructibleArrayType, detected_t<range_value_t, ConstructibleArrayType>>
::value&&
3889 detected_t<range_value_t, ConstructibleArrayType >>
::value >>
3895 typename BasicJsonType::array_t::value_type>
::value ||
3903 template<
typename BasicJsonType,
typename ConstructibleArrayType>
3907 template<
typename RealIntegerType,
typename CompatibleNumberIntegerType,
3911 template<
typename RealIntegerType,
typename CompatibleNumberIntegerType>
3913 RealIntegerType, CompatibleNumberIntegerType,
3915 std::is_integral<CompatibleNumberIntegerType>
::value &&
3916 !std::is_same<bool, CompatibleNumberIntegerType>
::value >>
3924 CompatibleNumberIntegerType>
::value&&
3925 CompatibleLimits::is_integer&&
3926 RealLimits::is_signed == CompatibleLimits::is_signed;
3929 template<
typename RealIntegerType,
typename CompatibleNumberIntegerType>
3932 CompatibleNumberIntegerType> {};
3934 template<
typename BasicJsonType,
typename CompatibleType,
typename =
void>
3937 template<
typename BasicJsonType,
typename CompatibleType>
3939 BasicJsonType, CompatibleType,
3946 template<
typename BasicJsonType,
typename CompatibleType>
3950 template<
typename T1,
typename T2>
3953 template<
typename T1,
typename... Args>
3956 template<
typename BasicJsonType,
typename T>
3959 template<
typename BasicJsonType>
3962 template<
typename BasicJsonType>
3967 template<
template <
typename...>
class Primary,
typename T>
3970 template<
template <
typename...>
class Primary,
typename... Args>
3973 template<
typename T>
3977 template<
typename Compare,
typename A,
typename B,
typename =
void>
3980 template<
typename Compare,
typename A,
typename B>
3982 decltype(
std::declval<Compare>()(std::declval<A>(), std::declval<B>())),
3983 decltype(std::declval<Compare>()(std::declval<B>(), std::declval<A>()))
3984 >> : std::true_type {};
3986 template<
typename T>
3991 template<
typename Comparator,
typename ObjectKeyType,
typename KeyTypeCVRef,
bool RequireTransparentComparator =
true,
3995 && !(ExcludeObjectKeyType&& std::is_same<KeyType,
3997 && (!RequireTransparentComparator
3998 || is_detected <detect_is_transparent, Comparator>::value)
4001 std::false_type >::type;
4009 template<
typename BasicJsonType,
typename KeyTypeCVRef,
bool RequireTransparentComparator =
true,
4013 typename BasicJsonType::object_t::key_type, KeyTypeCVRef,
4014 RequireTransparentComparator, ExcludeObjectKeyType>
::value
4017 std::false_type >::type;
4019 template<
typename ObjectType,
typename KeyType>
4023 template<
typename BasicJsonType,
typename KeyType>
4027 typename BasicJsonType::object_t, KeyType >
::value,
4029 std::false_type >::type;
4033 template <
typename T>
4043 template <
typename C>
static one test(
decltype(&C::capacity));
4050 template < typename T, typename U, enable_if_t < !std::is_same<T, U>::value,
int > = 0 >
4053 return static_cast<T>(
value);
4056 template<typename T, typename U, enable_if_t<std::is_same<T, U>::value,
int> = 0>
4062 template<
typename... Types>
4065 template<
typename... Types>
4068 template<
typename... Types>
4072 template<
typename... Types>
4076 template<
typename OfType,
typename T>
4078 (std::is_signed<OfType>::value && (
sizeof(
T) <
sizeof(OfType)))
4081 template<
typename OfType,
typename T,
4082 bool OfTypeSigned = std::is_signed<OfType>::value,
4083 bool TSigned = std::is_signed<T>::value>
4086 template<
typename OfType,
typename T>
4091 using CommonType =
typename std::common_type<OfType, T>::type;
4092 return static_cast<CommonType
>(val) <=
static_cast<CommonType
>((std::numeric_limits<OfType>::max)());
4096 template<
typename OfType,
typename T>
4101 using CommonType =
typename std::common_type<OfType, T>::type;
4102 return static_cast<CommonType
>(val) <=
static_cast<CommonType
>((std::numeric_limits<OfType>::max)());
4106 template<
typename OfType,
typename T>
4111 using CommonType =
typename std::common_type<OfType, T>::type;
4112 return val >= 0 &&
static_cast<CommonType
>(val) <=
static_cast<CommonType
>((std::numeric_limits<OfType>::max)());
4116 template<
typename OfType,
typename T>
4121 using CommonType =
typename std::common_type<OfType, T>::type;
4122 return static_cast<CommonType
>(val) >=
static_cast<CommonType
>((std::numeric_limits<OfType>::min)())
4123 &&
static_cast<CommonType
>(val) <=
static_cast<CommonType
>((std::numeric_limits<OfType>::max)());
4127 template<
typename OfType,
typename T,
4128 bool NeverOutOfRange = never_out_of_range<OfType, T>::value,
4132 template<
typename OfType,
typename T>
4141 template<
typename OfType,
typename T>
4150 template<
typename OfType,
typename T>
4156 template<
bool Value>
4166 template<
typename T>
4169 using TUnExt =
typename std::remove_extent<T>::type;
4170 using TUnCVExt =
typename std::remove_cv<TUnExt>::type;
4171 using TUnPtr =
typename std::remove_pointer<T>::type;
4172 using TUnCVPtr =
typename std::remove_cv<TUnPtr>::type;
4174 (std::is_array<T>::value && std::is_same<TUnCVExt, char>::value)
4175 || (std::is_pointer<T>::value && std::is_same<TUnCVPtr, char>::value);
4181 template<
typename T>
4184 template<
typename T>
4194 template<
typename T>
4203 template<
typename T>
4240 template<
typename... Args>
4241 inline std::size_t
concat_length(
const char* cstr,
const Args& ... rest);
4243 template<
typename StringType,
typename... Args>
4244 inline std::size_t
concat_length(
const StringType& str,
const Args& ... rest);
4246 template<
typename... Args>
4252 template<
typename... Args>
4259 template<
typename StringType,
typename... Args>
4265 template<
typename OutStringType>
4269 template<
typename StringType,
typename Arg>
4272 template<
typename StringType,
typename Arg>
4275 template<
typename StringType,
typename Arg>
4278 template<
typename StringType,
typename Arg>
4281 template<
typename StringType,
typename Arg>
4282 using string_can_append_iter =
decltype(std::declval<StringType&>().append(std::declval<const Arg&>().begin(), std::declval<const Arg&>().end()));
4284 template<
typename StringType,
typename Arg>
4287 template<
typename StringType,
typename Arg>
4288 using string_can_append_data =
decltype(std::declval<StringType&>().append(std::declval<const Arg&>().data(), std::declval<const Arg&>().size()));
4290 template<
typename StringType,
typename Arg>
4293 template <
typename OutStringType,
typename Arg,
typename... Args,
4294 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
4296 inline void concat_into(OutStringType&
out, Arg&& arg, Args && ... rest);
4298 template <
typename OutStringType,
typename Arg,
typename... Args,
4299 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
4302 inline void concat_into(OutStringType&
out,
const Arg& arg, Args && ... rest);
4304 template <
typename OutStringType,
typename Arg,
typename... Args,
4305 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
4309 inline void concat_into(OutStringType&
out,
const Arg& arg, Args && ... rest);
4311 template<
typename OutStringType,
typename Arg,
typename... Args,
4315 out.append(std::forward<Arg>(arg));
4319 template <
typename OutStringType,
typename Arg,
typename... Args,
4320 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
4321 && detect_string_can_append_op<OutStringType, Arg>::value,
int > >
4322 inline void concat_into(OutStringType&
out, Arg&& arg, Args&& ... rest)
4324 out += std::forward<Arg>(arg);
4328 template <
typename OutStringType,
typename Arg,
typename... Args,
4329 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
4334 out.append(arg.begin(), arg.end());
4338 template <
typename OutStringType,
typename Arg,
typename... Args,
4339 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
4340 && !detect_string_can_append_op<OutStringType, Arg>::value
4341 && !detect_string_can_append_iter<OutStringType, Arg>::value
4342 && detect_string_can_append_data<OutStringType, Arg>::value,
int > >
4343 inline void concat_into(OutStringType&
out,
const Arg& arg, Args&& ... rest)
4345 out.append(arg.data(), arg.size());
4349 template<
typename OutStringType = std::string,
typename... Args>
4350 inline OutStringType
concat(Args && ... args)
4376 const char*
what() const noexcept
override
4386 exception(
int id_, const
char* what_arg) :
id(id_),
m(what_arg) {}
4388 static std::string
name(
const std::string& ename,
int id_)
4390 return concat(
"[json.exception.", ename,
'.', std::to_string(id_),
"] ");
4398 template<
typename BasicJsonType>
4402 std::vector<std::string> tokens;
4403 for (
const auto* current = leaf_element; current !=
nullptr && current->m_parent !=
nullptr; current = current->m_parent)
4405 switch (current->m_parent->type())
4409 for (std::size_t i = 0; i < current->m_parent->m_data.m_value.array->size(); ++i)
4411 if (¤t->m_parent->m_data.m_value.array->operator[](i) == current)
4413 tokens.emplace_back(std::to_string(i));
4422 for (
const auto& element : *current->m_parent->m_data.m_value.object)
4424 if (&element.second == current)
4426 tokens.emplace_back(element.first.c_str());
4451 auto str = std::accumulate(tokens.rbegin(), tokens.rend(), std::string{},
4452 [](
const std::string& a,
const std::string& b)
4454 return concat(a,
'/', detail::escape(b));
4456 return concat(
'(', str,
") ");
4458 static_cast<void>(leaf_element);
4465 std::runtime_error
m;
4482 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value,
int> = 0>
4490 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value,
int> = 0>
4491 static parse_error create(
int id_, std::size_t byte_,
const std::string& what_arg, BasicJsonContext context)
4494 (byte_ != 0 ? (
concat(
" at byte ", std::to_string(byte_))) :
""),
4496 return { id_, byte_, w.c_str() };
4526 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value,
int> = 0>
4530 return { id_, w.c_str() };
4544 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value,
int> = 0>
4548 return { id_, w.c_str() };
4561 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value,
int> = 0>
4565 return { id_, w.c_str() };
4578 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value,
int> = 0>
4582 return { id_, w.c_str() };
4635#if JSON_HAS_EXPERIMENTAL_FILESYSTEM
4636#include <experimental/filesystem>
4640 namespace std_fs = std::experimental::filesystem;
4643#elif JSON_HAS_FILESYSTEM
4644#include <filesystem>
4648 namespace std_fs = std::filesystem;
4664 template<
typename BasicJsonType>
4665 inline void from_json(
const BasicJsonType& j,
typename std::nullptr_t& n)
4675 template <
typename BasicJsonType,
typename ArithmeticType,
4676 enable_if_t < std::is_arithmetic<ArithmeticType>::value &&
4677 !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,
4681 switch (
static_cast<value_t>(j))
4685 val =
static_cast<ArithmeticType
>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
4690 val =
static_cast<ArithmeticType
>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
4695 val =
static_cast<ArithmeticType
>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
4711 template<
typename BasicJsonType>
4712 inline void from_json(
const BasicJsonType& j,
typename BasicJsonType::boolean_t& b)
4718 b = *j.template get_ptr<const typename BasicJsonType::boolean_t*>();
4721 template<
typename BasicJsonType>
4722 inline void from_json(
const BasicJsonType& j,
typename BasicJsonType::string_t& s)
4728 s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
4732 typename BasicJsonType,
typename StringType,
4734 std::is_assignable<StringType&, const typename BasicJsonType::string_t>::value
4735 && is_detected_exact<typename BasicJsonType::string_t::value_type, value_type_t, StringType>::value
4736 && !std::is_same<typename BasicJsonType::string_t, StringType>::value
4737 && !is_json_ref<StringType>::value,
int > = 0 >
4738 inline void from_json(
const BasicJsonType& j, StringType& s)
4745 s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
4748 template<
typename BasicJsonType>
4749 inline void from_json(
const BasicJsonType& j,
typename BasicJsonType::number_float_t& val)
4754 template<
typename BasicJsonType>
4755 inline void from_json(
const BasicJsonType& j,
typename BasicJsonType::number_unsigned_t& val)
4760 template<
typename BasicJsonType>
4761 inline void from_json(
const BasicJsonType& j,
typename BasicJsonType::number_integer_t& val)
4766#if !JSON_DISABLE_ENUM_SERIALIZATION
4767 template<
typename BasicJsonType,
typename EnumType,
4768 enable_if_t<std::is_enum<EnumType>::value,
int> = 0>
4771 typename std::underlying_type<EnumType>::type val;
4773 e =
static_cast<EnumType
>(val);
4778 template<
typename BasicJsonType,
typename T,
typename Allocator,
4779 enable_if_t<is_getable<BasicJsonType, T>::value,
int> = 0>
4780 inline void from_json(
const BasicJsonType& j, std::forward_list<T, Allocator>& l)
4787 std::transform(j.rbegin(), j.rend(),
4788 std::front_inserter(l), [](
const BasicJsonType& i)
4790 return i.template get<T>();
4795 template<
typename BasicJsonType,
typename T,
4796 enable_if_t<is_getable<BasicJsonType, T>::value,
int> = 0>
4797 inline void from_json(
const BasicJsonType& j, std::valarray<T>& l)
4804 std::transform(j.begin(), j.end(), std::begin(l),
4805 [](
const BasicJsonType& elem)
4807 return elem.template get<T>();
4811 template<
typename BasicJsonType,
typename T, std::
size_t N>
4813 ->
decltype(j.template
get<T>(), void())
4815 for (std::size_t i = 0; i <
N; ++i)
4817 arr[i] = j.at(i).template
get<T>();
4821 template<
typename BasicJsonType>
4824 arr = *j.template get_ptr<const typename BasicJsonType::array_t*>();
4827 template<
typename BasicJsonType,
typename T, std::
size_t N>
4830 ->
decltype(j.template
get<T>(), void())
4832 for (std::size_t i = 0; i <
N; ++i)
4834 arr[i] = j.at(i).template
get<T>();
4838 template<
typename BasicJsonType,
typename ConstructibleArrayType,
4840 std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value,
4844 arr.reserve(std::declval<typename ConstructibleArrayType::size_type>()),
4850 ConstructibleArrayType ret;
4851 ret.reserve(j.size());
4852 std::transform(j.begin(), j.end(),
4853 std::inserter(ret, end(ret)), [](
const BasicJsonType& i)
4859 arr = std::move(ret);
4862 template<
typename BasicJsonType,
typename ConstructibleArrayType,
4864 std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value,
4871 ConstructibleArrayType ret;
4873 j.begin(), j.end(), std::inserter(ret, end(ret)),
4874 [](
const BasicJsonType& i)
4880 arr = std::move(ret);
4883 template <
typename BasicJsonType,
typename ConstructibleArrayType,
4885 is_constructible_array_type<BasicJsonType, ConstructibleArrayType>::value &&
4886 !is_constructible_object_type<BasicJsonType, ConstructibleArrayType>::value &&
4888 !std::is_same<ConstructibleArrayType, typename BasicJsonType::binary_t>::value &&
4889 !is_basic_json<ConstructibleArrayType>::value,
4891 auto from_json(
const BasicJsonType& j, ConstructibleArrayType& arr)
4904 template <
typename BasicJsonType,
typename T, std::size_t... Idx >
4908 return { { std::forward<BasicJsonType>(j).at(Idx).template
get<T>()... } };
4911 template <
typename BasicJsonType,
typename T, std::
size_t N >
4923 template<
typename BasicJsonType>
4924 inline void from_json(
const BasicJsonType& j,
typename BasicJsonType::binary_t& bin)
4931 bin = *j.template get_ptr<const typename BasicJsonType::binary_t*>();
4934 template<
typename BasicJsonType,
typename ConstructibleObjectType,
4935 enable_if_t<is_constructible_object_type<BasicJsonType, ConstructibleObjectType>::value,
int> = 0>
4936 inline void from_json(
const BasicJsonType& j, ConstructibleObjectType& obj)
4943 ConstructibleObjectType ret;
4944 const auto* inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>();
4945 using value_type =
typename ConstructibleObjectType::value_type;
4947 inner_object->begin(), inner_object->end(),
4948 std::inserter(ret, ret.begin()),
4949 [](
typename BasicJsonType::object_t::value_type
const& p)
4951 return value_type(p.first, p.second.template get<typename ConstructibleObjectType::mapped_type>());
4953 obj = std::move(ret);
4960 template <
typename BasicJsonType,
typename ArithmeticType,
4962 std::is_arithmetic<ArithmeticType>::value &&
4963 !std::is_same<ArithmeticType, typename BasicJsonType::number_unsigned_t>::value &&
4964 !std::is_same<ArithmeticType, typename BasicJsonType::number_integer_t>::value &&
4965 !std::is_same<ArithmeticType, typename BasicJsonType::number_float_t>::value &&
4966 !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,
4968 inline void from_json(
const BasicJsonType& j, ArithmeticType& val)
4970 switch (
static_cast<value_t>(j))
4974 val =
static_cast<ArithmeticType
>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
4979 val =
static_cast<ArithmeticType
>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
4984 val =
static_cast<ArithmeticType
>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
4989 val =
static_cast<ArithmeticType
>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>());
5004 template<
typename BasicJsonType,
typename... Args, std::size_t... Idx>
5007 return std::make_tuple(std::forward<BasicJsonType>(j).at(Idx).
template get<Args>()...);
5010 template <
typename BasicJsonType,
class A1,
class A2 >
5013 return { std::forward<BasicJsonType>(j).at(0).template
get<A1>(),
5014 std::forward<BasicJsonType>(j).at(1).template
get<A2>() };
5017 template<
typename BasicJsonType,
typename A1,
typename A2>
5023 template<
typename BasicJsonType,
typename... Args>
5029 template<
typename BasicJsonType,
typename... Args>
5035 template<
typename BasicJsonType,
typename TupleRelated>
5047 template <
typename BasicJsonType,
typename Key,
typename Value,
typename Compare,
typename Allocator,
5049 typename BasicJsonType::string_t, Key >
::value >>
5050 inline void from_json(
const BasicJsonType& j, std::map<Key, Value, Compare, Allocator>& m)
5057 for (
const auto& p : j)
5067 template <
typename BasicJsonType,
typename Key,
typename Value,
typename Hash,
typename KeyEqual,
typename Allocator,
5069 typename BasicJsonType::string_t, Key >
::value >>
5070 inline void from_json(
const BasicJsonType& j, std::unordered_map<Key, Value, Hash, KeyEqual, Allocator>& m)
5077 for (
const auto& p : j)
5087#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
5088 template<
typename BasicJsonType>
5089 inline void from_json(
const BasicJsonType& j, std_fs::path& p)
5095 p = *j.template get_ptr<const typename BasicJsonType::string_t*>();
5101 template<
typename BasicJsonType,
typename T>
5103 noexcept(
noexcept(
from_json(j, std::forward<T>(val))))
5104 ->
decltype(
from_json(j, std::forward<T>(val)))
5106 return from_json(j, std::forward<T>(val));
5112#ifndef JSON_HAS_CPP_17
5121#ifndef JSON_HAS_CPP_17
5142#include <type_traits>
5179 template<
typename string_type>
5183 using std::to_string;
5194 using string_type =
typename std::remove_cv< typename std::remove_reference<decltype(std::declval<IteratorType>().key()) >::type >::type;
5211 noexcept(
std::is_nothrow_move_constructible<IteratorType>::
value
5221 noexcept(
std::is_nothrow_move_constructible<IteratorType>::
value
5224 noexcept(
std::is_nothrow_move_assignable<IteratorType>::
value
5268 switch (
anchor.m_object->type())
5300 typename IteratorType::reference
value()
const
5342 template<std::
size_t N,
typename IteratorType, enable_if_t<N == 0,
int> = 0>
5343 auto get(
const nlohmann::detail::iteration_proxy_value<IteratorType>& i) ->
decltype(i.key())
5350 template<std::
size_t N,
typename IteratorType, enable_if_t<N == 1,
int> = 0>
5351 auto get(
const nlohmann::detail::iteration_proxy_value<IteratorType>& i) ->
decltype(i.value())
5366#if defined(__clang__)
5368#pragma clang diagnostic push
5369#pragma clang diagnostic ignored "-Wmismatched-tags"
5371 template<
typename IteratorType>
5372 class tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>>
5373 :
public std::integral_constant<std::size_t, 2> {};
5375 template<std::
size_t N,
typename IteratorType>
5376 class tuple_element<
N, ::nlohmann::detail::iteration_proxy_value<IteratorType >>
5380 get<N>(std::declval <
5381 ::nlohmann::detail::iteration_proxy_value<IteratorType >> ()));
5383#if defined(__clang__)
5384#pragma clang diagnostic pop
5390template <
typename IteratorType>
5391inline constexpr bool ::std::ranges::enable_borrowed_range<::nlohmann::detail::iteration_proxy<IteratorType>> =
true;
5425 template<
typename BasicJsonType>
5426 static void construct(BasicJsonType& j,
typename BasicJsonType::boolean_t b)
noexcept
5428 j.m_data.m_value.destroy(j.m_data.m_type);
5430 j.m_data.m_value = b;
5431 j.assert_invariant();
5438 template<
typename BasicJsonType>
5439 static void construct(BasicJsonType& j,
const typename BasicJsonType::string_t& s)
5441 j.m_data.m_value.destroy(j.m_data.m_type);
5443 j.m_data.m_value = s;
5444 j.assert_invariant();
5447 template<
typename BasicJsonType>
5448 static void construct(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
5450 j.m_data.m_value.destroy(j.m_data.m_type);
5452 j.m_data.m_value = std::move(s);
5453 j.assert_invariant();
5456 template <
typename BasicJsonType,
typename CompatibleStringType,
5457 enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,
5459 static void construct(BasicJsonType& j,
const CompatibleStringType& str)
5461 j.m_data.m_value.destroy(j.m_data.m_type);
5463 j.m_data.m_value.string = j.template create<typename BasicJsonType::string_t>(str);
5464 j.assert_invariant();
5471 template<
typename BasicJsonType>
5472 static void construct(BasicJsonType& j,
const typename BasicJsonType::binary_t& b)
5474 j.m_data.m_value.destroy(j.m_data.m_type);
5476 j.m_data.m_value =
typename BasicJsonType::binary_t(b);
5477 j.assert_invariant();
5480 template<
typename BasicJsonType>
5481 static void construct(BasicJsonType& j,
typename BasicJsonType::binary_t&& b)
5483 j.m_data.m_value.destroy(j.m_data.m_type);
5485 j.m_data.m_value =
typename BasicJsonType::binary_t(std::move(b));
5486 j.assert_invariant();
5493 template<
typename BasicJsonType>
5494 static void construct(BasicJsonType& j,
typename BasicJsonType::number_float_t val)
noexcept
5496 j.m_data.m_value.destroy(j.m_data.m_type);
5498 j.m_data.m_value = val;
5499 j.assert_invariant();
5506 template<
typename BasicJsonType>
5507 static void construct(BasicJsonType& j,
typename BasicJsonType::number_unsigned_t val)
noexcept
5509 j.m_data.m_value.destroy(j.m_data.m_type);
5511 j.m_data.m_value = val;
5512 j.assert_invariant();
5519 template<
typename BasicJsonType>
5520 static void construct(BasicJsonType& j,
typename BasicJsonType::number_integer_t val)
noexcept
5522 j.m_data.m_value.destroy(j.m_data.m_type);
5524 j.m_data.m_value = val;
5525 j.assert_invariant();
5532 template<
typename BasicJsonType>
5533 static void construct(BasicJsonType& j,
const typename BasicJsonType::array_t& arr)
5535 j.m_data.m_value.destroy(j.m_data.m_type);
5537 j.m_data.m_value = arr;
5539 j.assert_invariant();
5542 template<
typename BasicJsonType>
5543 static void construct(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
5545 j.m_data.m_value.destroy(j.m_data.m_type);
5547 j.m_data.m_value = std::move(arr);
5549 j.assert_invariant();
5552 template <
typename BasicJsonType,
typename CompatibleArrayType,
5553 enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,
5555 static void construct(BasicJsonType& j,
const CompatibleArrayType& arr)
5560 j.m_data.m_value.destroy(j.m_data.m_type);
5562 j.m_data.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
5564 j.assert_invariant();
5567 template<
typename BasicJsonType>
5568 static void construct(BasicJsonType& j,
const std::vector<bool>& arr)
5570 j.m_data.m_value.destroy(j.m_data.m_type);
5573 j.m_data.m_value.array->reserve(arr.size());
5574 for (
const bool x : arr)
5576 j.m_data.m_value.array->push_back(x);
5577 j.set_parent(j.m_data.m_value.array->back());
5579 j.assert_invariant();
5582 template<
typename BasicJsonType,
typename T,
5584 static void construct(BasicJsonType& j,
const std::valarray<T>& arr)
5586 j.m_data.m_value.destroy(j.m_data.m_type);
5589 j.m_data.m_value.array->resize(arr.size());
5592 std::copy(std::begin(arr), std::end(arr), j.m_data.m_value.array->begin());
5595 j.assert_invariant();
5602 template<
typename BasicJsonType>
5603 static void construct(BasicJsonType& j,
const typename BasicJsonType::object_t& obj)
5605 j.m_data.m_value.destroy(j.m_data.m_type);
5607 j.m_data.m_value = obj;
5609 j.assert_invariant();
5612 template<
typename BasicJsonType>
5613 static void construct(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
5615 j.m_data.m_value.destroy(j.m_data.m_type);
5617 j.m_data.m_value = std::move(obj);
5619 j.assert_invariant();
5622 template <
typename BasicJsonType,
typename CompatibleObjectType,
5623 enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value,
int > = 0 >
5624 static void construct(BasicJsonType& j,
const CompatibleObjectType& obj)
5629 j.m_data.m_value.destroy(j.m_data.m_type);
5631 j.m_data.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
5633 j.assert_invariant();
5641 template<
typename BasicJsonType,
typename T,
5642 enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value,
int> = 0>
5648 template <
typename BasicJsonType,
typename BoolRef,
5650 ((std::is_same<std::vector<bool>::reference, BoolRef>
::value
5651 && !std::is_same <std::vector<bool>::reference,
typename BasicJsonType::boolean_t&>
::value)
5652 || (std::is_same<std::vector<bool>::const_reference, BoolRef>
::value
5653 && !std::is_same <detail::uncvref_t<std::vector<bool>::const_reference>,
5654 typename BasicJsonType::boolean_t >
::value))
5655 && std::is_convertible<const BoolRef&, typename BasicJsonType::boolean_t>::value,
int > = 0 >
5656 inline void to_json(BasicJsonType& j,
const BoolRef& b)
noexcept
5661 template<
typename BasicJsonType,
typename CompatibleString,
5662 enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value,
int> = 0>
5663 inline void to_json(BasicJsonType& j,
const CompatibleString& s)
5668 template<
typename BasicJsonType>
5669 inline void to_json(BasicJsonType& j,
typename BasicJsonType::string_t&& s)
5674 template<
typename BasicJsonType,
typename FloatType,
5675 enable_if_t<std::is_floating_point<FloatType>::value,
int> = 0>
5676 inline void to_json(BasicJsonType& j, FloatType val)
noexcept
5681 template<
typename BasicJsonType,
typename CompatibleNumberUnsignedType,
5682 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value,
int> = 0>
5683 inline void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val)
noexcept
5688 template<
typename BasicJsonType,
typename CompatibleNumberIntegerType,
5689 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value,
int> = 0>
5690 inline void to_json(BasicJsonType& j, CompatibleNumberIntegerType val)
noexcept
5695#if !JSON_DISABLE_ENUM_SERIALIZATION
5696 template<
typename BasicJsonType,
typename EnumType,
5697 enable_if_t<std::is_enum<EnumType>::value,
int> = 0>
5698 inline void to_json(BasicJsonType& j, EnumType e)
noexcept
5700 using underlying_type =
typename std::underlying_type<EnumType>::type;
5706 template<
typename BasicJsonType>
5707 inline void to_json(BasicJsonType& j,
const std::vector<bool>& e)
5712 template <
typename BasicJsonType,
typename CompatibleArrayType,
5713 enable_if_t < is_compatible_array_type<BasicJsonType,
5714 CompatibleArrayType>
::value &&
5715 !is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value &&
5717 !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value &&
5718 !is_basic_json<CompatibleArrayType>::value,
5720 inline void to_json(BasicJsonType& j,
const CompatibleArrayType& arr)
5725 template<
typename BasicJsonType>
5726 inline void to_json(BasicJsonType& j,
const typename BasicJsonType::binary_t& bin)
5731 template<
typename BasicJsonType,
typename T,
5732 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
5733 inline void to_json(BasicJsonType& j,
const std::valarray<T>& arr)
5738 template<
typename BasicJsonType>
5739 inline void to_json(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
5744 template <
typename BasicJsonType,
typename CompatibleObjectType,
5745 enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value && !is_basic_json<CompatibleObjectType>::value,
int > = 0 >
5746 inline void to_json(BasicJsonType& j,
const CompatibleObjectType& obj)
5751 template<
typename BasicJsonType>
5752 inline void to_json(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
5758 typename BasicJsonType,
typename T, std::size_t
N,
5759 enable_if_t < !std::is_constructible<
typename BasicJsonType::string_t,
5767 template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value,
int > = 0 >
5768 inline void to_json(BasicJsonType& j,
const std::pair<T1, T2>& p)
5770 j = { p.first, p.second };
5774 template<
typename BasicJsonType,
typename T,
5778 j = { {b.key(), b.value()} };
5781 template<
typename BasicJsonType,
typename Tuple, std::size_t... Idx>
5784 j = { std::get<Idx>(t)... };
5787 template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value,
int > = 0>
5788 inline void to_json(BasicJsonType& j,
const T& t)
5793#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
5794 template<
typename BasicJsonType>
5795 inline void to_json(BasicJsonType& j,
const std_fs::path& p)
5803 template<
typename BasicJsonType,
typename T>
5805 ->
decltype(
to_json(j, std::forward<T>(val)),
void())
5807 return to_json(j, std::forward<T>(val));
5812#ifndef JSON_HAS_CPP_17
5821#ifndef JSON_HAS_CPP_17
5833template<
typename ValueType,
typename>
5838 template<
typename BasicJsonType,
typename TargetType = ValueType>
5839 static auto from_json(BasicJsonType&& j, TargetType& val)
noexcept(
5840 noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val)))
5841 ->
decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), val),
void())
5843 ::nlohmann::from_json(std::forward<BasicJsonType>(j), val);
5848 template<
typename BasicJsonType,
typename TargetType = ValueType>
5853 return ::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {});
5858 template<
typename BasicJsonType,
typename TargetType = ValueType>
5859 static auto to_json(BasicJsonType& j, TargetType&& val)
noexcept(
5860 noexcept(::nlohmann::to_json(j, std::forward<TargetType>(val))))
5861 ->
decltype(::nlohmann::to_json(j, std::forward<TargetType>(val)),
void())
5863 ::nlohmann::to_json(j, std::forward<TargetType>(val));
5891template<
typename BinaryType>
5935 return !(rhs == *
this);
5994#include <functional>
6006 inline std::size_t
combine(std::size_t seed, std::size_t h)
noexcept
6008 seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U);
6023 template<
typename BasicJsonType>
6024 std::size_t
hash(
const BasicJsonType& j)
6026 using string_t =
typename BasicJsonType::string_t;
6027 using number_integer_t =
typename BasicJsonType::number_integer_t;
6028 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
6029 using number_float_t =
typename BasicJsonType::number_float_t;
6031 const auto type =
static_cast<std::size_t
>(j.type());
6034 case BasicJsonType::value_t::null:
6035 case BasicJsonType::value_t::discarded:
6040 case BasicJsonType::value_t::object:
6042 auto seed =
combine(type, j.size());
6043 for (
const auto& element : j.items())
6045 const auto h = std::hash<string_t>{}(element.key());
6052 case BasicJsonType::value_t::array:
6054 auto seed =
combine(type, j.size());
6055 for (
const auto& element : j)
6062 case BasicJsonType::value_t::string:
6064 const auto h = std::hash<string_t>{}(j.template get_ref<const string_t&>());
6068 case BasicJsonType::value_t::boolean:
6070 const auto h = std::hash<bool>{}(j.template
get<bool>());
6074 case BasicJsonType::value_t::number_integer:
6080 case BasicJsonType::value_t::number_unsigned:
6086 case BasicJsonType::value_t::number_float:
6092 case BasicJsonType::value_t::binary:
6094 auto seed =
combine(type, j.get_binary().size());
6095 const auto h = std::hash<bool>{}(j.get_binary().has_subtype());
6097 seed =
combine(seed,
static_cast<std::size_t
>(j.get_binary().subtype()));
6098 for (
const auto byte : j.get_binary())
6100 seed =
combine(seed, std::hash<std::uint8_t> {}(byte));
6158#include <type_traits>
6210 return std::fgetc(
m_file);
6238 is->clear(
is->rdstate() & std::ios::eofbit);
6243 :
is(&i),
sb(i.rdbuf())
6252 :
is(rhs.is),
sb(rhs.sb)
6263 auto res =
sb->sbumpc();
6267 is->clear(
is->rdstate() | std::ios::eofbit);
6274 std::istream*
is =
nullptr;
6275 std::streambuf*
sb =
nullptr;
6281 template<
typename IteratorType>
6285 using char_type =
typename std::iterator_traits<IteratorType>::value_type;
6307 template<
typename BaseInputAdapter,
size_t T>
6316 template<
typename BaseInputAdapter,
size_t T>
6319 template<
typename BaseInputAdapter>
6324 std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
6325 size_t& utf8_bytes_index,
6326 size_t& utf8_bytes_filled)
6328 utf8_bytes_index = 0;
6332 utf8_bytes[0] = std::char_traits<char>::eof();
6333 utf8_bytes_filled = 1;
6338 const auto wc = input.get_character();
6343 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(wc);
6344 utf8_bytes_filled = 1;
6346 else if (wc <= 0x7FF)
6348 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xC0u | ((
static_cast<unsigned int>(wc) >> 6u) & 0x1Fu));
6349 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6350 utf8_bytes_filled = 2;
6352 else if (wc <= 0xFFFF)
6354 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xE0u | ((
static_cast<unsigned int>(wc) >> 12u) & 0x0Fu));
6355 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((
static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
6356 utf8_bytes[2] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6357 utf8_bytes_filled = 3;
6359 else if (wc <= 0x10FFFF)
6361 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xF0u | ((
static_cast<unsigned int>(wc) >> 18u) & 0x07u));
6362 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((
static_cast<unsigned int>(wc) >> 12u) & 0x3Fu));
6363 utf8_bytes[2] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((
static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
6364 utf8_bytes[3] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6365 utf8_bytes_filled = 4;
6370 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(wc);
6371 utf8_bytes_filled = 1;
6377 template<
typename BaseInputAdapter>
6382 std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
6383 size_t& utf8_bytes_index,
6384 size_t& utf8_bytes_filled)
6386 utf8_bytes_index = 0;
6390 utf8_bytes[0] = std::char_traits<char>::eof();
6391 utf8_bytes_filled = 1;
6396 const auto wc = input.get_character();
6401 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(wc);
6402 utf8_bytes_filled = 1;
6404 else if (wc <= 0x7FF)
6406 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xC0u | ((
static_cast<unsigned int>(wc) >> 6u)));
6407 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6408 utf8_bytes_filled = 2;
6410 else if (0xD800 > wc || wc >= 0xE000)
6412 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xE0u | ((
static_cast<unsigned int>(wc) >> 12u)));
6413 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((
static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
6414 utf8_bytes[2] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6415 utf8_bytes_filled = 3;
6421 const auto wc2 =
static_cast<unsigned int>(input.get_character());
6422 const auto charcode = 0x10000u + (((
static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu));
6423 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xF0u | (charcode >> 18u));
6424 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((charcode >> 12u) & 0x3Fu));
6425 utf8_bytes[2] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((charcode >> 6u) & 0x3Fu));
6426 utf8_bytes[3] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (charcode & 0x3Fu));
6427 utf8_bytes_filled = 4;
6431 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(wc);
6432 utf8_bytes_filled = 1;
6440 template<
typename BaseInputAdapter,
typename W
ideCharType>
6476 std::array<std::char_traits<char>::int_type, 4>
utf8_bytes = { {0, 0, 0, 0} };
6484 template<
typename IteratorType,
typename Enable =
void>
6488 using char_type =
typename std::iterator_traits<iterator_type>::value_type;
6493 return adapter_type(std::move(first), std::move(last));
6497 template<
typename T>
6507 template<
typename IteratorType>
6511 using char_type =
typename std::iterator_traits<iterator_type>::value_type;
6522 template<
typename IteratorType>
6526 return factory_type::create(first, last);
6539 template<
typename ContainerType,
typename Enable =
void>
6542 template<
typename ContainerType>
6544 void_t<decltype(begin(
std::declval<ContainerType>()), end(std::declval<ContainerType>()))>>
6556 template<
typename ContainerType>
6583 template <
typename CharT,
6584 typename std::enable_if <
6585 std::is_pointer<CharT>::value &&
6586 !std::is_array<CharT>::value&&
6587 std::is_integral<typename std::remove_pointer<CharT>::type>
::value &&
6588 sizeof(
typename std::remove_pointer<CharT>::type) == 1,
6592 auto length = std::strlen(
reinterpret_cast<const char*
>(b));
6593 const auto* ptr =
reinterpret_cast<const char*
>(b);
6597 template<
typename T, std::
size_t N>
6609 template <
typename CharT,
6610 typename std::enable_if <
6611 std::is_pointer<CharT>::value&&
6612 std::is_integral<typename std::remove_pointer<CharT>::type>
::value &&
6613 sizeof(
typename std::remove_pointer<CharT>::type) == 1,
6616 :
ia(
reinterpret_cast<const char*
>(b),
reinterpret_cast<const char*
>(b) + l) {}
6618 template<
class IteratorType,
6619 typename std::enable_if<
6620 std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>
::value,
6627 return std::move(
ia);
6670template<
typename BasicJsonType>
6774 const std::string& last_token,
6800 template<
typename BasicJsonType>
6922 template<
class Exception>
6924 const Exception& ex)
6927 static_cast<void>(ex);
6947 template<
typename Value>
6953 root = BasicJsonType(std::forward<Value>(v));
6961 ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v));
6962 return &(
ref_stack.back()->m_data.m_value.array->back());
6983 template<
typename BasicJsonType>
6997 const bool allow_exceptions_ =
true)
7058 auto val =
handle_value(BasicJsonType::value_t::object,
true);
7072 BasicJsonType k = BasicJsonType(val);
7112 if (it->is_discarded())
7128 auto val =
handle_value(BasicJsonType::value_t::array,
true);
7166 ref_stack.back()->m_data.m_value.array->pop_back();
7172 template<
class Exception>
7174 const Exception& ex)
7177 static_cast<void>(ex);
7206 template<
typename Value>
7207 std::pair<bool, BasicJsonType*>
handle_value(Value&& v,
const bool skip_callback =
false)
7215 return {
false,
nullptr };
7219 auto value = BasicJsonType(std::forward<Value>(v));
7227 return {
false,
nullptr };
7233 return {
true, &
root };
7240 return {
false,
nullptr };
7249 ref_stack.back()->m_data.m_value.array->emplace_back(std::move(
value));
7250 return {
true, &(
ref_stack.back()->m_data.m_value.array->back()) };
7262 return {
false,
nullptr };
7287 BasicJsonType
discarded = BasicJsonType::value_t::discarded;
7290 template<
typename BasicJsonType>
7385#include <initializer_list>
7407 template<
typename BasicJsonType>
7441 return "<uninitialized>";
7443 return "true literal";
7445 return "false literal";
7447 return "null literal";
7449 return "string literal";
7453 return "number literal";
7467 return "<parse error>";
7469 return "end of input";
7471 return "'[', '{', or a literal";
7474 return "unknown token";
7484 template<
typename BasicJsonType,
typename InputAdapterType>
7497 explicit lexer(InputAdapterType&& adapter,
bool ignore_comments_ =
false) noexcept
7498 :
ia(
std::move(adapter))
7519 const auto* loc = localeconv();
7521 return (loc->decimal_point ==
nullptr) ?
'.' : *(loc->decimal_point);
7549 const auto factors = { 12u, 8u, 4u, 0u };
7550 for (
const auto factor : factors)
7556 codepoint +=
static_cast<int>((
static_cast<unsigned int>(
current) - 0x30u) << factor);
7560 codepoint +=
static_cast<int>((
static_cast<unsigned int>(
current) - 0x37u) << factor);
7564 codepoint +=
static_cast<int>((
static_cast<unsigned int>(
current) - 0x57u) << factor);
7572 JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF);
7593 JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6);
7596 for (
auto range = ranges.begin(); range != ranges.end(); ++range)
7645 return token_type::parse_error;
7651 return token_type::value_string;
7696 int codepoint = codepoint1;
7700 error_message =
"invalid string: '\\u' must be followed by 4 hex digits";
7701 return token_type::parse_error;
7705 if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF)
7714 error_message =
"invalid string: '\\u' must be followed by 4 hex digits";
7715 return token_type::parse_error;
7722 codepoint =
static_cast<int>(
7724 (
static_cast<unsigned int>(codepoint1) << 10u)
7726 +
static_cast<unsigned int>(codepoint2)
7734 error_message =
"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
7735 return token_type::parse_error;
7740 error_message =
"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
7741 return token_type::parse_error;
7748 error_message =
"invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF";
7749 return token_type::parse_error;
7754 JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF);
7757 if (codepoint < 0x80)
7762 else if (codepoint <= 0x7FF)
7765 add(
static_cast<char_int_type>(0xC0u | (
static_cast<unsigned int>(codepoint) >> 6u)));
7766 add(
static_cast<char_int_type>(0x80u | (
static_cast<unsigned int>(codepoint) & 0x3Fu)));
7768 else if (codepoint <= 0xFFFF)
7771 add(
static_cast<char_int_type>(0xE0u | (
static_cast<unsigned int>(codepoint) >> 12u)));
7772 add(
static_cast<char_int_type>(0x80u | ((
static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
7773 add(
static_cast<char_int_type>(0x80u | (
static_cast<unsigned int>(codepoint) & 0x3Fu)));
7778 add(
static_cast<char_int_type>(0xF0u | (
static_cast<unsigned int>(codepoint) >> 18u)));
7779 add(
static_cast<char_int_type>(0x80u | ((
static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu)));
7780 add(
static_cast<char_int_type>(0x80u | ((
static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
7781 add(
static_cast<char_int_type>(0x80u | (
static_cast<unsigned int>(codepoint) & 0x3Fu)));
7789 error_message =
"invalid string: forbidden character after backslash";
7790 return token_type::parse_error;
7799 error_message =
"invalid string: control character U+0000 (NUL) must be escaped to \\u0000";
7800 return token_type::parse_error;
7805 error_message =
"invalid string: control character U+0001 (SOH) must be escaped to \\u0001";
7806 return token_type::parse_error;
7811 error_message =
"invalid string: control character U+0002 (STX) must be escaped to \\u0002";
7812 return token_type::parse_error;
7817 error_message =
"invalid string: control character U+0003 (ETX) must be escaped to \\u0003";
7818 return token_type::parse_error;
7823 error_message =
"invalid string: control character U+0004 (EOT) must be escaped to \\u0004";
7824 return token_type::parse_error;
7829 error_message =
"invalid string: control character U+0005 (ENQ) must be escaped to \\u0005";
7830 return token_type::parse_error;
7835 error_message =
"invalid string: control character U+0006 (ACK) must be escaped to \\u0006";
7836 return token_type::parse_error;
7841 error_message =
"invalid string: control character U+0007 (BEL) must be escaped to \\u0007";
7842 return token_type::parse_error;
7847 error_message =
"invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b";
7848 return token_type::parse_error;
7853 error_message =
"invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t";
7854 return token_type::parse_error;
7859 error_message =
"invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n";
7860 return token_type::parse_error;
7865 error_message =
"invalid string: control character U+000B (VT) must be escaped to \\u000B";
7866 return token_type::parse_error;
7871 error_message =
"invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f";
7872 return token_type::parse_error;
7877 error_message =
"invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r";
7878 return token_type::parse_error;
7883 error_message =
"invalid string: control character U+000E (SO) must be escaped to \\u000E";
7884 return token_type::parse_error;
7889 error_message =
"invalid string: control character U+000F (SI) must be escaped to \\u000F";
7890 return token_type::parse_error;
7895 error_message =
"invalid string: control character U+0010 (DLE) must be escaped to \\u0010";
7896 return token_type::parse_error;
7901 error_message =
"invalid string: control character U+0011 (DC1) must be escaped to \\u0011";
7902 return token_type::parse_error;
7907 error_message =
"invalid string: control character U+0012 (DC2) must be escaped to \\u0012";
7908 return token_type::parse_error;
7913 error_message =
"invalid string: control character U+0013 (DC3) must be escaped to \\u0013";
7914 return token_type::parse_error;
7919 error_message =
"invalid string: control character U+0014 (DC4) must be escaped to \\u0014";
7920 return token_type::parse_error;
7925 error_message =
"invalid string: control character U+0015 (NAK) must be escaped to \\u0015";
7926 return token_type::parse_error;
7931 error_message =
"invalid string: control character U+0016 (SYN) must be escaped to \\u0016";
7932 return token_type::parse_error;
7937 error_message =
"invalid string: control character U+0017 (ETB) must be escaped to \\u0017";
7938 return token_type::parse_error;
7943 error_message =
"invalid string: control character U+0018 (CAN) must be escaped to \\u0018";
7944 return token_type::parse_error;
7949 error_message =
"invalid string: control character U+0019 (EM) must be escaped to \\u0019";
7950 return token_type::parse_error;
7955 error_message =
"invalid string: control character U+001A (SUB) must be escaped to \\u001A";
7956 return token_type::parse_error;
7961 error_message =
"invalid string: control character U+001B (ESC) must be escaped to \\u001B";
7962 return token_type::parse_error;
7967 error_message =
"invalid string: control character U+001C (FS) must be escaped to \\u001C";
7968 return token_type::parse_error;
7973 error_message =
"invalid string: control character U+001D (GS) must be escaped to \\u001D";
7974 return token_type::parse_error;
7979 error_message =
"invalid string: control character U+001E (RS) must be escaped to \\u001E";
7980 return token_type::parse_error;
7985 error_message =
"invalid string: control character U+001F (US) must be escaped to \\u001F";
7986 return token_type::parse_error;
8123 return token_type::parse_error;
8133 return token_type::parse_error;
8157 return token_type::parse_error;
8167 return token_type::parse_error;
8177 return token_type::parse_error;
8189 return token_type::parse_error;
8199 return token_type::parse_error;
8208 return token_type::parse_error;
8279 error_message =
"invalid comment; expecting '/' or '*' after '/'";
8286 static
void strtof(
float& f, const
char* str,
char** endptr) noexcept
8288 f = std::strtof(str, endptr);
8292 static
void strtof(
double& f, const
char* str,
char** endptr) noexcept
8294 f = std::strtod(str, endptr);
8298 static
void strtof(
long double& f, const
char* str,
char** endptr) noexcept
8300 f = std::strtold(str, endptr);
8350 token_type number_type = token_type::value_unsigned;
8358 goto scan_number_minus;
8364 goto scan_number_zero;
8378 goto scan_number_any1;
8388 number_type = token_type::value_integer;
8394 goto scan_number_zero;
8408 goto scan_number_any1;
8414 return token_type::parse_error;
8425 goto scan_number_decimal1;
8432 goto scan_number_exponent;
8436 goto scan_number_done;
8455 goto scan_number_any1;
8461 goto scan_number_decimal1;
8468 goto scan_number_exponent;
8472 goto scan_number_done;
8475 scan_number_decimal1:
8477 number_type = token_type::value_float;
8492 goto scan_number_decimal2;
8498 return token_type::parse_error;
8502 scan_number_decimal2:
8518 goto scan_number_decimal2;
8525 goto scan_number_exponent;
8529 goto scan_number_done;
8532 scan_number_exponent:
8534 number_type = token_type::value_float;
8541 goto scan_number_sign;
8556 goto scan_number_any2;
8562 "invalid number; expected '+', '-', or digit after exponent";
8563 return token_type::parse_error;
8583 goto scan_number_any2;
8588 error_message =
"invalid number; expected digit after exponent sign";
8589 return token_type::parse_error;
8609 goto scan_number_any2;
8613 goto scan_number_done;
8621 char* endptr =
nullptr;
8625 if (number_type == token_type::value_unsigned)
8627 const auto x = std::strtoull(
token_buffer.data(), &endptr, 10);
8637 return token_type::value_unsigned;
8641 else if (number_type == token_type::value_integer)
8643 const auto x = std::strtoll(
token_buffer.data(), &endptr, 10);
8653 return token_type::value_integer;
8665 return token_type::value_float;
8678 for (std::size_t i = 1; i < length; ++i)
8683 return token_type::parse_error;
8714 ++
position.chars_read_current_line;
8734 position.chars_read_current_line = 0;
8755 if (
position.chars_read_current_line == 0)
8764 --
position.chars_read_current_line;
8777 token_buffer.push_back(
static_cast<typename string_t::value_type
>(c));
8828 if (
static_cast<unsigned char>(c) <=
'\x1F')
8831 std::array<char, 9> cs{ {} };
8832 static_cast<void>((std::snprintf)(cs.data(), cs.size(),
"<U+%.4X>",
static_cast<unsigned char>(c)));
8833 result += cs.data();
8838 result.push_back(
static_cast<std::string::value_type
>(c));
8865 return get() == 0xBB &&
get() == 0xBF;
8887 error_message =
"invalid BOM; must be 0xEF 0xBB 0xBF if given";
8888 return token_type::parse_error;
8899 return token_type::parse_error;
8910 return token_type::begin_array;
8912 return token_type::end_array;
8914 return token_type::begin_object;
8916 return token_type::end_object;
8918 return token_type::name_separator;
8920 return token_type::value_separator;
8926 return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true);
8931 return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false);
8936 return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null);
8961 return token_type::end_of_input;
8966 return token_type::parse_error;
9035 template<
typename T>
9038 template<
typename T>
9040 decltype(std::declval<T&>().boolean(std::declval<bool>()));
9042 template<
typename T,
typename Integer>
9044 decltype(std::declval<T&>().number_integer(std::declval<Integer>()));
9046 template<
typename T,
typename Un
signed>
9048 decltype(std::declval<T&>().number_unsigned(std::declval<Unsigned>()));
9050 template<
typename T,
typename Float,
typename String>
9052 std::declval<Float>(), std::declval<const String&>()));
9054 template<
typename T,
typename String>
9056 decltype(std::declval<T&>().string(std::declval<String&>()));
9058 template<
typename T,
typename Binary>
9060 decltype(std::declval<T&>().binary(std::declval<Binary&>()));
9062 template<
typename T>
9064 decltype(std::declval<T&>().start_object(std::declval<std::size_t>()));
9066 template<
typename T,
typename String>
9068 decltype(std::declval<T&>().key(std::declval<String&>()));
9070 template<
typename T>
9073 template<
typename T>
9075 decltype(std::declval<T&>().start_array(std::declval<std::size_t>()));
9077 template<
typename T>
9080 template<
typename T,
typename Exception>
9082 std::declval<std::size_t>(), std::declval<const std::string&>(),
9083 std::declval<const Exception&>()));
9085 template<
typename SAX,
typename BasicJsonType>
9090 "BasicJsonType must be of type basic_json<...>");
9116 template<
typename SAX,
typename BasicJsonType>
9121 "BasicJsonType must be of type basic_json<...>");
9132 "Missing/invalid function: bool null()");
9134 "Missing/invalid function: bool boolean(bool)");
9136 "Missing/invalid function: bool boolean(bool)");
9140 "Missing/invalid function: bool number_integer(number_integer_t)");
9144 "Missing/invalid function: bool number_unsigned(number_unsigned_t)");
9147 "Missing/invalid function: bool number_float(number_float_t, const string_t&)");
9150 "Missing/invalid function: bool string(string_t&)");
9153 "Missing/invalid function: bool binary(binary_t&)");
9155 "Missing/invalid function: bool start_object(std::size_t)");
9157 "Missing/invalid function: bool key(string_t&)");
9159 "Missing/invalid function: bool end_object()");
9161 "Missing/invalid function: bool start_array(std::size_t)");
9163 "Missing/invalid function: bool end_array()");
9166 "Missing/invalid function: bool parse_error(std::size_t, const "
9167 "std::string&, const exception&)");
9201 return *
reinterpret_cast<char*
>(&num) == 1;
9211 template<
typename BasicJsonType,
typename InputAdapterType,
typename SAX = json_sax_dom_parser<BasicJsonType>>
9252 const
bool strict = true,
9256 bool result =
false;
9315 std::int32_t document_size{};
9328 return sax->end_object();
9340 auto out = std::back_inserter(result);
9352 *
out++ =
static_cast<typename string_t::value_type
>(
current);
9367 template<
typename NumberType>
9389 template<
typename NumberType>
9400 std::uint8_t subtype{};
9402 result.set_subtype(subtype);
9418 const std::size_t element_type_parse_position)
9420 switch (element_type)
9454 return sax->boolean(
get() != 0);
9464 std::int32_t
value{};
9470 std::int64_t
value{};
9476 std::array<char, 3> cr{ {} };
9477 static_cast<void>((std::snprintf)(cr.data(), cr.size(),
"%.2hhX",
static_cast<unsigned char>(element_type)));
9478 const std::string cr_str{ cr.data() };
9479 return sax->parse_error(element_type_parse_position, cr_str,
9501 while (
auto element_type =
get())
9508 const std::size_t element_type_parse_position =
chars_read;
9514 if (!is_array && !
sax->key(
key))
9537 std::int32_t document_size{};
9550 return sax->end_array();
9603 std::uint8_t number{};
9609 std::uint16_t number{};
9615 std::uint32_t number{};
9621 std::uint64_t number{};
9650 return sax->number_integer(
static_cast<std::int8_t
>(0x20 - 1 -
current));
9654 std::uint8_t number{};
9660 std::uint16_t number{};
9666 std::uint32_t number{};
9672 std::uint64_t number{};
9783 std::uint16_t len{};
9789 std::uint32_t len{};
9795 std::uint64_t len{};
9800 return get_cbor_array(
static_cast<std::size_t
>(-1), tag_handler);
9837 std::uint16_t len{};
9843 std::uint32_t len{};
9849 std::uint64_t len{};
9876 switch (tag_handler)
9892 std::uint8_t subtype_to_ignore{};
9898 std::uint16_t subtype_to_ignore{};
9904 std::uint32_t subtype_to_ignore{};
9910 std::uint64_t subtype_to_ignore{};
9928 std::uint8_t subtype{};
9935 std::uint16_t subtype{};
9942 std::uint32_t subtype{};
9949 std::uint64_t subtype{};
9968 return sax->boolean(
false);
9971 return sax->boolean(
true);
9978 const auto byte1_raw =
get();
9983 const auto byte2_raw =
get();
9989 const auto byte1 =
static_cast<unsigned char>(byte1_raw);
9990 const auto byte2 =
static_cast<unsigned char>(byte2_raw);
10000 const auto half =
static_cast<unsigned int>((byte1 << 8u) + byte2);
10001 const double val = [&half]
10003 const int exp = (half >> 10u) & 0x1Fu;
10004 const unsigned int mant = half & 0x3FFu;
10010 return std::ldexp(mant, -24);
10013 ? std::numeric_limits<double>::infinity()
10014 : std::numeric_limits<double>::quiet_NaN();
10016 return std::ldexp(mant + 1024, exp - 25);
10019 return sax->number_float((half & 0x8000u) != 0
10096 std::uint8_t len{};
10102 std::uint16_t len{};
10108 std::uint32_t len{};
10114 std::uint64_t len{};
10120 while (
get() != 0xFF)
10127 result.append(chunk);
10192 std::uint8_t len{};
10199 std::uint16_t len{};
10206 std::uint32_t len{};
10213 std::uint64_t len{};
10220 while (
get() != 0xFF)
10227 result.insert(result.end(), chunk.begin(), chunk.end());
10255 if (len !=
static_cast<std::size_t
>(-1))
10257 for (std::size_t i = 0; i < len; ++i)
10267 while (
get() != 0xFF)
10276 return sax->end_array();
10296 if (len !=
static_cast<std::size_t
>(-1))
10298 for (std::size_t i = 0; i < len; ++i)
10315 while (
get() != 0xFF)
10331 return sax->end_object();
10560 return sax->null();
10563 return sax->boolean(
false);
10566 return sax->boolean(
true);
10598 std::uint8_t number{};
10604 std::uint16_t number{};
10610 std::uint32_t number{};
10616 std::uint64_t number{};
10622 std::int8_t number{};
10628 std::int16_t number{};
10634 std::int32_t number{};
10640 std::int64_t number{};
10646 std::uint16_t len{};
10652 std::uint32_t len{};
10658 std::uint16_t len{};
10664 std::uint32_t len{};
10701 return sax->number_integer(
static_cast<std::int8_t
>(
current));
10770 std::uint8_t len{};
10776 std::uint16_t len{};
10782 std::uint32_t len{};
10808 auto assign_and_return_true = [&result](std::int8_t subtype)
10810 result.set_subtype(
static_cast<std::uint8_t
>(subtype));
10818 std::uint8_t len{};
10825 std::uint16_t len{};
10832 std::uint32_t len{};
10839 std::uint8_t len{};
10840 std::int8_t subtype{};
10844 assign_and_return_true(subtype);
10849 std::uint16_t len{};
10850 std::int8_t subtype{};
10854 assign_and_return_true(subtype);
10859 std::uint32_t len{};
10860 std::int8_t subtype{};
10864 assign_and_return_true(subtype);
10869 std::int8_t subtype{};
10872 assign_and_return_true(subtype);
10877 std::int8_t subtype{};
10880 assign_and_return_true(subtype);
10885 std::int8_t subtype{};
10888 assign_and_return_true(subtype);
10893 std::int8_t subtype{};
10896 assign_and_return_true(subtype);
10901 std::int8_t subtype{};
10904 assign_and_return_true(subtype);
10923 for (std::size_t i = 0; i < len; ++i)
10931 return sax->end_array();
10946 for (std::size_t i = 0; i < len; ++i)
10961 return sax->end_object();
11010 std::uint8_t len{};
11022 std::int16_t len{};
11028 std::int32_t len{};
11034 std::int64_t len{};
11044 std::uint16_t len{};
11054 std::uint32_t len{};
11064 std::uint64_t len{};
11072 std::string message;
11076 message =
"expected length type specification (U, i, I, l, L); last byte: 0x" + last_token;
11080 message =
"expected length type specification (U, i, u, I, m, l, M, L); last byte: 0x" + last_token;
11091 std::pair<std::size_t, char_int_type> size_and_type;
11093 bool no_ndarray =
true;
11100 if (size_and_type.first !=
npos)
11102 if (size_and_type.second != 0)
11104 if (size_and_type.second !=
'N')
11106 for (std::size_t i = 0; i < size_and_type.first; ++i)
11112 dim.push_back(dimlen);
11118 for (std::size_t i = 0; i < size_and_type.first; ++i)
11124 dim.push_back(dimlen);
11136 dim.push_back(dimlen);
11165 std::uint8_t number{};
11170 result =
static_cast<std::size_t
>(number);
11176 std::int8_t number{};
11186 result =
static_cast<std::size_t
>(number);
11192 std::int16_t number{};
11202 result =
static_cast<std::size_t
>(number);
11208 std::int32_t number{};
11218 result =
static_cast<std::size_t
>(number);
11224 std::int64_t number{};
11239 result =
static_cast<std::size_t
>(number);
11249 std::uint16_t number{};
11254 result =
static_cast<std::size_t
>(number);
11264 std::uint32_t number{};
11279 std::uint64_t number{};
11303 std::vector<size_t> dim;
11308 if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1))
11310 result = dim.at(dim.size() - 1);
11333 if (result == 0 || result ==
npos)
11343 return sax->end_array();
11353 std::string message;
11357 message =
"expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token;
11361 message =
"expected length type specification (U, i, u, I, m, l, M, L) after '#'; last byte: 0x" + last_token;
11379 result.first =
npos;
11381 bool is_ndarray =
false;
11387 result.second =
get();
11389 &&
JSON_HEDLEY_UNLIKELY(std::binary_search(bjd_optimized_type_markers.begin(), bjd_optimized_type_markers.end(), result.second)))
11416 if (inside_ndarray)
11421 result.second |= (1 << 8);
11452 return sax->boolean(
true);
11454 return sax->boolean(
false);
11457 return sax->null();
11461 std::uint8_t number{};
11467 std::int8_t number{};
11473 std::int16_t number{};
11479 std::int32_t number{};
11485 std::int64_t number{};
11495 std::uint16_t number{};
11505 std::uint32_t number{};
11515 std::uint64_t number{};
11525 const auto byte1_raw =
get();
11530 const auto byte2_raw =
get();
11536 const auto byte1 =
static_cast<unsigned char>(byte1_raw);
11537 const auto byte2 =
static_cast<unsigned char>(byte2_raw);
11547 const auto half =
static_cast<unsigned int>((byte2 << 8u) + byte1);
11548 const double val = [&half]
11550 const int exp = (half >> 10u) & 0x1Fu;
11551 const unsigned int mant = half & 0x3FFu;
11557 return std::ldexp(mant, -24);
11560 ? std::numeric_limits<double>::infinity()
11561 : std::numeric_limits<double>::quiet_NaN();
11563 return std::ldexp(mant + 1024, exp - 25);
11566 return sax->number_float((half & 0x8000u) != 0
11602 return sax->string(s);
11629 std::pair<std::size_t, char_int_type> size_and_type;
11640 size_and_type.second &= ~(
static_cast<char_int_type>(1) << 8);
11643 return p.first < t;
11659 if (size_and_type.second ==
'C')
11661 size_and_type.second =
'U';
11664 key =
"_ArrayData_";
11670 for (std::size_t i = 0; i < size_and_type.first; ++i)
11678 return (
sax->end_array() &&
sax->end_object());
11681 if (size_and_type.first !=
npos)
11688 if (size_and_type.second != 0)
11690 if (size_and_type.second !=
'N')
11692 for (std::size_t i = 0; i < size_and_type.first; ++i)
11703 for (std::size_t i = 0; i < size_and_type.first; ++i)
11729 return sax->end_array();
11737 std::pair<std::size_t, char_int_type> size_and_type;
11752 if (size_and_type.first !=
npos)
11759 if (size_and_type.second != 0)
11761 for (std::size_t i = 0; i < size_and_type.first; ++i)
11776 for (std::size_t i = 0; i < size_and_type.first; ++i)
11812 return sax->end_object();
11821 std::size_t size{};
11822 bool no_ndarray =
true;
11830 std::vector<char> number_vector;
11831 for (std::size_t i = 0; i < size; ++i)
11838 number_vector.push_back(
static_cast<char>(
current));
11844 const auto result_number = number_lexer.scan();
11845 const auto number_string = number_lexer.get_token_string();
11846 const auto result_remainder = number_lexer.scan();
11856 switch (result_number)
11858 case token_type::value_integer:
11859 return sax->number_integer(number_lexer.get_number_integer());
11860 case token_type::value_unsigned:
11861 return sax->number_unsigned(number_lexer.get_number_unsigned());
11862 case token_type::value_float:
11863 return sax->number_float(number_lexer.get_number_float(), std::move(number_string));
11864 case token_type::uninitialized:
11865 case token_type::literal_true:
11866 case token_type::literal_false:
11867 case token_type::literal_null:
11868 case token_type::value_string:
11869 case token_type::begin_array:
11870 case token_type::begin_object:
11871 case token_type::end_array:
11872 case token_type::end_object:
11873 case token_type::name_separator:
11874 case token_type::value_separator:
11875 case token_type::parse_error:
11876 case token_type::end_of_input:
11877 case token_type::literal_or_value:
11931 template<
typename NumberType,
bool InputIsLittleEndian = false>
11935 std::array<std::uint8_t,
sizeof(NumberType)> vec{};
11936 for (std::size_t i = 0; i <
sizeof(NumberType); ++i)
11947 vec[
sizeof(NumberType) - i - 1] =
static_cast<std::uint8_t
>(
current);
11951 vec[i] =
static_cast<std::uint8_t
>(
current);
11956 std::memcpy(&result, vec.data(),
sizeof(NumberType));
11974 template<
typename NumberType>
11976 const NumberType len,
11979 bool success =
true;
11980 for (NumberType i = 0; i < len; i++)
11988 result.push_back(
static_cast<typename string_t::value_type
>(
current));
12007 template<
typename NumberType>
12009 const NumberType len,
12012 bool success =
true;
12013 for (NumberType i = 0; i < len; i++)
12021 result.push_back(
static_cast<std::uint8_t
>(
current));
12047 std::array<char, 3> cr{ {} };
12048 static_cast<void>((std::snprintf)(cr.data(), cr.size(),
"%.2hhX",
static_cast<unsigned char>(
current)));
12049 return std::string{ cr.data() };
12059 const std::string&
detail,
12060 const std::string& context)
const
12062 std::string error_msg =
"syntax error while parsing ";
12067 error_msg +=
"CBOR";
12071 error_msg +=
"MessagePack";
12075 error_msg +=
"UBJSON";
12079 error_msg +=
"BSON";
12083 error_msg +=
"BJData";
12116#define JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ \
12117 make_array<char_int_type>('F', 'H', 'N', 'S', 'T', 'Z', '[', '{')
12119#define JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ \
12120 make_array<bjd_type>( \
12121 bjd_type{'C', "char"}, \
12122 bjd_type{'D', "double"}, \
12123 bjd_type{'I', "int16"}, \
12124 bjd_type{'L', "int64"}, \
12125 bjd_type{'M', "uint64"}, \
12126 bjd_type{'U', "uint8"}, \
12127 bjd_type{'d', "single"}, \
12128 bjd_type{'i', "int8"}, \
12129 bjd_type{'l', "int32"}, \
12130 bjd_type{'m', "uint32"}, \
12131 bjd_type{'u', "uint16"})
12144#undef JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_
12145#undef JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_
12148#ifndef JSON_HAS_CPP_17
12149 template<
typename BasicJsonType,
typename InputAdapterType,
typename SAX>
12173#include <functional>
12218 template<
typename BasicJsonType>
12220 std::function<bool(
int ,
parse_event_t , BasicJsonType& )>;
12227 template<
typename BasicJsonType,
typename InputAdapterType>
12241 const bool allow_exceptions_ =
true,
12242 const bool skip_comments =
false)
12244 ,
m_lexer(
std::move(adapter), skip_comments)
12286 if (result.is_discarded())
12312 result.assert_invariant();
12327 template<
typename SAX>
12337 return sax->parse_error(
m_lexer.get_position(),
12346 template<
typename SAX>
12352 std::vector<bool> states;
12354 bool skip_to_state_evaluation =
false;
12358 if (!skip_to_state_evaluation)
12363 case token_type::begin_object:
12371 if (
get_token() == token_type::end_object)
12383 return sax->parse_error(
m_lexer.get_position(),
12395 return sax->parse_error(
m_lexer.get_position(),
12401 states.push_back(
false);
12408 case token_type::begin_array:
12416 if (
get_token() == token_type::end_array)
12426 states.push_back(
true);
12432 case token_type::value_float:
12434 const auto res =
m_lexer.get_number_float();
12438 return sax->parse_error(
m_lexer.get_position(),
12451 case token_type::literal_false:
12460 case token_type::literal_null:
12469 case token_type::literal_true:
12478 case token_type::value_integer:
12487 case token_type::value_string:
12496 case token_type::value_unsigned:
12505 case token_type::parse_error:
12508 return sax->parse_error(
m_lexer.get_position(),
12512 case token_type::end_of_input:
12516 return sax->parse_error(
m_lexer.get_position(),
12519 "attempting to parse an empty input; check that your input string or stream contains the expected JSON",
nullptr));
12522 return sax->parse_error(
m_lexer.get_position(),
12526 case token_type::uninitialized:
12527 case token_type::end_array:
12528 case token_type::end_object:
12529 case token_type::name_separator:
12530 case token_type::value_separator:
12531 case token_type::literal_or_value:
12534 return sax->parse_error(
m_lexer.get_position(),
12542 skip_to_state_evaluation =
false;
12546 if (states.empty())
12555 if (
get_token() == token_type::value_separator)
12576 skip_to_state_evaluation =
true;
12580 return sax->parse_error(
m_lexer.get_position(),
12588 if (
get_token() == token_type::value_separator)
12593 return sax->parse_error(
m_lexer.get_position(),
12606 return sax->parse_error(
m_lexer.get_position(),
12630 skip_to_state_evaluation =
true;
12634 return sax->parse_error(
m_lexer.get_position(),
12648 std::string error_msg =
"syntax error ";
12650 if (!context.empty())
12652 error_msg +=
concat(
"while parsing ", context,
' ');
12659 error_msg +=
concat(
m_lexer.get_error_message(),
"; last read: '",
12660 m_lexer.get_token_string(),
'\'');
12667 if (expected != token_type::uninitialized)
12775 return lhs.m_it == rhs.m_it;
12780 return lhs.m_it < rhs.m_it;
12785 auto result = *
this;
12792 return lhs.m_it - rhs.m_it;
12803 auto result = *
this;
12816 auto result = *
this;
12873#include <type_traits>
12895 template<
typename IteratorType>
class iteration_proxy;
12896 template<
typename IteratorType>
class iteration_proxy_value;
12914 template<
typename BasicJsonType>
12929 "iter_impl only accepts (const) basic_json");
12931 static_assert(std::is_base_of<std::bidirectional_iterator_tag, std::bidirectional_iterator_tag>::value
12932 && std::is_base_of<std::bidirectional_iterator_tag, typename std::iterator_traits<typename array_t::iterator>::iterator_category>
::value,
12933 "basic_json iterator assumes array and object type iterators satisfy the LegacyBidirectionalIterator named requirement.");
12948 using pointer =
typename std::conditional<std::is_const<BasicJsonType>::value,
12949 typename BasicJsonType::const_pointer,
12950 typename BasicJsonType::pointer>::type;
12953 typename std::conditional<std::is_const<BasicJsonType>::value,
12954 typename BasicJsonType::const_reference,
12955 typename BasicJsonType::reference>::type;
12972 switch (m_object->m_data.m_type)
12976 m_it.object_iterator =
typename object_t::iterator();
12982 m_it.array_iterator =
typename array_t::iterator();
13019 : m_object(other.m_object),
m_it(other.m_it)
13030 if (&other !=
this)
13032 m_object = other.m_object;
13044 : m_object(other.m_object),
m_it(other.m_it)
13055 m_object = other.m_object;
13065 void set_begin() noexcept
13069 switch (m_object->m_data.m_type)
13073 m_it.object_iterator = m_object->m_data.m_value.object->begin();
13079 m_it.array_iterator = m_object->m_data.m_value.array->begin();
13086 m_it.primitive_iterator.set_end();
13099 m_it.primitive_iterator.set_begin();
13113 switch (m_object->m_data.m_type)
13117 m_it.object_iterator = m_object->m_data.m_value.object->end();
13123 m_it.array_iterator = m_object->m_data.m_value.array->end();
13137 m_it.primitive_iterator.set_end();
13152 switch (m_object->m_data.m_type)
13156 JSON_ASSERT(
m_it.object_iterator != m_object->m_data.m_value.object->end());
13157 return m_it.object_iterator->second;
13162 JSON_ASSERT(
m_it.array_iterator != m_object->m_data.m_value.array->end());
13163 return *
m_it.array_iterator;
13196 switch (m_object->m_data.m_type)
13200 JSON_ASSERT(
m_it.object_iterator != m_object->m_data.m_value.object->end());
13201 return &(
m_it.object_iterator->second);
13206 JSON_ASSERT(
m_it.array_iterator != m_object->m_data.m_value.array->end());
13207 return &*
m_it.array_iterator;
13236 auto result = *
this;
13249 switch (m_object->m_data.m_type)
13253 std::advance(
m_it.object_iterator, 1);
13259 std::advance(
m_it.array_iterator, 1);
13273 ++
m_it.primitive_iterator;
13287 auto result = *
this;
13300 switch (m_object->m_data.m_type)
13304 std::advance(
m_it.object_iterator, -1);
13310 std::advance(
m_it.array_iterator, -1);
13324 --
m_it.primitive_iterator;
13336 template <
typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::
nullptr_t > =
nullptr >
13347 switch (m_object->m_data.m_type)
13350 return (
m_it.object_iterator == other.m_it.object_iterator);
13353 return (
m_it.array_iterator == other.m_it.array_iterator);
13364 return (
m_it.primitive_iterator == other.m_it.primitive_iterator);
13372 template <
typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::
nullptr_t > =
nullptr >
13392 switch (m_object->m_data.m_type)
13398 return (
m_it.array_iterator < other.
m_it.array_iterator);
13409 return (
m_it.primitive_iterator < other.
m_it.primitive_iterator);
13419 return !other.operator < (*this);
13448 switch (m_object->m_data.m_type)
13455 std::advance(
m_it.array_iterator, i);
13469 m_it.primitive_iterator += i;
13492 auto result = *
this;
13514 auto result = *
this;
13527 switch (m_object->m_data.m_type)
13533 return m_it.array_iterator - other.
m_it.array_iterator;
13544 return m_it.primitive_iterator - other.
m_it.primitive_iterator;
13556 switch (m_object->m_data.m_type)
13562 return *std::next(
m_it.array_iterator, n);
13590 const typename object_t::key_type&
key()
const
13596 return m_it.object_iterator->first;
13667 template<
typename Base>
13741 auto it = --this->base();
13748 auto it = --this->base();
13749 return it.operator * ();
13769#include <type_traits>
13792 std::is_same<T, void>::value,
13811#include <algorithm>
13839template<
typename RefStringType>
13849 template<
typename T>
13879 return detail::concat(a,
'/', detail::escape(b));
13923 return *
this /= std::to_string(array_idx);
14018 template<
typename BasicJsonType>
14021 using size_type =
typename BasicJsonType::size_type;
14035 const char* p = s.c_str();
14036 char* p_end =
nullptr;
14038 const unsigned long long res = std::strtoull(p, &p_end, 10);
14048 if (res >=
static_cast<unsigned long long>((std::numeric_limits<size_type>::max)()))
14053 return static_cast<size_type
>(res);
14078 template<
typename BasicJsonType>
14091 if (reference_token ==
"0")
14158 template<
typename BasicJsonType>
14164 if (ptr->is_null())
14168 std::all_of(reference_token.begin(), reference_token.end(),
14169 [](
const unsigned char x)
14171 return std::isdigit(x);
14175 *ptr = (nums || reference_token ==
"-")
14180 switch (ptr->type())
14185 ptr = &ptr->operator[](reference_token);
14191 if (reference_token ==
"-")
14194 ptr = &ptr->operator[](ptr->m_data.m_value.array->size());
14226 template<
typename BasicJsonType>
14231 switch (ptr->type())
14236 ptr = &ptr->at(reference_token);
14246 "array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
14247 ") is out of range"), ptr));
14284 template<
typename BasicJsonType>
14289 switch (ptr->type())
14294 ptr = &ptr->operator[](reference_token);
14333 template<
typename BasicJsonType>
14338 switch (ptr->type())
14343 ptr = &ptr->at(reference_token);
14353 "array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
14354 ") is out of range"), ptr));
14382 template<
typename BasicJsonType>
14387 switch (ptr->type())
14391 if (!ptr->contains(reference_token))
14397 ptr = &ptr->operator[](reference_token);
14408 if (
JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !(
"0" <= reference_token && reference_token <=
"9")))
14420 for (std::size_t i = 1; i < reference_token.size(); i++)
14431 if (idx >= ptr->size())
14437 ptr = &ptr->operator[](idx);
14473 std::vector<string_t>
result;
14476 if (reference_string.empty())
14492 std::size_t slash = reference_string.find_first_of(
'/', 1),
14499 start = (slash == string_t::npos) ? 0 : slash + 1,
14501 slash = reference_string.find_first_of(
'/', start))
14505 auto reference_token = reference_string.substr(start, slash - start);
14508 for (std::size_t pos = reference_token.find_first_of(
'~');
14509 pos != string_t::npos;
14510 pos = reference_token.find_first_of(
'~', pos + 1))
14516 (reference_token[pos + 1] !=
'0' &&
14517 reference_token[pos + 1] !=
'1')))
14525 result.push_back(reference_token);
14539 template<
typename BasicJsonType>
14541 const BasicJsonType& value,
14544 switch (value.type())
14548 if (value.m_data.m_value.array->empty())
14551 result[reference_string] =
nullptr;
14556 for (std::size_t i = 0; i < value.m_data.m_value.array->size(); ++i)
14559 value.m_data.m_value.array->operator[](i),
result);
14567 if (value.m_data.m_value.object->empty())
14570 result[reference_string] =
nullptr;
14575 for (
const auto& element : *value.m_data.m_value.object)
14594 result[reference_string] = value;
14610 template<
typename BasicJsonType>
14611 static BasicJsonType
14622 for (
const auto& element : *value.m_data.m_value.object)
14655#if JSON_HAS_THREE_WAY_COMPARISON
14658 template<
typename RefStringTypeRhs>
14661 return reference_tokens == rhs.reference_tokens;
14669 return *
this == json_pointer(rhs);
14673 template<
typename RefStringTypeRhs>
14674 std::strong_ordering operator<=>(
const json_pointer<RefStringTypeRhs>& rhs)
const noexcept
14676 return reference_tokens <=> rhs.reference_tokens;
14681 template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14683 friend bool operator==(
const json_pointer<RefStringTypeLhs>& lhs,
14684 const json_pointer<RefStringTypeRhs>& rhs)
noexcept;
14688 template<
typename RefStringTypeLhs,
typename StringType>
14690 friend bool operator==(
const json_pointer<RefStringTypeLhs>& lhs,
14691 const StringType& rhs);
14695 template<
typename RefStringTypeRhs,
typename StringType>
14697 friend bool operator==(
const StringType& lhs,
14698 const json_pointer<RefStringTypeRhs>& rhs);
14702 template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14704 friend bool operator!=(
const json_pointer<RefStringTypeLhs>& lhs,
14705 const json_pointer<RefStringTypeRhs>& rhs)
noexcept;
14709 template<
typename RefStringTypeLhs,
typename StringType>
14711 friend bool operator!=(
const json_pointer<RefStringTypeLhs>& lhs,
14712 const StringType& rhs);
14716 template<
typename RefStringTypeRhs,
typename StringType>
14718 friend bool operator!=(
const StringType& lhs,
14719 const json_pointer<RefStringTypeRhs>& rhs);
14722 template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14724 friend bool operator<(
const json_pointer<RefStringTypeLhs>& lhs,
14725 const json_pointer<RefStringTypeRhs>& rhs)
noexcept;
14733#if !JSON_HAS_THREE_WAY_COMPARISON
14735template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14739 return lhs.reference_tokens == rhs.reference_tokens;
14742template<
typename RefStringTypeLhs,
14746 const StringType& rhs)
14751template<
typename RefStringTypeRhs,
14754inline
bool operator==(const StringType& lhs,
14760template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14764 return !(lhs == rhs);
14767template<
typename RefStringTypeLhs,
14771 const StringType& rhs)
14773 return !(lhs == rhs);
14776template<
typename RefStringTypeRhs,
14779inline
bool operator!=(const StringType& lhs,
14782 return !(lhs == rhs);
14785template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14789 return lhs.reference_tokens < rhs.reference_tokens;
14806#include <initializer_list>
14818 template<
typename BasicJsonType>
14898#include <algorithm>
14924#include <algorithm>
14958 template<typename CharType>
14962 template<typename CharType, typename AllocatorType =
std::allocator<CharType>>
14978 v.insert(
v.end(), s, s + length);
14982 std::vector<CharType, AllocatorType>&
v;
14987 template<
typename CharType>
15003 stream.write(s,
static_cast<std::streamsize
>(length));
15012 template<
typename CharType,
typename StringType = std::basic_
string<CharType>>
15028 str.append(s, length);
15035 template<
typename CharType,
typename StringType = std::basic_
string<CharType>>
15039 template<
typename AllocatorType = std::allocator<CharType>>
15077 template<
typename BasicJsonType,
typename CharType>
15140 oa->write_character(j.m_data.m_value.boolean
15148 if (j.m_data.m_value.number_integer >= 0)
15153 if (j.m_data.m_value.number_integer <= 0x17)
15155 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15157 else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())
15160 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15162 else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())
15165 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.number_integer));
15167 else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())
15170 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.number_integer));
15175 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.number_integer));
15182 const auto positive_number = -1 - j.m_data.m_value.number_integer;
15183 if (j.m_data.m_value.number_integer >= -24)
15185 write_number(
static_cast<std::uint8_t
>(0x20 + positive_number));
15187 else if (positive_number <= (std::numeric_limits<std::uint8_t>::max)())
15190 write_number(
static_cast<std::uint8_t
>(positive_number));
15192 else if (positive_number <= (std::numeric_limits<std::uint16_t>::max)())
15195 write_number(
static_cast<std::uint16_t
>(positive_number));
15197 else if (positive_number <= (std::numeric_limits<std::uint32_t>::max)())
15200 write_number(
static_cast<std::uint32_t
>(positive_number));
15205 write_number(
static_cast<std::uint64_t
>(positive_number));
15213 if (j.m_data.m_value.number_unsigned <= 0x17)
15215 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_unsigned));
15217 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
15220 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_unsigned));
15222 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
15225 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.number_unsigned));
15227 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
15230 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.number_unsigned));
15235 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.number_unsigned));
15242 if (std::isnan(j.m_data.m_value.number_float))
15249 else if (std::isinf(j.m_data.m_value.number_float))
15266 const auto N = j.m_data.m_value.string->size();
15271 else if (
N <= (std::numeric_limits<std::uint8_t>::max)())
15276 else if (
N <= (std::numeric_limits<std::uint16_t>::max)())
15281 else if (
N <= (std::numeric_limits<std::uint32_t>::max)())
15287 else if (
N <= (std::numeric_limits<std::uint64_t>::max)())
15295 oa->write_characters(
15296 reinterpret_cast<const CharType*
>(j.m_data.m_value.string->c_str()),
15297 j.m_data.m_value.string->size());
15304 const auto N = j.m_data.m_value.array->size();
15309 else if (
N <= (std::numeric_limits<std::uint8_t>::max)())
15314 else if (
N <= (std::numeric_limits<std::uint16_t>::max)())
15319 else if (
N <= (std::numeric_limits<std::uint32_t>::max)())
15325 else if (
N <= (std::numeric_limits<std::uint64_t>::max)())
15333 for (
const auto& el : *j.m_data.m_value.array)
15342 if (j.m_data.m_value.binary->has_subtype())
15344 if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint8_t>::max)())
15347 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.binary->subtype()));
15349 else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint16_t>::max)())
15352 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.binary->subtype()));
15354 else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint32_t>::max)())
15357 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.binary->subtype()));
15359 else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint64_t>::max)())
15362 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.binary->subtype()));
15367 const auto N = j.m_data.m_value.binary->size();
15372 else if (
N <= (std::numeric_limits<std::uint8_t>::max)())
15377 else if (
N <= (std::numeric_limits<std::uint16_t>::max)())
15382 else if (
N <= (std::numeric_limits<std::uint32_t>::max)())
15388 else if (
N <= (std::numeric_limits<std::uint64_t>::max)())
15396 oa->write_characters(
15397 reinterpret_cast<const CharType*
>(j.m_data.m_value.binary->data()),
15406 const auto N = j.m_data.m_value.object->size();
15411 else if (
N <= (std::numeric_limits<std::uint8_t>::max)())
15416 else if (
N <= (std::numeric_limits<std::uint16_t>::max)())
15421 else if (
N <= (std::numeric_limits<std::uint32_t>::max)())
15427 else if (
N <= (std::numeric_limits<std::uint64_t>::max)())
15435 for (
const auto& el : *j.m_data.m_value.object)
15464 oa->write_character(j.m_data.m_value.boolean
15472 if (j.m_data.m_value.number_integer >= 0)
15477 if (j.m_data.m_value.number_unsigned < 128)
15480 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15482 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
15486 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15488 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
15492 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.number_integer));
15494 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
15498 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.number_integer));
15500 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
15504 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.number_integer));
15509 if (j.m_data.m_value.number_integer >= -32)
15512 write_number(
static_cast<std::int8_t
>(j.m_data.m_value.number_integer));
15514 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() &&
15515 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())
15519 write_number(
static_cast<std::int8_t
>(j.m_data.m_value.number_integer));
15521 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() &&
15522 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())
15526 write_number(
static_cast<std::int16_t
>(j.m_data.m_value.number_integer));
15528 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() &&
15529 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())
15533 write_number(
static_cast<std::int32_t
>(j.m_data.m_value.number_integer));
15535 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() &&
15536 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())
15540 write_number(
static_cast<std::int64_t
>(j.m_data.m_value.number_integer));
15548 if (j.m_data.m_value.number_unsigned < 128)
15551 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15553 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
15557 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15559 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
15563 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.number_integer));
15565 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
15569 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.number_integer));
15571 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
15575 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.number_integer));
15589 const auto N = j.m_data.m_value.string->size();
15595 else if (
N <= (std::numeric_limits<std::uint8_t>::max)())
15601 else if (
N <= (std::numeric_limits<std::uint16_t>::max)())
15607 else if (
N <= (std::numeric_limits<std::uint32_t>::max)())
15615 oa->write_characters(
15616 reinterpret_cast<const CharType*
>(j.m_data.m_value.string->c_str()),
15617 j.m_data.m_value.string->size());
15624 const auto N = j.m_data.m_value.array->size();
15630 else if (
N <= (std::numeric_limits<std::uint16_t>::max)())
15636 else if (
N <= (std::numeric_limits<std::uint32_t>::max)())
15644 for (
const auto& el : *j.m_data.m_value.array)
15655 const bool use_ext = j.m_data.m_value.binary->has_subtype();
15658 const auto N = j.m_data.m_value.binary->size();
15659 if (
N <= (std::numeric_limits<std::uint8_t>::max)())
15661 std::uint8_t output_type{};
15668 output_type = 0xD4;
15671 output_type = 0xD5;
15674 output_type = 0xD6;
15677 output_type = 0xD7;
15680 output_type = 0xD8;
15683 output_type = 0xC7;
15691 output_type = 0xC4;
15701 else if (
N <= (std::numeric_limits<std::uint16_t>::max)())
15703 const std::uint8_t output_type = use_ext
15710 else if (
N <= (std::numeric_limits<std::uint32_t>::max)())
15712 const std::uint8_t output_type = use_ext
15723 write_number(
static_cast<std::int8_t
>(j.m_data.m_value.binary->subtype()));
15727 oa->write_characters(
15728 reinterpret_cast<const CharType*
>(j.m_data.m_value.binary->data()),
15737 const auto N = j.m_data.m_value.object->size();
15743 else if (
N <= (std::numeric_limits<std::uint16_t>::max)())
15749 else if (
N <= (std::numeric_limits<std::uint32_t>::max)())
15757 for (
const auto& el : *j.m_data.m_value.object)
15779 const bool use_type,
const bool add_prefix =
true,
15780 const bool use_bjdata =
false)
15797 oa->write_character(j.m_data.m_value.boolean
15829 oa->write_characters(
15830 reinterpret_cast<const CharType*
>(j.m_data.m_value.string->c_str()),
15831 j.m_data.m_value.string->size());
15842 bool prefix_required =
true;
15843 if (use_type && !j.m_data.m_value.array->empty())
15846 const CharType first_prefix =
ubjson_prefix(j.front(), use_bjdata);
15847 const bool same_prefix = std::all_of(j.begin() + 1, j.end(),
15848 [
this, first_prefix, use_bjdata](
const BasicJsonType& v)
15850 return ubjson_prefix(v, use_bjdata) == first_prefix;
15853 std::vector<CharType> bjdx = {
'[',
'{',
'S',
'H',
'T',
'F',
'N',
'Z' };
15855 if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end()))
15857 prefix_required =
false;
15859 oa->write_character(first_prefix);
15869 for (
const auto& el : *j.m_data.m_value.array)
15871 write_ubjson(el, use_count, use_type, prefix_required, use_bjdata);
15889 if (use_type && !j.m_data.m_value.binary->empty())
15893 oa->write_character(
'U');
15904 oa->write_characters(
15905 reinterpret_cast<const CharType*
>(j.m_data.m_value.binary->data()),
15906 j.m_data.m_value.binary->size());
15910 for (
size_t i = 0; i < j.m_data.m_value.binary->size(); ++i)
15913 oa->write_character(j.m_data.m_value.binary->data()[i]);
15927 if (use_bjdata && j.m_data.m_value.object->size() == 3 && j.m_data.m_value.object->find(
"_ArrayType_") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find(
"_ArraySize_") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find(
"_ArrayData_") != j.m_data.m_value.object->end())
15940 bool prefix_required =
true;
15941 if (use_type && !j.m_data.m_value.object->empty())
15944 const CharType first_prefix =
ubjson_prefix(j.front(), use_bjdata);
15945 const bool same_prefix = std::all_of(j.begin(), j.end(),
15946 [
this, first_prefix, use_bjdata](
const BasicJsonType& v)
15948 return ubjson_prefix(v, use_bjdata) == first_prefix;
15951 std::vector<CharType> bjdx = {
'[',
'{',
'S',
'H',
'T',
'F',
'N',
'Z' };
15953 if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end()))
15955 prefix_required =
false;
15957 oa->write_character(first_prefix);
15967 for (
const auto& el : *j.m_data.m_value.object)
15970 oa->write_characters(
15971 reinterpret_cast<const CharType*
>(el.first.c_str()),
15973 write_ubjson(el.second, use_count, use_type, prefix_required, use_bjdata);
16001 const auto it = name.find(
static_cast<typename string_t::value_type
>(0));
16005 static_cast<void>(j);
16008 return 1ul + name.size() + 1u;
16015 const std::uint8_t element_type)
16018 oa->write_characters(
16019 reinterpret_cast<const CharType*
>(name.c_str()),
16037 const double value)
16048 return sizeof(std::int32_t) +
value.size() + 1ul;
16060 oa->write_characters(
16061 reinterpret_cast<const CharType*
>(
value.c_str()),
16078 return (std::numeric_limits<std::int32_t>::min)() <=
value &&
value <= (std::numeric_limits<std::int32_t>::max)()
16079 ?
sizeof(std::int32_t)
16080 :
sizeof(std::int64_t);
16087 const std::int64_t
value)
16089 if ((std::numeric_limits<std::int32_t>::min)() <=
value &&
value <= (std::numeric_limits<std::int32_t>::max)())
16106 return (
value <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int32_t>::max)()))
16107 ?
sizeof(std::int32_t)
16108 :
sizeof(std::int64_t);
16115 const BasicJsonType& j)
16117 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int32_t>::max)()))
16122 else if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int64_t>::max)()))
16129 JSON_THROW(
out_of_range::create(407,
concat(
"integer number ", std::to_string(j.m_data.m_value.number_unsigned),
" cannot be represented by BSON as it does not fit int64"), &j));
16137 const typename BasicJsonType::object_t&
value)
16148 std::size_t array_index = 0ul;
16150 const std::size_t embedded_document_size = std::accumulate(std::begin(
value), std::end(
value),
static_cast<std::size_t
>(0), [&array_index](std::size_t result,
const typename BasicJsonType::array_t::value_type& el)
16155 return sizeof(std::int32_t) + embedded_document_size + 1ul;
16163 return sizeof(std::int32_t) +
value.size() + 1ul;
16170 const typename BasicJsonType::array_t&
value)
16175 std::size_t array_index = 0ul;
16177 for (
const auto& el :
value)
16194 write_number(
value.has_subtype() ?
static_cast<std::uint8_t
>(
value.subtype()) :
static_cast<std::uint8_t
>(0x00));
16196 oa->write_characters(
reinterpret_cast<const CharType*
>(
value.data()),
value.size());
16204 const BasicJsonType& j)
16219 return header_size + 1ul;
16222 return header_size + 8ul;
16234 return header_size + 0ul;
16252 const BasicJsonType& j)
16300 const std::size_t document_size = std::accumulate(
value.begin(),
value.end(),
static_cast<std::size_t
>(0),
16301 [](
size_t result,
const typename BasicJsonType::object_t::value_type& el)
16303 return result += calc_bson_element_size(el.first, el.second);
16306 return sizeof(std::int32_t) + document_size + 1ul;
16317 for (
const auto& el :
value)
16358 template<
typename NumberType,
typename std::enable_if<
16359 std::is_floating_point<NumberType>::value,
int>::type = 0>
16361 const bool add_prefix,
16362 const bool use_bjdata)
16372 template<
typename NumberType,
typename std::enable_if<
16373 std::is_unsigned<NumberType>::value,
int>::type = 0>
16375 const bool add_prefix,
16376 const bool use_bjdata)
16378 if (n <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int8_t>::max)()))
16384 write_number(
static_cast<std::uint8_t
>(n), use_bjdata);
16386 else if (n <= (std::numeric_limits<std::uint8_t>::max)())
16392 write_number(
static_cast<std::uint8_t
>(n), use_bjdata);
16394 else if (n <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int16_t>::max)()))
16400 write_number(
static_cast<std::int16_t
>(n), use_bjdata);
16402 else if (use_bjdata && n <=
static_cast<uint64_t
>((std::numeric_limits<uint16_t>::max)()))
16408 write_number(
static_cast<std::uint16_t
>(n), use_bjdata);
16410 else if (n <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int32_t>::max)()))
16416 write_number(
static_cast<std::int32_t
>(n), use_bjdata);
16418 else if (use_bjdata && n <=
static_cast<uint64_t
>((std::numeric_limits<uint32_t>::max)()))
16424 write_number(
static_cast<std::uint32_t
>(n), use_bjdata);
16426 else if (n <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int64_t>::max)()))
16432 write_number(
static_cast<std::int64_t
>(n), use_bjdata);
16434 else if (use_bjdata && n <= (std::numeric_limits<uint64_t>::max)())
16440 write_number(
static_cast<std::uint64_t
>(n), use_bjdata);
16449 const auto number = BasicJsonType(n).dump();
16451 for (std::size_t i = 0; i < number.size(); ++i)
16453 oa->write_character(
to_char_type(
static_cast<std::uint8_t
>(number[i])));
16459 template <
typename NumberType,
typename std::enable_if <
16460 std::is_signed<NumberType>::value &&
16461 !std::is_floating_point<NumberType>::value,
int >::type = 0 >
16463 const bool add_prefix,
16464 const bool use_bjdata)
16466 if ((std::numeric_limits<std::int8_t>::min)() <= n && n <= (std::numeric_limits<std::int8_t>::max)())
16472 write_number(
static_cast<std::int8_t
>(n), use_bjdata);
16474 else if (
static_cast<std::int64_t
>((std::numeric_limits<std::uint8_t>::min)()) <= n && n <=
static_cast<std::int64_t
>((std::numeric_limits<std::uint8_t>::max)()))
16480 write_number(
static_cast<std::uint8_t
>(n), use_bjdata);
16482 else if ((std::numeric_limits<std::int16_t>::min)() <= n && n <= (std::numeric_limits<std::int16_t>::max)())
16488 write_number(
static_cast<std::int16_t
>(n), use_bjdata);
16490 else if (use_bjdata && (
static_cast<std::int64_t
>((std::numeric_limits<std::uint16_t>::min)()) <= n && n <=
static_cast<std::int64_t
>((std::numeric_limits<std::uint16_t>::max)())))
16498 else if ((std::numeric_limits<std::int32_t>::min)() <= n && n <= (std::numeric_limits<std::int32_t>::max)())
16504 write_number(
static_cast<std::int32_t
>(n), use_bjdata);
16506 else if (use_bjdata && (
static_cast<std::int64_t
>((std::numeric_limits<std::uint32_t>::min)()) <= n && n <=
static_cast<std::int64_t
>((std::numeric_limits<std::uint32_t>::max)())))
16514 else if ((std::numeric_limits<std::int64_t>::min)() <= n && n <= (std::numeric_limits<std::int64_t>::max)())
16520 write_number(
static_cast<std::int64_t
>(n), use_bjdata);
16530 const auto number = BasicJsonType(n).dump();
16532 for (std::size_t i = 0; i < number.size(); ++i)
16534 oa->write_character(
to_char_type(
static_cast<std::uint8_t
>(number[i])));
16543 CharType
ubjson_prefix(
const BasicJsonType& j,
const bool use_bjdata)
const noexcept
16551 return j.m_data.m_value.boolean ?
'T' :
'F';
16555 if ((std::numeric_limits<std::int8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())
16559 if ((std::numeric_limits<std::uint8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())
16563 if ((std::numeric_limits<std::int16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())
16567 if (use_bjdata && ((std::numeric_limits<std::uint16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)()))
16571 if ((std::numeric_limits<std::int32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())
16575 if (use_bjdata && ((std::numeric_limits<std::uint32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)()))
16579 if ((std::numeric_limits<std::int64_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())
16589 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int8_t>::max)()))
16593 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::uint8_t>::max)()))
16597 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int16_t>::max)()))
16601 if (use_bjdata && j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::uint16_t>::max)()))
16605 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int32_t>::max)()))
16609 if (use_bjdata && j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::uint32_t>::max)()))
16613 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int64_t>::max)()))
16617 if (use_bjdata && j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
16659 std::map<string_t, CharType> bjdtype = { {
"uint8",
'U'}, {
"int8",
'i'}, {
"uint16",
'u'}, {
"int16",
'I'},
16660 {
"uint32",
'm'}, {
"int32",
'l'}, {
"uint64",
'M'}, {
"int64",
'L'}, {
"single",
'd'}, {
"double",
'D'}, {
"char",
'C'}
16665 if (it == bjdtype.end())
16669 CharType dtype = it->second;
16671 key =
"_ArraySize_";
16672 std::size_t len = (
value.at(
key).empty() ? 0 : 1);
16673 for (
const auto& el :
value.at(
key))
16675 len *=
static_cast<std::size_t
>(el.m_data.m_value.number_unsigned);
16678 key =
"_ArrayData_";
16684 oa->write_character(
'[');
16685 oa->write_character(
'$');
16686 oa->write_character(dtype);
16687 oa->write_character(
'#');
16689 key =
"_ArraySize_";
16692 key =
"_ArrayData_";
16693 if (dtype ==
'U' || dtype ==
'C')
16695 for (
const auto& el :
value.at(
key))
16697 write_number(
static_cast<std::uint8_t
>(el.m_data.m_value.number_unsigned),
true);
16700 else if (dtype ==
'i')
16702 for (
const auto& el :
value.at(
key))
16704 write_number(
static_cast<std::int8_t
>(el.m_data.m_value.number_integer),
true);
16707 else if (dtype ==
'u')
16709 for (
const auto& el :
value.at(
key))
16711 write_number(
static_cast<std::uint16_t
>(el.m_data.m_value.number_unsigned),
true);
16714 else if (dtype ==
'I')
16716 for (
const auto& el :
value.at(
key))
16718 write_number(
static_cast<std::int16_t
>(el.m_data.m_value.number_integer),
true);
16721 else if (dtype ==
'm')
16723 for (
const auto& el :
value.at(
key))
16725 write_number(
static_cast<std::uint32_t
>(el.m_data.m_value.number_unsigned),
true);
16728 else if (dtype ==
'l')
16730 for (
const auto& el :
value.at(
key))
16732 write_number(
static_cast<std::int32_t
>(el.m_data.m_value.number_integer),
true);
16735 else if (dtype ==
'M')
16737 for (
const auto& el :
value.at(
key))
16739 write_number(
static_cast<std::uint64_t
>(el.m_data.m_value.number_unsigned),
true);
16742 else if (dtype ==
'L')
16744 for (
const auto& el :
value.at(
key))
16746 write_number(
static_cast<std::int64_t
>(el.m_data.m_value.number_integer),
true);
16749 else if (dtype ==
'd')
16751 for (
const auto& el :
value.at(
key))
16753 write_number(
static_cast<float>(el.m_data.m_value.number_float),
true);
16756 else if (dtype ==
'D')
16758 for (
const auto& el :
value.at(
key))
16760 write_number(
static_cast<double>(el.m_data.m_value.number_float),
true);
16783 template<
typename NumberType>
16787 std::array<CharType,
sizeof(NumberType)> vec{};
16788 std::memcpy(vec.data(), &n,
sizeof(NumberType));
16794 std::reverse(vec.begin(), vec.end());
16797 oa->write_characters(vec.data(),
sizeof(NumberType));
16803#pragma GCC diagnostic push
16804#pragma GCC diagnostic ignored "-Wfloat-equal"
16806 if (
static_cast<double>(n) >=
static_cast<double>(std::numeric_limits<float>::lowest()) &&
16807 static_cast<double>(n) <=
static_cast<double>((std::numeric_limits<float>::max)()) &&
16808 static_cast<double>(
static_cast<float>(n)) ==
static_cast<double>(n))
16823#pragma GCC diagnostic pop
16832 template <
typename C = CharType,
16833 enable_if_t < std::is_signed<C>::value&& std::is_signed<char>::value >* =
nullptr >
16836 return *
reinterpret_cast<char*
>(&x);
16839 template <
typename C = CharType,
16840 enable_if_t < std::is_signed<C>::value&& std::is_unsigned<char>::value >* =
nullptr >
16843 static_assert(
sizeof(std::uint8_t) ==
sizeof(CharType),
"size of CharType must be equal to std::uint8_t");
16844 static_assert(std::is_trivial<CharType>::value,
"CharType must be trivial");
16846 std::memcpy(&result, &x,
sizeof(x));
16850 template<
typename C = CharType,
16857 template <
typename InputCharType,
typename C = CharType,
16859 std::is_signed<C>::value&&
16860 std::is_signed<char>::value&&
16861 std::is_same<char, typename std::remove_cv<InputCharType>::type>
::value
16893#include <algorithm>
16903#include <type_traits>
16923#include <type_traits>
16954 template<
typename Target,
typename Source>
16957 static_assert(
sizeof(Target) ==
sizeof(Source),
"size mismatch");
16960 std::memcpy(&target, &source,
sizeof(Source));
16971 constexpr diyfp(std::uint64_t f_,
int e_) noexcept :
f(f_),
e(e_) {}
16982 return { x.f - y.f, x.e };
16991 static_assert(
kPrecision == 64,
"internal error");
17016 const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;
17017 const std::uint64_t u_hi = x.f >> 32u;
17018 const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;
17019 const std::uint64_t v_hi = y.f >> 32u;
17021 const std::uint64_t p0 = u_lo * v_lo;
17022 const std::uint64_t p1 = u_lo * v_hi;
17023 const std::uint64_t p2 = u_hi * v_lo;
17024 const std::uint64_t p3 = u_hi * v_hi;
17026 const std::uint64_t p0_hi = p0 >> 32u;
17027 const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu;
17028 const std::uint64_t p1_hi = p1 >> 32u;
17029 const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu;
17030 const std::uint64_t p2_hi = p2 >> 32u;
17032 std::uint64_t Q = p0_hi + p1_lo + p2_lo;
17043 Q += std::uint64_t{ 1 } << (64u - 32u - 1u);
17045 const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u);
17047 return { h, x.e + y.e + 64 };
17058 while ((x.f >> 63u) == 0)
17073 const int delta = x.e - target_exponent;
17078 return { x.f << delta, target_exponent };
17095 template<
typename FloatType>
17108 static_assert(std::numeric_limits<FloatType>::is_iec559,
17109 "internal error: dtoa_short requires an IEEE-754 floating-point implementation");
17111 constexpr int kPrecision = std::numeric_limits<FloatType>::digits;
17112 constexpr int kBias = std::numeric_limits<FloatType>::max_exponent - 1 + (kPrecision - 1);
17113 constexpr int kMinExp = 1 - kBias;
17114 constexpr std::uint64_t kHiddenBit = std::uint64_t{ 1 } << (kPrecision - 1);
17116 using bits_type =
typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;
17119 const std::uint64_t E = bits >> (kPrecision - 1);
17120 const std::uint64_t F = bits & (kHiddenBit - 1);
17122 const bool is_denormal = E == 0;
17123 const diyfp v = is_denormal
17124 ?
diyfp(F, kMinExp)
17125 :
diyfp(F + kHiddenBit,
static_cast<int>(E) - kBias);
17148 const bool lower_boundary_is_closer = F == 0 && E > 1;
17150 const diyfp m_minus = lower_boundary_is_closer
17151 ?
diyfp(4 * v.
f - 1, v.
e - 2)
17152 :
diyfp(2 * v.
f - 1, v.
e - 1);
17287 constexpr int kCachedPowersMinDecExp = -300;
17288 constexpr int kCachedPowersDecStep = 8;
17290 static constexpr std::array<cached_power, 79> kCachedPowers =
17293 { 0xAB70FE17C79AC6CA, -1060, -300 },
17294 { 0xFF77B1FCBEBCDC4F, -1034, -292 },
17295 { 0xBE5691EF416BD60C, -1007, -284 },
17296 { 0x8DD01FAD907FFC3C, -980, -276 },
17297 { 0xD3515C2831559A83, -954, -268 },
17298 { 0x9D71AC8FADA6C9B5, -927, -260 },
17299 { 0xEA9C227723EE8BCB, -901, -252 },
17300 { 0xAECC49914078536D, -874, -244 },
17301 { 0x823C12795DB6CE57, -847, -236 },
17302 { 0xC21094364DFB5637, -821, -228 },
17303 { 0x9096EA6F3848984F, -794, -220 },
17304 { 0xD77485CB25823AC7, -768, -212 },
17305 { 0xA086CFCD97BF97F4, -741, -204 },
17306 { 0xEF340A98172AACE5, -715, -196 },
17307 { 0xB23867FB2A35B28E, -688, -188 },
17308 { 0x84C8D4DFD2C63F3B, -661, -180 },
17309 { 0xC5DD44271AD3CDBA, -635, -172 },
17310 { 0x936B9FCEBB25C996, -608, -164 },
17311 { 0xDBAC6C247D62A584, -582, -156 },
17312 { 0xA3AB66580D5FDAF6, -555, -148 },
17313 { 0xF3E2F893DEC3F126, -529, -140 },
17314 { 0xB5B5ADA8AAFF80B8, -502, -132 },
17315 { 0x87625F056C7C4A8B, -475, -124 },
17316 { 0xC9BCFF6034C13053, -449, -116 },
17317 { 0x964E858C91BA2655, -422, -108 },
17318 { 0xDFF9772470297EBD, -396, -100 },
17319 { 0xA6DFBD9FB8E5B88F, -369, -92 },
17320 { 0xF8A95FCF88747D94, -343, -84 },
17321 { 0xB94470938FA89BCF, -316, -76 },
17322 { 0x8A08F0F8BF0F156B, -289, -68 },
17323 { 0xCDB02555653131B6, -263, -60 },
17324 { 0x993FE2C6D07B7FAC, -236, -52 },
17325 { 0xE45C10C42A2B3B06, -210, -44 },
17326 { 0xAA242499697392D3, -183, -36 },
17327 { 0xFD87B5F28300CA0E, -157, -28 },
17328 { 0xBCE5086492111AEB, -130, -20 },
17329 { 0x8CBCCC096F5088CC, -103, -12 },
17330 { 0xD1B71758E219652C, -77, -4 },
17331 { 0x9C40000000000000, -50, 4 },
17332 { 0xE8D4A51000000000, -24, 12 },
17333 { 0xAD78EBC5AC620000, 3, 20 },
17334 { 0x813F3978F8940984, 30, 28 },
17335 { 0xC097CE7BC90715B3, 56, 36 },
17336 { 0x8F7E32CE7BEA5C70, 83, 44 },
17337 { 0xD5D238A4ABE98068, 109, 52 },
17338 { 0x9F4F2726179A2245, 136, 60 },
17339 { 0xED63A231D4C4FB27, 162, 68 },
17340 { 0xB0DE65388CC8ADA8, 189, 76 },
17341 { 0x83C7088E1AAB65DB, 216, 84 },
17342 { 0xC45D1DF942711D9A, 242, 92 },
17343 { 0x924D692CA61BE758, 269, 100 },
17344 { 0xDA01EE641A708DEA, 295, 108 },
17345 { 0xA26DA3999AEF774A, 322, 116 },
17346 { 0xF209787BB47D6B85, 348, 124 },
17347 { 0xB454E4A179DD1877, 375, 132 },
17348 { 0x865B86925B9BC5C2, 402, 140 },
17349 { 0xC83553C5C8965D3D, 428, 148 },
17350 { 0x952AB45CFA97A0B3, 455, 156 },
17351 { 0xDE469FBD99A05FE3, 481, 164 },
17352 { 0xA59BC234DB398C25, 508, 172 },
17353 { 0xF6C69A72A3989F5C, 534, 180 },
17354 { 0xB7DCBF5354E9BECE, 561, 188 },
17355 { 0x88FCF317F22241E2, 588, 196 },
17356 { 0xCC20CE9BD35C78A5, 614, 204 },
17357 { 0x98165AF37B2153DF, 641, 212 },
17358 { 0xE2A0B5DC971F303A, 667, 220 },
17359 { 0xA8D9D1535CE3B396, 694, 228 },
17360 { 0xFB9B7CD9A4A7443C, 720, 236 },
17361 { 0xBB764C4CA7A44410, 747, 244 },
17362 { 0x8BAB8EEFB6409C1A, 774, 252 },
17363 { 0xD01FEF10A657842C, 800, 260 },
17364 { 0x9B10A4E5E9913129, 827, 268 },
17365 { 0xE7109BFBA19C0C9D, 853, 276 },
17366 { 0xAC2820D9623BF429, 880, 284 },
17367 { 0x80444B5E7AA7CF85, 907, 292 },
17368 { 0xBF21E44003ACDD2D, 933, 300 },
17369 { 0x8E679C2F5E44FF8F, 960, 308 },
17370 { 0xD433179D9C8CB841, 986, 316 },
17371 { 0x9E19DB92B4E31BA9, 1013, 324 },
17381 const int f =
kAlpha - e - 1;
17382 const int k = (f * 78913) / (1 << 18) +
static_cast<int>(f > 0);
17384 const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep;
17386 JSON_ASSERT(
static_cast<std::size_t
>(index) < kCachedPowers.size());
17388 const cached_power cached = kCachedPowers[
static_cast<std::size_t
>(index)];
17402 if (n >= 1000000000)
17404 pow10 = 1000000000;
17408 if (n >= 100000000)
17453 inline void grisu2_round(
char* buf,
int len, std::uint64_t dist, std::uint64_t delta,
17454 std::uint64_t rest, std::uint64_t ten_k)
17481 && delta - rest >= ten_k
17482 && (rest + ten_k < dist || dist - rest > rest + ten_k - dist))
17497 static_assert(
kAlpha >= -60,
"internal error");
17498 static_assert(
kGamma <= -32,
"internal error");
17515 std::uint64_t delta =
diyfp::sub(M_plus, M_minus).f;
17516 std::uint64_t dist =
diyfp::sub(M_plus, w).f;
17525 const diyfp one(std::uint64_t{ 1 } << -M_plus.
e, M_plus.
e);
17527 auto p1 =
static_cast<std::uint32_t
>(M_plus.
f >> -one.e);
17528 std::uint64_t p2 = M_plus.
f & (one.f - 1);
17536 std::uint32_t pow10{};
17564 const std::uint32_t d = p1 / pow10;
17565 const std::uint32_t r = p1 % pow10;
17571 buffer[length++] =
static_cast<char>(
'0' + d);
17590 const std::uint64_t rest = (std::uint64_t{ p1 } << -one.e) + p2;
17595 decimal_exponent += n;
17606 const std::uint64_t ten_n = std::uint64_t{ pow10 } << -one.e;
17607 grisu2_round(buffer, length, dist, delta, rest, ten_n);
17668 JSON_ASSERT(p2 <= (std::numeric_limits<std::uint64_t>::max)() / 10);
17670 const std::uint64_t d = p2 >> -one.e;
17671 const std::uint64_t r = p2 & (one.f - 1);
17678 buffer[length++] =
static_cast<char>(
'0' + d);
17703 decimal_exponent -= m;
17711 const std::uint64_t ten_m = one.f;
17735 inline
void grisu2(
char* buf,
int& len,
int& decimal_exponent,
17752 const diyfp c_minus_k(cached.
f, cached.
e);
17780 const diyfp M_minus(w_minus.
f + 1, w_minus.
e);
17781 const diyfp M_plus(w_plus.
f - 1, w_plus.
e);
17783 decimal_exponent = -cached.
k;
17793 template<
typename FloatType>
17798 "internal error: not enough precision");
17850 auto k =
static_cast<std::uint32_t
>(e);
17856 *buf++ =
static_cast<char>(
'0' + k);
17860 *buf++ =
static_cast<char>(
'0' + k / 10);
17862 *buf++ =
static_cast<char>(
'0' + k);
17866 *buf++ =
static_cast<char>(
'0' + k / 100);
17868 *buf++ =
static_cast<char>(
'0' + k / 10);
17870 *buf++ =
static_cast<char>(
'0' + k);
17888 int min_exp,
int max_exp)
17894 const int n = len + decimal_exponent;
17900 if (k <= n && n <= max_exp)
17905 std::memset(buf + k,
'0',
static_cast<size_t>(n) -
static_cast<size_t>(k));
17909 return buf + (
static_cast<size_t>(n) + 2);
17912 if (0 < n && n <= max_exp)
17919 std::memmove(buf + (
static_cast<size_t>(n) + 1), buf + n,
static_cast<size_t>(k) -
static_cast<size_t>(n));
17921 return buf + (
static_cast<size_t>(k) + 1U);
17924 if (min_exp < n && n <= 0)
17929 std::memmove(buf + (2 +
static_cast<size_t>(-n)), buf,
static_cast<size_t>(k));
17932 std::memset(buf + 2,
'0',
static_cast<size_t>(-n));
17933 return buf + (2U +
static_cast<size_t>(-n) +
static_cast<size_t>(k));
17948 std::memmove(buf + 2, buf + 1,
static_cast<size_t>(k) - 1);
17950 buf += 1 +
static_cast<size_t>(k);
17969 template<
typename FloatType>
17974 static_cast<void>(last);
17978 if (std::signbit(
value))
17985#pragma GCC diagnostic push
17986#pragma GCC diagnostic ignored "-Wfloat-equal"
17997#pragma GCC diagnostic pop
18000 JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10);
18007 int decimal_exponent = 0;
18010 JSON_ASSERT(len <= std::numeric_limits<FloatType>::max_digits10);
18013 constexpr int kMinExp = -4;
18015 constexpr int kMaxExp = std::numeric_limits<FloatType>::digits10;
18018 JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits<FloatType>::max_digits10);
18019 JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10 + 6);
18058 template<
typename BasicJsonType>
18078 ,
loc(
std::localeconv())
18116 const bool pretty_print,
18118 const unsigned int indent_step,
18119 const unsigned int current_indent = 0)
18121 switch (val.m_data.m_type)
18125 if (val.m_data.m_value.object->empty())
18127 o->write_characters(
"{}", 2);
18133 o->write_characters(
"{\n", 2);
18136 const auto new_indent = current_indent + indent_step;
18143 auto i = val.m_data.m_value.object->cbegin();
18144 for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i)
18147 o->write_character(
'\"');
18149 o->write_characters(
"\": ", 3);
18151 o->write_characters(
",\n", 2);
18155 JSON_ASSERT(i != val.m_data.m_value.object->cend());
18156 JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());
18158 o->write_character(
'\"');
18160 o->write_characters(
"\": ", 3);
18163 o->write_character(
'\n');
18164 o->write_characters(
indent_string.c_str(), current_indent);
18165 o->write_character(
'}');
18169 o->write_character(
'{');
18172 auto i = val.m_data.m_value.object->cbegin();
18173 for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i)
18175 o->write_character(
'\"');
18177 o->write_characters(
"\":", 2);
18179 o->write_character(
',');
18183 JSON_ASSERT(i != val.m_data.m_value.object->cend());
18184 JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());
18185 o->write_character(
'\"');
18187 o->write_characters(
"\":", 2);
18190 o->write_character(
'}');
18198 if (val.m_data.m_value.array->empty())
18200 o->write_characters(
"[]", 2);
18206 o->write_characters(
"[\n", 2);
18209 const auto new_indent = current_indent + indent_step;
18216 for (
auto i = val.m_data.m_value.array->cbegin();
18217 i != val.m_data.m_value.array->cend() - 1; ++i)
18221 o->write_characters(
",\n", 2);
18227 dump(val.m_data.m_value.array->back(),
true,
ensure_ascii, indent_step, new_indent);
18229 o->write_character(
'\n');
18230 o->write_characters(
indent_string.c_str(), current_indent);
18231 o->write_character(
']');
18235 o->write_character(
'[');
18238 for (
auto i = val.m_data.m_value.array->cbegin();
18239 i != val.m_data.m_value.array->cend() - 1; ++i)
18242 o->write_character(
',');
18247 dump(val.m_data.m_value.array->back(),
false,
ensure_ascii, indent_step, current_indent);
18249 o->write_character(
']');
18257 o->write_character(
'\"');
18258 dump_escaped(*val.m_data.m_value.string,
ensure_ascii);
18259 o->write_character(
'\"');
18267 o->write_characters(
"{\n", 2);
18270 const auto new_indent = current_indent + indent_step;
18278 o->write_characters(
"\"bytes\": [", 10);
18280 if (!val.m_data.m_value.binary->empty())
18282 for (
auto i = val.m_data.m_value.binary->cbegin();
18283 i != val.m_data.m_value.binary->cend() - 1; ++i)
18286 o->write_characters(
", ", 2);
18288 dump_integer(val.m_data.m_value.binary->back());
18291 o->write_characters(
"],\n", 3);
18294 o->write_characters(
"\"subtype\": ", 11);
18295 if (val.m_data.m_value.binary->has_subtype())
18297 dump_integer(val.m_data.m_value.binary->subtype());
18301 o->write_characters(
"null", 4);
18303 o->write_character(
'\n');
18304 o->write_characters(
indent_string.c_str(), current_indent);
18305 o->write_character(
'}');
18309 o->write_characters(
"{\"bytes\":[", 10);
18311 if (!val.m_data.m_value.binary->empty())
18313 for (
auto i = val.m_data.m_value.binary->cbegin();
18314 i != val.m_data.m_value.binary->cend() - 1; ++i)
18317 o->write_character(
',');
18319 dump_integer(val.m_data.m_value.binary->back());
18322 o->write_characters(
"],\"subtype\":", 12);
18323 if (val.m_data.m_value.binary->has_subtype())
18325 dump_integer(val.m_data.m_value.binary->subtype());
18326 o->write_character(
'}');
18330 o->write_characters(
"null}", 5);
18338 if (val.m_data.m_value.boolean)
18340 o->write_characters(
"true", 4);
18344 o->write_characters(
"false", 5);
18351 dump_integer(val.m_data.m_value.number_integer);
18357 dump_integer(val.m_data.m_value.number_unsigned);
18363 dump_float(val.m_data.m_value.number_float);
18369 o->write_characters(
"<discarded>", 11);
18375 o->write_characters(
"null", 4);
18401 std::uint32_t codepoint{};
18409 for (std::size_t i = 0; i < s.size(); ++i)
18411 const auto byte =
static_cast<std::uint8_t
>(s[i]);
18413 switch (decode(
state, codepoint,
byte))
18472 if ((codepoint <= 0x1F) || (
ensure_ascii && (codepoint >= 0x7F)))
18474 if (codepoint <= 0xFFFF)
18478 static_cast<std::uint16_t
>(codepoint)));
18484 static_cast<void>((std::snprintf)(
string_buffer.data() +
bytes, 13,
"\\u%04x\\u%04x",
18485 static_cast<std::uint16_t
>(0xD7C0u + (codepoint >> 10u)),
18486 static_cast<std::uint16_t
>(0xDC00u + (codepoint & 0x3FFu))));
18630 o->write_characters(
"\\ufffd", 6);
18634 o->write_characters(
"\xEF\xBF\xBD", 3);
18654 inline unsigned int count_digits(number_unsigned_t x)
noexcept
18656 unsigned int n_digits = 1;
18665 return n_digits + 1;
18669 return n_digits + 2;
18673 return n_digits + 3;
18685 static std::string hex_bytes(std::uint8_t
byte)
18687 std::string result =
"FF";
18688 constexpr const char* nibble_to_hex =
"0123456789ABCDEF";
18689 result[0] = nibble_to_hex[
byte / 16];
18690 result[1] = nibble_to_hex[
byte % 16];
18695 template <typename NumberType, enable_if_t<std::is_signed<NumberType>::value,
int> = 0>
18696 bool is_negative_number(NumberType x)
18701 template < typename NumberType, enable_if_t <std::is_unsigned<NumberType>::value,
int > = 0 >
18702 bool is_negative_number(NumberType )
18717 std::is_integral<NumberType>::value ||
18718 std::is_same<NumberType, number_unsigned_t>::value ||
18719 std::is_same<NumberType, number_integer_t>::value ||
18720 std::is_same<NumberType, binary_char_t>::value,
18722 void dump_integer(NumberType x)
18724 static constexpr std::array<std::array<char, 2>, 100> digits_to_99
18727 {{
'0',
'0'}}, {{
'0',
'1'}}, {{
'0',
'2'}}, {{
'0',
'3'}}, {{
'0',
'4'}}, {{
'0',
'5'}}, {{
'0',
'6'}}, {{
'0',
'7'}}, {{
'0',
'8'}}, {{
'0',
'9'}},
18728 {{
'1',
'0'}}, {{
'1',
'1'}}, {{
'1',
'2'}}, {{
'1',
'3'}}, {{
'1',
'4'}}, {{
'1',
'5'}}, {{
'1',
'6'}}, {{
'1',
'7'}}, {{
'1',
'8'}}, {{
'1',
'9'}},
18729 {{
'2',
'0'}}, {{
'2',
'1'}}, {{
'2',
'2'}}, {{
'2',
'3'}}, {{
'2',
'4'}}, {{
'2',
'5'}}, {{
'2',
'6'}}, {{
'2',
'7'}}, {{
'2',
'8'}}, {{
'2',
'9'}},
18730 {{
'3',
'0'}}, {{
'3',
'1'}}, {{
'3',
'2'}}, {{
'3',
'3'}}, {{
'3',
'4'}}, {{
'3',
'5'}}, {{
'3',
'6'}}, {{
'3',
'7'}}, {{
'3',
'8'}}, {{
'3',
'9'}},
18731 {{
'4',
'0'}}, {{
'4',
'1'}}, {{
'4',
'2'}}, {{
'4',
'3'}}, {{
'4',
'4'}}, {{
'4',
'5'}}, {{
'4',
'6'}}, {{
'4',
'7'}}, {{
'4',
'8'}}, {{
'4',
'9'}},
18732 {{
'5',
'0'}}, {{
'5',
'1'}}, {{
'5',
'2'}}, {{
'5',
'3'}}, {{
'5',
'4'}}, {{
'5',
'5'}}, {{
'5',
'6'}}, {{
'5',
'7'}}, {{
'5',
'8'}}, {{
'5',
'9'}},
18733 {{
'6',
'0'}}, {{
'6',
'1'}}, {{
'6',
'2'}}, {{
'6',
'3'}}, {{
'6',
'4'}}, {{
'6',
'5'}}, {{
'6',
'6'}}, {{
'6',
'7'}}, {{
'6',
'8'}}, {{
'6',
'9'}},
18734 {{
'7',
'0'}}, {{
'7',
'1'}}, {{
'7',
'2'}}, {{
'7',
'3'}}, {{
'7',
'4'}}, {{
'7',
'5'}}, {{
'7',
'6'}}, {{
'7',
'7'}}, {{
'7',
'8'}}, {{
'7',
'9'}},
18735 {{
'8',
'0'}}, {{
'8',
'1'}}, {{
'8',
'2'}}, {{
'8',
'3'}}, {{
'8',
'4'}}, {{
'8',
'5'}}, {{
'8',
'6'}}, {{
'8',
'7'}}, {{
'8',
'8'}}, {{
'8',
'9'}},
18736 {{
'9',
'0'}}, {{
'9',
'1'}}, {{
'9',
'2'}}, {{
'9',
'3'}}, {{
'9',
'4'}}, {{
'9',
'5'}}, {{
'9',
'6'}}, {{
'9',
'7'}}, {{
'9',
'8'}}, {{
'9',
'9'}},
18743 o->write_character(
'0');
18748 auto buffer_ptr = number_buffer.begin();
18750 number_unsigned_t abs_value;
18752 unsigned int n_chars{};
18754 if (is_negative_number(x))
18757 abs_value = remove_sign(
static_cast<number_integer_t
>(x));
18760 n_chars = 1 + count_digits(abs_value);
18764 abs_value =
static_cast<number_unsigned_t
>(x);
18765 n_chars = count_digits(abs_value);
18773 buffer_ptr += n_chars;
18777 while (abs_value >= 100)
18779 const auto digits_index =
static_cast<unsigned>((abs_value % 100));
18781 *(--buffer_ptr) = digits_to_99[digits_index][1];
18782 *(--buffer_ptr) = digits_to_99[digits_index][0];
18785 if (abs_value >= 10)
18787 const auto digits_index =
static_cast<unsigned>(abs_value);
18788 *(--buffer_ptr) = digits_to_99[digits_index][1];
18789 *(--buffer_ptr) = digits_to_99[digits_index][0];
18793 *(--buffer_ptr) =
static_cast<char>(
'0' + abs_value);
18796 o->write_characters(number_buffer.data(), n_chars);
18807 void dump_float(number_float_t x)
18810 if (!std::isfinite(x))
18812 o->write_characters(
"null", 4);
18821 static constexpr bool is_ieee_single_or_double
18822 = (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 24 && std::numeric_limits<number_float_t>::max_exponent == 128) ||
18823 (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 53 && std::numeric_limits<number_float_t>::max_exponent == 1024);
18825 dump_float(x, std::integral_constant<bool, is_ieee_single_or_double>());
18828 void dump_float(number_float_t x, std::true_type )
18830 auto* begin = number_buffer.data();
18831 auto* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x);
18833 o->write_characters(begin,
static_cast<size_t>(end - begin));
18836 void dump_float(number_float_t x, std::false_type )
18839 static constexpr auto d = std::numeric_limits<number_float_t>::max_digits10;
18843 std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(),
"%.*g", d, x);
18848 JSON_ASSERT(
static_cast<std::size_t
>(len) < number_buffer.size());
18851 if (thousands_sep !=
'\0')
18854 const auto end = std::remove(number_buffer.begin(), number_buffer.begin() + len, thousands_sep);
18855 std::fill(end, number_buffer.end(),
'\0');
18856 JSON_ASSERT((end - number_buffer.begin()) <= len);
18857 len = (end - number_buffer.begin());
18861 if (decimal_point !=
'\0' && decimal_point !=
'.')
18864 const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point);
18865 if (dec_pos != number_buffer.end())
18871 o->write_characters(number_buffer.data(),
static_cast<std::size_t
>(len));
18874 const bool value_is_int_like =
18875 std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1,
18878 return c ==
'.' || c ==
'e';
18881 if (value_is_int_like)
18883 o->write_characters(
".0", 2);
18908 static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep,
const std::uint8_t
byte)
noexcept
18910 static const std::array<std::uint8_t, 400> utf8d =
18913 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18914 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18915 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18916 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18917 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
18918 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
18919 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
18920 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3,
18921 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8,
18922 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1,
18923 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
18924 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
18925 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1,
18926 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
18931 const std::uint8_t type = utf8d[
byte];
18933 codep = (state != UTF8_ACCEPT)
18934 ? (
byte & 0x3fu) | (codep << 6u)
18935 : (0xFFu >> type) & (
byte);
18937 const std::size_t index = 256u +
static_cast<size_t>(state) * 16u +
static_cast<size_t>(type);
18939 state = utf8d[index];
18948 number_unsigned_t remove_sign(number_unsigned_t x)
18963 inline number_unsigned_t remove_sign(number_integer_t x)
noexcept
18965 JSON_ASSERT(x < 0 && x < (std::numeric_limits<number_integer_t>::max)());
18966 return static_cast<number_unsigned_t
>(-(x + 1)) + 1;
18971 output_adapter_t<char> o =
nullptr;
19013#include <functional>
19014#include <initializer_list>
19017#include <stdexcept>
19018#include <type_traits>
19031template <
class Key,
class T,
class IgnoredLess = std::less<Key>,
19032 class Allocator = std::allocator<std::pair<const Key, T>>>
19037 using Container = std::vector<std::pair<const Key, T>, Allocator>;
19042#ifdef JSON_HAS_CPP_14
19052 template <
class It>
19055 ordered_map(std::initializer_list<value_type> init,
const Allocator& alloc = Allocator())
19060 for (
auto it = this->begin(); it != this->end(); ++it)
19064 return { it,
false };
19067 Container::emplace_back(key, std::forward<T>(t));
19068 return { std::prev(this->end()),
true };
19075 for (
auto it = this->begin(); it != this->end(); ++it)
19079 return { it,
false };
19082 Container::emplace_back(std::forward<KeyType>(key), std::forward<T>(t));
19083 return { std::prev(this->end()),
true };
19088 return emplace(key,
T{}).first->second;
19095 return emplace(std::forward<KeyType>(key),
T{}).first->second;
19107 return at(std::forward<KeyType>(key));
19112 for (
auto it = this->begin(); it != this->end(); ++it)
19120 JSON_THROW(std::out_of_range(
"key not found"));
19127 for (
auto it = this->begin(); it != this->end(); ++it)
19135 JSON_THROW(std::out_of_range(
"key not found"));
19140 for (
auto it = this->begin(); it != this->end(); ++it)
19148 JSON_THROW(std::out_of_range(
"key not found"));
19155 for (
auto it = this->begin(); it != this->end(); ++it)
19163 JSON_THROW(std::out_of_range(
"key not found"));
19168 for (
auto it = this->begin(); it != this->end(); ++it)
19173 for (
auto next = it; ++next != this->end(); ++it)
19178 Container::pop_back();
19189 for (
auto it = this->begin(); it != this->end(); ++it)
19194 for (
auto next = it; ++next != this->end(); ++it)
19199 Container::pop_back();
19208 return erase(pos, std::next(pos));
19218 const auto elements_affected = std::distance(first, last);
19219 const auto offset = std::distance(Container::begin(), first);
19241 for (
auto it = first; std::next(it, elements_affected) != Container::end(); ++it)
19244 new (&*it)
value_type{ std::move(*std::next(it, elements_affected)) };
19252 Container::resize(this->size() -
static_cast<size_type>(elements_affected));
19261 return Container::begin() + offset;
19266 for (
auto it = this->begin(); it != this->end(); ++it)
19280 for (
auto it = this->begin(); it != this->end(); ++it)
19292 for (
auto it = this->begin(); it != this->end(); ++it)
19299 return Container::end();
19306 for (
auto it = this->begin(); it != this->end(); ++it)
19313 return Container::end();
19318 for (
auto it = this->begin(); it != this->end(); ++it)
19325 return Container::end();
19330 return emplace(value.first, std::move(value.second));
19335 for (
auto it = this->begin(); it != this->end(); ++it)
19339 return { it,
false };
19342 Container::push_back(value);
19343 return { --this->end(),
true };
19346 template<
typename InputIt>
19347 using require_input_iter =
typename std::enable_if<std::is_convertible<typename std::iterator_traits<InputIt>::iterator_category,
19348 std::input_iterator_tag>::value>::type;
19350 template<
typename InputIt,
typename = require_input_iter<InputIt>>
19353 for (
auto it = first; it != last; ++it)
19366#if defined(JSON_HAS_CPP_17)
19367#if JSON_HAS_STATIC_RTTI
19370#include <string_view>
19400 :
public ::nlohmann::detail::json_base_class<CustomBaseClass>
19406 friend class ::nlohmann::json_pointer;
19410 template<
typename BasicJsonType,
typename InputType>
19411 friend class ::nlohmann::detail::parser;
19412 friend ::nlohmann::detail::serializer<basic_json>;
19413 template<
typename BasicJsonType>
19414 friend class ::nlohmann::detail::iter_impl;
19415 template<
typename BasicJsonType,
typename CharType>
19416 friend class ::nlohmann::detail::binary_writer;
19417 template<
typename BasicJsonType,
typename InputType,
typename SAX>
19418 friend class ::nlohmann::detail::binary_reader;
19419 template<
typename BasicJsonType>
19420 friend class ::nlohmann::detail::json_sax_dom_parser;
19421 template<
typename BasicJsonType>
19422 friend class ::nlohmann::detail::json_sax_dom_callback_parser;
19423 friend class ::nlohmann::detail::exception;
19431 using lexer = ::nlohmann::detail::lexer_base<basic_json>;
19433 template<
typename InputAdapterType>
19434 static ::nlohmann::detail::parser<basic_json, InputAdapterType>
parser(
19435 InputAdapterType adapter,
19437 const bool allow_exceptions =
true,
19438 const bool ignore_comments =
false
19441 return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter),
19442 std::move(cb), allow_exceptions, ignore_comments);
19447 template<
typename BasicJsonType>
19449 template<
typename BasicJsonType>
19451 template<
typename Iterator>
19455 template<
typename CharType>
19458 template<
typename InputType>
19460 template<
typename CharType>
using binary_writer = ::nlohmann::detail::binary_writer<basic_json, CharType>;
19463 using serializer = ::nlohmann::detail::serializer<basic_json>;
19469 template<
typename T,
typename SFINAE>
19525 using pointer =
typename std::allocator_traits<allocator_type>::pointer;
19527 using const_pointer =
typename std::allocator_traits<allocator_type>::const_pointer;
19554 result[
"copyright"] =
"(C) 2013-2023 Niels Lohmann";
19555 result[
"name"] =
"JSON for Modern C++";
19556 result[
"url"] =
"https://github.com/nlohmann/json";
19557 result[
"version"][
"string"] =
19566 result[
"platform"] =
"win32";
19567#elif defined __linux__
19568 result[
"platform"] =
"linux";
19569#elif defined __APPLE__
19570 result[
"platform"] =
"apple";
19571#elif defined __unix__
19572 result[
"platform"] =
"unix";
19574 result[
"platform"] =
"unknown";
19577#if defined(__ICC) || defined(__INTEL_COMPILER)
19578 result[
"compiler"] = { {
"family",
"icc"}, {
"version", __INTEL_COMPILER} };
19579#elif defined(__clang__)
19580 result[
"compiler"] = { {
"family",
"clang"}, {
"version", __clang_version__} };
19581#elif defined(__GNUC__) || defined(__GNUG__)
19582 result[
"compiler"] = { {
"family",
"gcc"}, {
"version",
detail::concat(
19583 std::to_string(__GNUC__),
'.',
19584 std::to_string(__GNUC_MINOR__),
'.',
19585 std::to_string(__GNUC_PATCHLEVEL__))
19588#elif defined(__HP_cc) || defined(__HP_aCC)
19589 result[
"compiler"] =
"hp"
19590#elif defined(__IBMCPP__)
19591 result[
"compiler"] = { {
"family",
"ilecpp"}, {
"version", __IBMCPP__} };
19592#elif defined(_MSC_VER)
19593 result[
"compiler"] = { {
"family",
"msvc"}, {
"version", _MSC_VER} };
19594#elif defined(__PGI)
19595 result[
"compiler"] = { {
"family",
"pgcpp"}, {
"version", __PGI} };
19596#elif defined(__SUNPRO_CC)
19597 result[
"compiler"] = { {
"family",
"sunpro"}, {
"version", __SUNPRO_CC} };
19599 result[
"compiler"] = { {
"family",
"unknown"}, {
"version",
"unknown"} };
19602#if defined(_MSVC_LANG)
19603 result[
"compiler"][
"c++"] = std::to_string(_MSVC_LANG);
19604#elif defined(__cplusplus)
19605 result[
"compiler"][
"c++"] = std::to_string(__cplusplus);
19607 result[
"compiler"][
"c++"] =
"unknown";
19625#if defined(JSON_HAS_CPP_14)
19628 using default_object_comparator_t = std::less<>;
19638 AllocatorType<std::pair<
const StringType,
19643 using array_t = ArrayType<basic_json, AllocatorType<basic_json>>;
19667 using binary_t = nlohmann::byte_container_with_subtype<BinaryType>;
19678 template<
typename T,
typename... Args>
19682 AllocatorType<T> alloc;
19683 using AllocatorTraits = std::allocator_traits<AllocatorType<T>>;
19685 auto deleter = [&](
T* obj)
19687 AllocatorTraits::deallocate(alloc, obj, 1);
19689 std::unique_ptr<
T,
decltype(deleter)> obj(AllocatorTraits::allocate(alloc, 1), deleter);
19690 AllocatorTraits::construct(alloc, obj.get(), std::forward<Args>(args)...);
19692 return obj.release();
19759 case value_t::object:
19765 case value_t::array:
19771 case value_t::string:
19777 case value_t::binary:
19783 case value_t::boolean:
19785 boolean =
static_cast<boolean_t>(
false);
19789 case value_t::number_integer:
19795 case value_t::number_unsigned:
19801 case value_t::number_float:
19807 case value_t::null:
19813 case value_t::discarded:
19859 (t == value_t::object &&
object ==
nullptr) ||
19860 (t == value_t::array &&
array ==
nullptr) ||
19861 (t == value_t::string &&
string ==
nullptr) ||
19862 (t == value_t::binary &&
binary ==
nullptr)
19868 if (t == value_t::array || t == value_t::object)
19871 std::vector<basic_json> stack;
19874 if (t == value_t::array)
19876 stack.reserve(
array->size());
19877 std::move(
array->begin(),
array->end(), std::back_inserter(stack));
19881 stack.reserve(
object->size());
19882 for (
auto&& it : *
object)
19884 stack.push_back(std::move(it.second));
19888 while (!stack.empty())
19891 basic_json current_item(std::move(stack.back()));
19898 std::move(current_item.
m_data.m_value.array->begin(), current_item.
m_data.m_value.array->end(), std::back_inserter(stack));
19900 current_item.
m_data.m_value.array->clear();
19904 for (
auto&& it : *current_item.
m_data.m_value.object)
19906 stack.push_back(std::move(it.second));
19909 current_item.
m_data.m_value.object->clear();
19919 case value_t::object:
19921 AllocatorType<object_t> alloc;
19922 std::allocator_traits<
decltype(alloc)>
::destroy(alloc,
object);
19923 std::allocator_traits<
decltype(alloc)>::deallocate(alloc,
object, 1);
19927 case value_t::array:
19929 AllocatorType<array_t> alloc;
19931 std::allocator_traits<
decltype(alloc)>::deallocate(alloc,
array, 1);
19935 case value_t::string:
19937 AllocatorType<string_t> alloc;
19938 std::allocator_traits<
decltype(alloc)>
::destroy(alloc,
string);
19939 std::allocator_traits<
decltype(alloc)>::deallocate(alloc,
string, 1);
19943 case value_t::binary:
19945 AllocatorType<binary_t> alloc;
19947 std::allocator_traits<
decltype(alloc)>::deallocate(alloc,
binary, 1);
19951 case value_t::null:
19952 case value_t::boolean:
19953 case value_t::number_integer:
19954 case value_t::number_unsigned:
19955 case value_t::number_float:
19956 case value_t::discarded:
19991#if JSON_DIAGNOSTICS
19997 return j.m_parent ==
this;
20002 static_cast<void>(check_parents);
20007#if JSON_DIAGNOSTICS
20010 case value_t::array:
20012 for (
auto& element : *
m_data.m_value.array)
20014 element.m_parent =
this;
20019 case value_t::object:
20021 for (
auto& element : *
m_data.m_value.object)
20023 element.second.m_parent =
this;
20028 case value_t::null:
20029 case value_t::string:
20030 case value_t::boolean:
20031 case value_t::number_integer:
20032 case value_t::number_unsigned:
20033 case value_t::number_float:
20034 case value_t::binary:
20035 case value_t::discarded:
20044#if JSON_DIAGNOSTICS
20045 for (
typename iterator::difference_type i = 0; i < count_set_parents; ++i)
20047 (it + i)->m_parent =
this;
20050 static_cast<void>(count_set_parents);
20057#if JSON_DIAGNOSTICS
20058 if (old_capacity !=
static_cast<std::size_t
>(-1))
20072#ifdef JSON_HEDLEY_MSVC_VERSION
20073#pragma warning(push )
20074#pragma warning(disable : 4127)
20081#ifdef JSON_HEDLEY_MSVC_VERSION
20082#pragma warning( pop )
20087 static_cast<void>(j);
20088 static_cast<void>(old_capacity);
20133 template <
typename CompatibleType,
20138 JSONSerializer<U>::to_json(std::declval<basic_json_t&>(),
20139 std::forward<CompatibleType>(val))))
20141 JSONSerializer<U>::to_json(*
this, std::forward<CompatibleType>(val));
20148 template <
typename BasicJsonType,
20153 using other_boolean_t =
typename BasicJsonType::boolean_t;
20154 using other_number_float_t =
typename BasicJsonType::number_float_t;
20155 using other_number_integer_t =
typename BasicJsonType::number_integer_t;
20156 using other_number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
20157 using other_string_t =
typename BasicJsonType::string_t;
20158 using other_object_t =
typename BasicJsonType::object_t;
20159 using other_array_t =
typename BasicJsonType::array_t;
20160 using other_binary_t =
typename BasicJsonType::binary_t;
20162 switch (val.type())
20164 case value_t::boolean:
20167 case value_t::number_float:
20170 case value_t::number_integer:
20173 case value_t::number_unsigned:
20176 case value_t::string:
20179 case value_t::object:
20182 case value_t::array:
20185 case value_t::binary:
20188 case value_t::null:
20191 case value_t::discarded:
20192 m_data.m_type = value_t::discarded;
20205 bool type_deduction =
true,
20206 value_t manual_type = value_t::array)
20210 bool is_an_object = std::all_of(init.begin(), init.end(),
20216 return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[static_cast<size_type>(0)].is_string();
20220 if (!type_deduction)
20223 if (manual_type == value_t::array)
20225 is_an_object =
false;
20238 m_data.m_type = value_t::object;
20239 m_data.m_value = value_t::object;
20241 for (
auto& element_ref : init)
20244 m_data.m_value.object->emplace(
20245 std::move(*((*element.m_data.m_value.array)[0].m_data.m_value.string)),
20246 std::move((*element.m_data.m_value.array)[1]));
20252 m_data.m_type = value_t::array;
20266 res.m_data.m_type = value_t::binary;
20267 res.m_data.m_value = init;
20274 static basic_json binary(
const typename binary_t::container_type& init,
typename binary_t::subtype_type subtype)
20277 res.m_data.m_type = value_t::binary;
20278 res.m_data.m_value =
binary_t(init, subtype);
20288 res.m_data.m_type = value_t::binary;
20289 res.m_data.m_value = std::move(init);
20296 static basic_json binary(
typename binary_t::container_type&& init,
typename binary_t::subtype_type subtype)
20299 res.m_data.m_type = value_t::binary;
20300 res.m_data.m_value =
binary_t(std::move(init), subtype);
20309 return basic_json(init,
false, value_t::array);
20317 return basic_json(init,
false, value_t::object);
20331 template <
class InputIT,
typename std::enable_if <
20332 std::is_same<InputIT, typename basic_json_t::iterator>::value ||
20333 std::is_same<InputIT, typename basic_json_t::const_iterator>::value,
int >::type = 0 >
20346 m_data.m_type = first.m_object->m_data.m_type;
20351 case value_t::boolean:
20352 case value_t::number_float:
20353 case value_t::number_integer:
20354 case value_t::number_unsigned:
20355 case value_t::string:
20358 || !last.m_it.primitive_iterator.is_end()))
20365 case value_t::null:
20366 case value_t::object:
20367 case value_t::array:
20368 case value_t::binary:
20369 case value_t::discarded:
20376 case value_t::number_integer:
20378 m_data.m_value.number_integer = first.m_object->m_data.m_value.number_integer;
20382 case value_t::number_unsigned:
20384 m_data.m_value.number_unsigned = first.m_object->m_data.m_value.number_unsigned;
20388 case value_t::number_float:
20390 m_data.m_value.number_float = first.m_object->m_data.m_value.number_float;
20394 case value_t::boolean:
20396 m_data.m_value.boolean = first.m_object->m_data.m_value.boolean;
20400 case value_t::string:
20402 m_data.m_value = *first.m_object->m_data.m_value.string;
20406 case value_t::object:
20409 last.m_it.object_iterator);
20413 case value_t::array:
20416 last.m_it.array_iterator);
20420 case value_t::binary:
20422 m_data.m_value = *first.m_object->m_data.m_value.binary;
20426 case value_t::null:
20427 case value_t::discarded:
20440 template<
typename JsonRef,
20442 std::is_same<typename JsonRef::value_type, basic_json>>::value,
int> = 0 >
20456 case value_t::object:
20458 m_data.m_value = *other.m_data.m_value.object;
20462 case value_t::array:
20464 m_data.m_value = *other.m_data.m_value.array;
20468 case value_t::string:
20470 m_data.m_value = *other.m_data.m_value.string;
20474 case value_t::boolean:
20476 m_data.m_value = other.m_data.m_value.boolean;
20480 case value_t::number_integer:
20482 m_data.m_value = other.m_data.m_value.number_integer;
20486 case value_t::number_unsigned:
20488 m_data.m_value = other.m_data.m_value.number_unsigned;
20492 case value_t::number_float:
20494 m_data.m_value = other.m_data.m_value.number_float;
20498 case value_t::binary:
20500 m_data.m_value = *other.m_data.m_value.binary;
20504 case value_t::null:
20505 case value_t::discarded:
20511 assert_invariant();
20518 m_data(std::move(other.m_data))
20521 other.assert_invariant(
false);
20524 other.m_data.m_type = value_t::null;
20525 other.m_data.m_value = {};
20534 std::is_nothrow_move_constructible<value_t>::value&&
20535 std::is_nothrow_move_assignable<value_t>::value&&
20536 std::is_nothrow_move_constructible<json_value>::value&&
20537 std::is_nothrow_move_assignable<json_value>::value&&
20538 std::is_nothrow_move_assignable<json_base_class_t>::value
20542 other.assert_invariant();
20547 json_base_class_t::operator=(std::move(other));
20575 const char indent_char =
' ',
20576 const bool ensure_ascii =
false,
20584 s.dump(*
this,
true, ensure_ascii,
static_cast<unsigned int>(indent));
20588 s.dump(*
this,
false, ensure_ascii, 0);
20619 return m_data.m_type == value_t::null;
20626 return m_data.m_type == value_t::boolean;
20640 return m_data.m_type == value_t::number_integer ||
m_data.m_type == value_t::number_unsigned;
20647 return m_data.m_type == value_t::number_unsigned;
20654 return m_data.m_type == value_t::number_float;
20661 return m_data.m_type == value_t::object;
20668 return m_data.m_type == value_t::array;
20675 return m_data.m_type == value_t::string;
20682 return m_data.m_type == value_t::binary;
20689 return m_data.m_type == value_t::discarded;
20711 return m_data.m_value.boolean;
20824 template<
typename ReferenceType,
typename ThisType>
20845 template<
typename PointerType,
typename std::enable_if<
20846 std::is_pointer<PointerType>::value,
int>::type = 0>
20850 return get_impl_ptr(
static_cast<PointerType
>(
nullptr));
20855 template <
typename PointerType,
typename std::enable_if <
20856 std::is_pointer<PointerType>::value&&
20857 std::is_const<typename std::remove_pointer<PointerType>::type>::value,
int >::type = 0 >
20861 return get_impl_ptr(
static_cast<PointerType
>(
nullptr));
20903 template <
typename ValueType,
20909 JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), std::declval<ValueType&>())))
20911 auto ret = ValueType();
20912 JSONSerializer<ValueType>::from_json(*
this, ret);
20946 template <
typename ValueType,
20951 JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>())))
20953 return JSONSerializer<ValueType>::from_json(*
this);
20971 template <
typename BasicJsonType,
20994 template<
typename BasicJsonType,
20996 std::is_same<BasicJsonType, basic_json_t>::value,
21007 template<
typename PointerType,
21009 std::is_pointer<PointerType>::value,
21042 template <
typename ValueTypeCV,
typename ValueType = detail::uncvref_t<ValueTypeCV>>
21043#if defined(JSON_HAS_CPP_14)
21053 static_assert(!std::is_reference<ValueTypeCV>::value,
21054 "get() cannot be used with reference types, you might want to use get_ref()");
21055 return get_impl<ValueType>(detail::priority_tag<4> {});
21085 template<
typename PointerType,
typename std::enable_if<
21086 std::is_pointer<PointerType>::value,
int>::type = 0>
21095 template <
typename ValueType,
21100 ValueType&
get_to(ValueType& v)
const noexcept(
noexcept(
21101 JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), v)))
21103 JSONSerializer<ValueType>::from_json(*
this, v);
21109 template<
typename ValueType,
21120 typename T, std::size_t
N,
21121 typename Array =
T(&)[
N],
21125 noexcept(
noexcept(JSONSerializer<Array>::from_json(
21126 std::declval<const basic_json_t&>(), v)))
21128 JSONSerializer<Array>::from_json(*
this, v);
21134 template<
typename ReferenceType,
typename std::enable_if<
21135 std::is_reference<ReferenceType>::value,
int>::type = 0>
21144 template <
typename ReferenceType,
typename std::enable_if <
21145 std::is_reference<ReferenceType>::value&&
21146 std::is_const<typename std::remove_reference<ReferenceType>::type>::value,
int >::type = 0 >
21182 template <
typename ValueType,
typename std::enable_if <
21190#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))
21193#if defined(JSON_HAS_CPP_17) && JSON_HAS_STATIC_RTTI
21197 >::value,
int >::type = 0 >
21270 return m_data.m_value.array->at(idx);
21294 auto it =
m_data.m_value.object->find(
key);
21295 if (it ==
m_data.m_value.object->end())
21314 auto it =
m_data.m_value.object->find(std::forward<KeyType>(
key));
21315 if (it ==
m_data.m_value.object->end())
21332 auto it =
m_data.m_value.object->find(
key);
21333 if (it ==
m_data.m_value.object->end())
21352 auto it =
m_data.m_value.object->find(std::forward<KeyType>(
key));
21353 if (it ==
m_data.m_value.object->end())
21367 m_data.m_type = value_t::array;
21376 if (idx >=
m_data.m_value.array->size())
21378#if JSON_DIAGNOSTICS
21380 const auto old_size =
m_data.m_value.array->size();
21381 const auto old_capacity =
m_data.m_value.array->capacity();
21383 m_data.m_value.array->resize(idx + 1);
21385#if JSON_DIAGNOSTICS
21394 set_parents(
begin() +
static_cast<typename iterator::difference_type
>(old_size),
static_cast<typename iterator::difference_type
>(idx + 1 - old_size));
21400 return m_data.m_value.array->operator[](idx);
21413 return m_data.m_value.array->operator[](idx);
21426 m_data.m_type = value_t::object;
21434 auto result =
m_data.m_value.object->emplace(std::move(
key),
nullptr);
21448 auto it =
m_data.m_value.object->find(
key);
21458 template<
typename T>
21464 template<
typename T>
21479 m_data.m_type = value_t::object;
21487 auto result =
m_data.m_value.object->emplace(std::forward<KeyType>(
key),
nullptr);
21503 auto it =
m_data.m_value.object->find(std::forward<KeyType>(
key));
21512 template<
typename KeyType>
21516 template<
typename ValueType>
21519 string_t,
typename std::decay<ValueType>::type >;
21527 && !std::is_same<value_t, detail::uncvref_t<ValueType>>
::value,
int > = 0 >
21528 ValueType
value(
const typename object_t::key_type&
key,
const ValueType& default_value)
const
21540 return default_value;
21548 template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type,
21552 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value,
int > = 0 >
21553 ReturnType
value(
const typename object_t::key_type&
key, ValueType&& default_value)
const
21565 return std::forward<ValueType>(default_value);
21576 && is_comparable_with_object_key<KeyType>::value
21578 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value,
int > = 0 >
21579 ValueType
value(KeyType&&
key,
const ValueType& default_value)
const
21585 const auto it =
find(std::forward<KeyType>(
key));
21591 return default_value;
21599 template < class ValueType, class KeyType, class ReturnType = typename value_return_type<ValueType>::type,
21603 && is_comparable_with_object_key<KeyType>::value
21605 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value,
int > = 0 >
21606 ReturnType
value(KeyType&&
key, ValueType&& default_value)
const
21612 const auto it =
find(std::forward<KeyType>(
key));
21618 return std::forward<ValueType>(default_value);
21628 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value,
int > = 0 >
21641 return default_value;
21650 template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type,
21653 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value,
int > = 0 >
21666 return std::forward<ValueType>(default_value);
21676 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value,
int > = 0 >
21678 ValueType
value(const ::nlohmann::
json_pointer<BasicJsonType>& ptr, const ValueType& default_value)
const
21680 return value(ptr.convert(), default_value);
21683 template < class ValueType, class BasicJsonType, class ReturnType = typename value_return_type<ValueType>::type,
21687 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value,
int > = 0 >
21691 return value(ptr.convert(), std::forward<ValueType>(default_value));
21729 std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
21730 std::is_same<IteratorType, typename basic_json_t::const_iterator>::value,
int > = 0 >
21739 IteratorType result =
end();
21743 case value_t::boolean:
21744 case value_t::number_float:
21745 case value_t::number_integer:
21746 case value_t::number_unsigned:
21747 case value_t::string:
21748 case value_t::binary:
21757 AllocatorType<string_t> alloc;
21758 std::allocator_traits<
decltype(alloc)>
::destroy(alloc,
m_data.m_value.string);
21759 std::allocator_traits<
decltype(alloc)>::deallocate(alloc,
m_data.m_value.string, 1);
21760 m_data.m_value.string =
nullptr;
21764 AllocatorType<binary_t> alloc;
21765 std::allocator_traits<
decltype(alloc)>
::destroy(alloc,
m_data.m_value.binary);
21766 std::allocator_traits<
decltype(alloc)>::deallocate(alloc,
m_data.m_value.binary, 1);
21767 m_data.m_value.binary =
nullptr;
21770 m_data.m_type = value_t::null;
21775 case value_t::object:
21777 result.m_it.object_iterator =
m_data.m_value.object->erase(pos.m_it.object_iterator);
21781 case value_t::array:
21783 result.m_it.array_iterator =
m_data.m_value.array->erase(pos.m_it.array_iterator);
21787 case value_t::null:
21788 case value_t::discarded:
21799 std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
21800 std::is_same<IteratorType, typename basic_json_t::const_iterator>::value,
int > = 0 >
21801 IteratorType
erase(IteratorType first, IteratorType last)
21809 IteratorType result =
end();
21813 case value_t::boolean:
21814 case value_t::number_float:
21815 case value_t::number_integer:
21816 case value_t::number_unsigned:
21817 case value_t::string:
21818 case value_t::binary:
21821 || !last.m_it.primitive_iterator.is_end()))
21828 AllocatorType<string_t> alloc;
21829 std::allocator_traits<
decltype(alloc)>
::destroy(alloc,
m_data.m_value.string);
21830 std::allocator_traits<
decltype(alloc)>::deallocate(alloc,
m_data.m_value.string, 1);
21831 m_data.m_value.string =
nullptr;
21835 AllocatorType<binary_t> alloc;
21836 std::allocator_traits<
decltype(alloc)>
::destroy(alloc,
m_data.m_value.binary);
21837 std::allocator_traits<
decltype(alloc)>::deallocate(alloc,
m_data.m_value.binary, 1);
21838 m_data.m_value.binary =
nullptr;
21841 m_data.m_type = value_t::null;
21846 case value_t::object:
21848 result.m_it.object_iterator =
m_data.m_value.object->erase(first.m_it.object_iterator,
21849 last.m_it.object_iterator);
21853 case value_t::array:
21855 result.m_it.array_iterator =
m_data.m_value.array->erase(first.m_it.array_iterator,
21856 last.m_it.array_iterator);
21860 case value_t::null:
21861 case value_t::discarded:
21880 return m_data.m_value.object->erase(std::forward<KeyType>(
key));
21893 const auto it =
m_data.m_value.object->find(std::forward<KeyType>(
key));
21894 if (it !=
m_data.m_value.object->end())
21896 m_data.m_value.object->erase(it);
21955 auto result =
end();
21959 result.m_it.object_iterator =
m_data.m_value.object->find(
key);
21969 auto result =
cend();
21973 result.m_it.object_iterator =
m_data.m_value.object->find(
key);
21985 auto result =
end();
21989 result.m_it.object_iterator =
m_data.m_value.object->find(std::forward<KeyType>(
key));
22001 auto result =
cend();
22005 result.m_it.object_iterator =
m_data.m_value.object->find(std::forward<KeyType>(
key));
22052 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
22056 return ptr.contains(
this);
22073 result.set_begin();
22089 result.set_begin();
22169 return ref.items();
22180 return ref.items();
22212 case value_t::null:
22218 case value_t::array:
22221 return m_data.m_value.array->empty();
22224 case value_t::object:
22227 return m_data.m_value.object->empty();
22230 case value_t::string:
22231 case value_t::boolean:
22232 case value_t::number_integer:
22233 case value_t::number_unsigned:
22234 case value_t::number_float:
22235 case value_t::binary:
22236 case value_t::discarded:
22251 case value_t::null:
22257 case value_t::array:
22260 return m_data.m_value.array->size();
22263 case value_t::object:
22266 return m_data.m_value.object->size();
22269 case value_t::string:
22270 case value_t::boolean:
22271 case value_t::number_integer:
22272 case value_t::number_unsigned:
22273 case value_t::number_float:
22274 case value_t::binary:
22275 case value_t::discarded:
22290 case value_t::array:
22293 return m_data.m_value.array->max_size();
22296 case value_t::object:
22299 return m_data.m_value.object->max_size();
22302 case value_t::null:
22303 case value_t::string:
22304 case value_t::boolean:
22305 case value_t::number_integer:
22306 case value_t::number_unsigned:
22307 case value_t::number_float:
22308 case value_t::binary:
22309 case value_t::discarded:
22333 case value_t::number_integer:
22335 m_data.m_value.number_integer = 0;
22339 case value_t::number_unsigned:
22341 m_data.m_value.number_unsigned = 0;
22345 case value_t::number_float:
22347 m_data.m_value.number_float = 0.0;
22351 case value_t::boolean:
22353 m_data.m_value.boolean =
false;
22357 case value_t::string:
22359 m_data.m_value.string->clear();
22363 case value_t::binary:
22365 m_data.m_value.binary->clear();
22369 case value_t::array:
22371 m_data.m_value.array->clear();
22375 case value_t::object:
22377 m_data.m_value.object->clear();
22381 case value_t::null:
22382 case value_t::discarded:
22401 m_data.m_type = value_t::array;
22402 m_data.m_value = value_t::array;
22407 const auto old_capacity =
m_data.m_value.array->capacity();
22408 m_data.m_value.array->push_back(std::move(val));
22434 m_data.m_type = value_t::array;
22435 m_data.m_value = value_t::array;
22440 const auto old_capacity =
m_data.m_value.array->capacity();
22441 m_data.m_value.array->push_back(val);
22466 m_data.m_type = value_t::object;
22467 m_data.m_value = value_t::object;
22472 auto res =
m_data.m_value.object->insert(val);
22488 if (
is_object() && init.size() == 2 && (*init.begin())->is_string())
22491 push_back(
typename object_t::value_type(
22492 std::move(
key.get_ref<
string_t&>()), (init.begin() + 1)->moved_or_copied()));
22510 template<
class... Args>
22522 m_data.m_type = value_t::array;
22523 m_data.m_value = value_t::array;
22528 const auto old_capacity =
m_data.m_value.array->capacity();
22529 m_data.m_value.array->emplace_back(std::forward<Args>(args)...);
22535 template<
class... Args>
22547 m_data.m_type = value_t::object;
22548 m_data.m_value = value_t::object;
22553 auto res =
m_data.m_value.object->emplace(std::forward<Args>(args)...);
22558 it.m_it.object_iterator = res.first;
22561 return { it, res.second };
22567 template<
typename... Args>
22573 auto insert_pos = std::distance(
m_data.m_value.array->begin(), pos.m_it.array_iterator);
22574 m_data.m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);
22575 result.m_it.array_iterator =
m_data.m_value.array->begin() + insert_pos;
22609 return insert(pos, val);
22660 return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator);
22705 m_data.m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);
22722 m_data.m_type = value_t::object;
22744 for (
auto it = first; it != last; ++it)
22746 if (merge_objects && it.value().is_object())
22748 auto it2 =
m_data.m_value.object->find(it.key());
22749 if (it2 !=
m_data.m_value.object->end())
22751 it2->second.update(it.value(),
true);
22755 m_data.m_value.object->operator[](it.key()) = it.value();
22756#if JSON_DIAGNOSTICS
22757 m_data.m_value.object->operator[](it.key()).m_parent =
this;
22765 std::is_nothrow_move_constructible<value_t>::value&&
22766 std::is_nothrow_move_assignable<value_t>::value&&
22767 std::is_nothrow_move_constructible<json_value>::value&&
22768 std::is_nothrow_move_assignable<json_value>::value
22775 other.set_parents();
22782 std::is_nothrow_move_constructible<value_t>::value&&
22783 std::is_nothrow_move_assignable<value_t>::value&&
22784 std::is_nothrow_move_constructible<json_value>::value&&
22785 std::is_nothrow_move_assignable<json_value>::value
22857 void swap(
typename binary_t::container_type& other)
22882#define JSON_IMPLEMENT_OPERATOR(op, null_result, unordered_result, default_result) \
22883 const auto lhs_type = lhs.type(); \
22884 const auto rhs_type = rhs.type(); \
22886 if (lhs_type == rhs_type) \
22888 switch (lhs_type) \
22890 case value_t::array: \
22891 return (*lhs.m_data.m_value.array) op (*rhs.m_data.m_value.array); \
22893 case value_t::object: \
22894 return (*lhs.m_data.m_value.object) op (*rhs.m_data.m_value.object); \
22896 case value_t::null: \
22897 return (null_result); \
22899 case value_t::string: \
22900 return (*lhs.m_data.m_value.string) op (*rhs.m_data.m_value.string); \
22902 case value_t::boolean: \
22903 return (lhs.m_data.m_value.boolean) op (rhs.m_data.m_value.boolean); \
22905 case value_t::number_integer: \
22906 return (lhs.m_data.m_value.number_integer) op (rhs.m_data.m_value.number_integer); \
22908 case value_t::number_unsigned: \
22909 return (lhs.m_data.m_value.number_unsigned) op (rhs.m_data.m_value.number_unsigned); \
22911 case value_t::number_float: \
22912 return (lhs.m_data.m_value.number_float) op (rhs.m_data.m_value.number_float); \
22914 case value_t::binary: \
22915 return (*lhs.m_data.m_value.binary) op (*rhs.m_data.m_value.binary); \
22917 case value_t::discarded: \
22919 return (unordered_result); \
22922 else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) \
22924 return static_cast<number_float_t>(lhs.m_data.m_value.number_integer) op rhs.m_data.m_value.number_float; \
22926 else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) \
22928 return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_integer); \
22930 else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) \
22932 return static_cast<number_float_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_float; \
22934 else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) \
22936 return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_unsigned); \
22938 else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) \
22940 return static_cast<number_integer_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_integer; \
22942 else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) \
22944 return lhs.m_data.m_value.number_integer op static_cast<number_integer_t>(rhs.m_data.m_value.number_unsigned); \
22946 else if(compares_unordered(lhs, rhs))\
22948 return (unordered_result);\
22951 return (default_result);
22962 || (
rhs.is_number_float() && std::isnan(
rhs.m_data.m_value.number_float) && lhs.
is_number()))
22966#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
22975 bool compares_unordered(const_reference rhs,
bool inverse =
false) const noexcept
22977 return compares_unordered(*
this, rhs, inverse);
22981#if JSON_HAS_THREE_WAY_COMPARISON
22984 bool operator==(const_reference rhs)
const noexcept
22987#pragma GCC diagnostic push
22988#pragma GCC diagnostic ignored "-Wfloat-equal"
22990 const_reference lhs = *
this;
22993#pragma GCC diagnostic pop
22999 template<
typename ScalarType>
23000 requires std::is_scalar_v<ScalarType>
23001 bool operator==(ScalarType rhs)
const noexcept
23003 return *
this == basic_json(rhs);
23008 bool operator!=(const_reference rhs)
const noexcept
23010 if (compares_unordered(rhs,
true))
23019 std::partial_ordering operator<=>(const_reference rhs)
const noexcept
23021 const_reference lhs = *
this;
23025 std::partial_ordering::equivalent,
23026 std::partial_ordering::unordered,
23027 lhs_type <=> rhs_type)
23032 template<
typename ScalarType>
23033 requires std::is_scalar_v<ScalarType>
23034 std::partial_ordering operator<=>(ScalarType rhs)
const noexcept
23036 return *this <=> basic_json(rhs);
23039#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
23046 bool operator<=(const_reference rhs)
const noexcept
23048 if (compares_unordered(rhs,
true))
23052 return !(rhs < *
this);
23057 template<
typename ScalarType>
23058 requires std::is_scalar_v<ScalarType>
23059 bool operator<=(ScalarType rhs)
const noexcept
23061 return *
this <= basic_json(rhs);
23067 bool operator>=(const_reference rhs)
const noexcept
23069 if (compares_unordered(rhs,
true))
23073 return !(*
this < rhs);
23078 template<
typename ScalarType>
23079 requires std::is_scalar_v<ScalarType>
23080 bool operator>=(ScalarType rhs)
const noexcept
23082 return *
this >= basic_json(rhs);
23088 friend bool operator==(const_reference lhs, const_reference rhs)
noexcept
23091#pragma GCC diagnostic push
23092#pragma GCC diagnostic ignored "-Wfloat-equal"
23096#pragma GCC diagnostic pop
23102 template<
typename ScalarType,
typename std::enable_if<
23103 std::is_scalar<ScalarType>::value,
int>::type = 0>
23104 friend bool operator==(const_reference lhs, ScalarType rhs)
noexcept
23106 return lhs == basic_json(rhs);
23111 template<
typename ScalarType,
typename std::enable_if<
23112 std::is_scalar<ScalarType>::value,
int>::type = 0>
23113 friend bool operator==(ScalarType lhs, const_reference rhs)
noexcept
23115 return basic_json(lhs) == rhs;
23120 friend bool operator!=(const_reference lhs, const_reference rhs)
noexcept
23122 if (compares_unordered(lhs, rhs,
true))
23126 return !(lhs == rhs);
23131 template<
typename ScalarType,
typename std::enable_if<
23132 std::is_scalar<ScalarType>::value,
int>::type = 0>
23133 friend bool operator!=(const_reference lhs, ScalarType rhs)
noexcept
23135 return lhs != basic_json(rhs);
23140 template<
typename ScalarType,
typename std::enable_if<
23141 std::is_scalar<ScalarType>::value,
int>::type = 0>
23142 friend bool operator!=(ScalarType lhs, const_reference rhs)
noexcept
23144 return basic_json(lhs) != rhs;
23149 friend bool operator<(const_reference lhs, const_reference rhs)
noexcept
23159 template<
typename ScalarType,
typename std::enable_if<
23160 std::is_scalar<ScalarType>::value,
int>::type = 0>
23161 friend bool operator<(const_reference lhs, ScalarType rhs)
noexcept
23163 return lhs < basic_json(rhs);
23168 template<
typename ScalarType,
typename std::enable_if<
23169 std::is_scalar<ScalarType>::value,
int>::type = 0>
23170 friend bool operator<(ScalarType lhs, const_reference rhs)
noexcept
23172 return basic_json(lhs) < rhs;
23177 friend bool operator<=(const_reference lhs, const_reference rhs)
noexcept
23179 if (compares_unordered(lhs, rhs,
true))
23183 return !(rhs < lhs);
23188 template<
typename ScalarType,
typename std::enable_if<
23189 std::is_scalar<ScalarType>::value,
int>::type = 0>
23190 friend bool operator<=(const_reference lhs, ScalarType rhs)
noexcept
23192 return lhs <= basic_json(rhs);
23197 template<
typename ScalarType,
typename std::enable_if<
23198 std::is_scalar<ScalarType>::value,
int>::type = 0>
23199 friend bool operator<=(ScalarType lhs, const_reference rhs)
noexcept
23201 return basic_json(lhs) <= rhs;
23206 friend bool operator>(const_reference lhs, const_reference rhs)
noexcept
23209 if (compares_unordered(lhs, rhs))
23213 return !(lhs <= rhs);
23218 template<
typename ScalarType,
typename std::enable_if<
23219 std::is_scalar<ScalarType>::value,
int>::type = 0>
23220 friend bool operator>(const_reference lhs, ScalarType rhs)
noexcept
23222 return lhs > basic_json(rhs);
23227 template<
typename ScalarType,
typename std::enable_if<
23228 std::is_scalar<ScalarType>::value,
int>::type = 0>
23229 friend bool operator>(ScalarType lhs, const_reference rhs)
noexcept
23231 return basic_json(lhs) > rhs;
23236 friend bool operator>=(const_reference lhs, const_reference rhs)
noexcept
23238 if (compares_unordered(lhs, rhs,
true))
23242 return !(lhs < rhs);
23247 template<
typename ScalarType,
typename std::enable_if<
23248 std::is_scalar<ScalarType>::value,
int>::type = 0>
23249 friend bool operator>=(const_reference lhs, ScalarType rhs)
noexcept
23251 return lhs >= basic_json(rhs);
23256 template<
typename ScalarType,
typename std::enable_if<
23257 std::is_scalar<ScalarType>::value,
int>::type = 0>
23258 friend bool operator>=(ScalarType lhs, const_reference rhs)
noexcept
23260 return basic_json(lhs) >= rhs;
23264#undef JSON_IMPLEMENT_OPERATOR
23277 friend std::ostream&
operator<<(std::ostream& o,
const basic_json& j)
23280 const bool pretty_print = o.width() > 0;
23281 const auto indentation = pretty_print ? o.width() : 0;
23287 serializer s(detail::output_adapter<char>(o), o.fill());
23288 s.dump(j, pretty_print,
false,
static_cast<unsigned int>(indentation));
23299 friend std::ostream& operator>>(
const basic_json& j, std::ostream& o)
23315 template<
typename InputType>
23317 static basic_json parse(InputType&& i,
23318 const parser_callback_t cb =
nullptr,
23319 const bool allow_exceptions =
true,
23320 const bool ignore_comments =
false)
23323 parser(
detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions, ignore_comments).parse(
true, result);
23329 template<
typename IteratorType>
23331 static basic_json parse(IteratorType first,
23333 const parser_callback_t cb =
nullptr,
23334 const bool allow_exceptions =
true,
23335 const bool ignore_comments =
false)
23338 parser(
detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(
true, result);
23344 static basic_json parse(detail::span_input_adapter&& i,
23345 const parser_callback_t cb =
nullptr,
23346 const bool allow_exceptions =
true,
23347 const bool ignore_comments =
false)
23350 parser(i.get(), cb, allow_exceptions, ignore_comments).parse(
true, result);
23356 template<
typename InputType>
23357 static bool accept(InputType&& i,
23358 const bool ignore_comments =
false)
23360 return parser(
detail::input_adapter(std::forward<InputType>(i)),
nullptr,
false, ignore_comments).accept(
true);
23365 template<
typename IteratorType>
23366 static bool accept(IteratorType first, IteratorType last,
23367 const bool ignore_comments =
false)
23369 return parser(
detail::input_adapter(std::move(first), std::move(last)),
nullptr,
false, ignore_comments).accept(
true);
23374 static bool accept(detail::span_input_adapter&& i,
23375 const bool ignore_comments =
false)
23377 return parser(i.get(),
nullptr,
false, ignore_comments).accept(
true);
23382 template <
typename InputType,
typename SAX>
23386 const
bool strict = true,
23387 const
bool ignore_comments = false)
23390 return format == input_format_t::json
23391 ?
parser(std::move(ia),
nullptr,
true, ignore_comments).sax_parse(sax, strict)
23397 template<
class IteratorType,
class SAX>
23399 static
bool sax_parse(IteratorType first, IteratorType last, SAX* sax,
23401 const
bool strict = true,
23402 const
bool ignore_comments = false)
23405 return format == input_format_t::json
23406 ?
parser(std::move(ia),
nullptr,
true, ignore_comments).sax_parse(sax, strict)
23415 template <
typename SAX>
23420 const
bool strict = true,
23421 const
bool ignore_comments = false)
23424 return format == input_format_t::json
23426 ?
parser(std::move(ia),
nullptr,
true, ignore_comments).sax_parse(sax, strict)
23464 case value_t::null:
23466 case value_t::object:
23468 case value_t::array:
23470 case value_t::string:
23472 case value_t::boolean:
23474 case value_t::binary:
23476 case value_t::discarded:
23477 return "discarded";
23478 case value_t::number_integer:
23479 case value_t::number_unsigned:
23480 case value_t::number_float:
23494 value_t m_type = value_t::null;
23524#if JSON_DIAGNOSTICS
23541 std::vector<std::uint8_t> result;
23564 std::vector<std::uint8_t> result;
23586 const bool use_size =
false,
23587 const bool use_type =
false)
23589 std::vector<std::uint8_t> result;
23590 to_ubjson(j, result, use_size, use_type);
23597 const bool use_size =
false,
const bool use_type =
false)
23605 const bool use_size =
false,
const bool use_type =
false)
23613 const bool use_size =
false,
23614 const bool use_type =
false)
23616 std::vector<std::uint8_t> result;
23617 to_bjdata(j, result, use_size, use_type);
23624 const bool use_size =
false,
const bool use_type =
false)
23632 const bool use_size =
false,
const bool use_type =
false)
23641 std::vector<std::uint8_t> result;
23662 template<
typename InputType>
23665 const bool strict =
true,
23666 const bool allow_exceptions =
true,
23672 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
23673 return res ? result :
basic_json(value_t::discarded);
23678 template<
typename IteratorType>
23681 const bool strict =
true,
23682 const bool allow_exceptions =
true,
23688 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
23689 return res ? result :
basic_json(value_t::discarded);
23692 template<
typename T>
23696 const
bool strict = true,
23697 const
bool allow_exceptions = true,
23700 return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);
23706 const
bool strict = true,
23707 const
bool allow_exceptions = true,
23714 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
23715 return res ? result :
basic_json(value_t::discarded);
23720 template<
typename InputType>
23723 const bool strict =
true,
23724 const bool allow_exceptions =
true)
23729 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict);
23730 return res ? result :
basic_json(value_t::discarded);
23735 template<
typename IteratorType>
23738 const bool strict =
true,
23739 const bool allow_exceptions =
true)
23744 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict);
23745 return res ? result :
basic_json(value_t::discarded);
23748 template<
typename T>
23752 const
bool strict = true,
23753 const
bool allow_exceptions = true)
23755 return from_msgpack(ptr, ptr + len, strict, allow_exceptions);
23761 const
bool strict = true,
23762 const
bool allow_exceptions = true)
23768 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict);
23769 return res ? result :
basic_json(value_t::discarded);
23774 template<
typename InputType>
23777 const bool strict =
true,
23778 const bool allow_exceptions =
true)
23783 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict);
23784 return res ? result :
basic_json(value_t::discarded);
23789 template<
typename IteratorType>
23792 const bool strict =
true,
23793 const bool allow_exceptions =
true)
23798 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict);
23799 return res ? result :
basic_json(value_t::discarded);
23802 template<
typename T>
23806 const
bool strict = true,
23807 const
bool allow_exceptions = true)
23809 return from_ubjson(ptr, ptr + len, strict, allow_exceptions);
23815 const
bool strict = true,
23816 const
bool allow_exceptions = true)
23822 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict);
23823 return res ? result :
basic_json(value_t::discarded);
23828 template<
typename InputType>
23831 const bool strict =
true,
23832 const bool allow_exceptions =
true)
23837 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict);
23838 return res ? result :
basic_json(value_t::discarded);
23843 template<
typename IteratorType>
23846 const bool strict =
true,
23847 const bool allow_exceptions =
true)
23852 const bool res =
binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict);
23853 return res ? result :
basic_json(value_t::discarded);
23858 template<
typename InputType>
23861 const bool strict =
true,
23862 const bool allow_exceptions =
true)
23868 return res ? result :
basic_json(value_t::discarded);
23873 template<
typename IteratorType>
23876 const bool strict =
true,
23877 const bool allow_exceptions =
true)
23883 return res ? result :
basic_json(value_t::discarded);
23886 template<
typename T>
23890 const
bool strict = true,
23891 const
bool allow_exceptions = true)
23893 return from_bson(ptr, ptr + len, strict, allow_exceptions);
23899 const
bool strict = true,
23900 const
bool allow_exceptions = true)
23907 return res ? result :
basic_json(value_t::discarded);
23925 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
23929 return ptr.get_unchecked(
this);
23939 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
23943 return ptr.get_unchecked(
this);
23953 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
23957 return ptr.get_checked(
this);
23967 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
23971 return ptr.get_checked(
this);
24005 enum class patch_operations { add, remove, replace, move, copy, test, invalid };
24007 const auto get_op = [](
const std::string& op)
24011 return patch_operations::add;
24013 if (op ==
"remove")
24015 return patch_operations::remove;
24017 if (op ==
"replace")
24019 return patch_operations::replace;
24023 return patch_operations::move;
24027 return patch_operations::copy;
24031 return patch_operations::test;
24034 return patch_operations::invalid;
24049 if (top_pointer != ptr)
24051 result.
at(top_pointer);
24055 const auto last_path = ptr.
back();
24060 switch (parent.
m_data.m_type)
24062 case value_t::null:
24063 case value_t::object:
24066 parent[last_path] = val;
24070 case value_t::array:
24072 if (last_path ==
"-")
24079 const auto idx = json_pointer::template array_index<basic_json_t>(last_path);
24093 case value_t::string:
24094 case value_t::boolean:
24095 case value_t::number_integer:
24096 case value_t::number_unsigned:
24097 case value_t::number_float:
24098 case value_t::binary:
24099 case value_t::discarded:
24106 const auto operation_remove = [
this, &result](
json_pointer& ptr)
24109 const auto last_path = ptr.
back();
24117 auto it = parent.
find(last_path);
24130 parent.
erase(json_pointer::template array_index<basic_json_t>(last_path));
24141 for (
const auto& val : json_patch)
24144 const auto get_value = [&val](
const std::string& op,
24145 const std::string& member,
24149 auto it = val.m_data.m_value.object->find(member);
24152 const auto error_msg = (op ==
"op") ?
"operation" :
detail::concat(
"operation '", op,
'\'');
24180 const auto path = get_value(op,
"path",
true).template
get<std::string>();
24183 switch (get_op(op))
24185 case patch_operations::add:
24187 operation_add(ptr, get_value(
"add",
"value",
false));
24191 case patch_operations::remove:
24193 operation_remove(ptr);
24197 case patch_operations::replace:
24200 result.
at(ptr) = get_value(
"replace",
"value",
false);
24204 case patch_operations::move:
24206 const auto from_path = get_value(
"move",
"from",
true).template
get<std::string>();
24216 operation_remove(from_ptr);
24217 operation_add(ptr, v);
24221 case patch_operations::copy:
24223 const auto from_path = get_value(
"copy",
"from",
true).template
get<std::string>();
24232 operation_add(ptr, v);
24236 case patch_operations::test:
24238 bool success =
false;
24243 success = (result.
at(ptr) == get_value(
"test",
"value",
false));
24259 case patch_operations::invalid:
24283 const std::string& path =
"")
24289 if (source == target)
24294 if (source.
type() != target.
type())
24299 {
"op",
"replace"}, {
"path", path}, {
"value", target}
24304 switch (source.
type())
24306 case value_t::array:
24310 while (i < source.
size() && i < target.
size())
24313 auto temp_diff =
diff(source[i], target[i],
detail::concat(path,
'/', std::to_string(i)));
24314 result.
insert(result.
end(), temp_diff.begin(), temp_diff.end());
24323 while (i < source.
size())
24327 result.
insert(result.
begin() + end_index,
object(
24330 {
"path", detail::concat(path,
'/', std::to_string(i))}
24336 while (i < target.
size())
24342 {
"value", target[i]}
24350 case value_t::object:
24353 for (
auto it = source.
cbegin(); it != source.
cend(); ++it)
24358 if (target.
find(it.key()) != target.
end())
24361 auto temp_diff =
diff(it.value(), target[it.key()], path_key);
24362 result.
insert(result.
end(), temp_diff.begin(), temp_diff.end());
24369 {
"op",
"remove"}, {
"path", path_key}
24375 for (
auto it = target.
cbegin(); it != target.
cend(); ++it)
24377 if (source.
find(it.key()) == source.
end())
24383 {
"op",
"add"}, {
"path", path_key},
24384 {
"value", it.value()}
24392 case value_t::null:
24393 case value_t::string:
24394 case value_t::boolean:
24395 case value_t::number_integer:
24396 case value_t::number_unsigned:
24397 case value_t::number_float:
24398 case value_t::binary:
24399 case value_t::discarded:
24405 {
"op",
"replace"}, {
"path", path}, {
"value", target}
24432 for (
auto it = apply_patch.
begin(); it != apply_patch.
end(); ++it)
24434 if (it.value().is_null())
24440 operator[](it.key()).merge_patch(it.value());
24446 *
this = apply_patch;
24469#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
24470 inline nlohmann::json
operator ""_json(
const char* s, std::size_t n)
24472 inline nlohmann::json
operator "" _json(
const char* s, std::size_t n)
24475 return nlohmann::json::parse(s, s + n);
24481#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
24506 std::size_t
operator()(
const nlohmann::NLOHMANN_BASIC_JSON_TPL& j)
const
24508 return nlohmann::detail::hash(j);
24514 struct less< ::nlohmann::detail::value_t>
24521 ::nlohmann::detail::value_t rhs)
const noexcept
24523#if JSON_HAS_THREE_WAY_COMPARISON
24524 return std::is_lt(lhs <=> rhs);
24526 return ::nlohmann::detail::operator<(lhs, rhs);
24532#ifndef JSON_HAS_CPP_20
24537 inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2)
noexcept(
24538 is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&&
24539 is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value)
24548#if JSON_USE_GLOBAL_UDLS
24549#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
24550using nlohmann::literals::json_literals::operator
""_json;
24551using nlohmann::literals::json_literals::operator
""_json_pointer;
24553using nlohmann::literals::json_literals::operator
"" _json;
24554using nlohmann::literals::json_literals::operator
"" _json_pointer;
24570#if defined(__clang__)
24571#pragma clang diagnostic pop
24576#undef JSON_INTERNAL_CATCH
24578#undef JSON_PRIVATE_UNLESS_TESTED
24579#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION
24580#undef NLOHMANN_BASIC_JSON_TPL
24581#undef JSON_EXPLICIT
24582#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL
24583#undef JSON_INLINE_VARIABLE
24584#undef JSON_NO_UNIQUE_ADDRESS
24585#undef JSON_DISABLE_ENUM_SERIALIZATION
24586#undef JSON_USE_GLOBAL_UDLS
24588#ifndef JSON_TEST_KEEP_MACROS
24591#undef JSON_HAS_CPP_11
24592#undef JSON_HAS_CPP_14
24593#undef JSON_HAS_CPP_17
24594#undef JSON_HAS_CPP_20
24595#undef JSON_HAS_FILESYSTEM
24596#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
24597#undef JSON_HAS_THREE_WAY_COMPARISON
24598#undef JSON_HAS_RANGES
24599#undef JSON_HAS_STATIC_RTTI
24600#undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
24614#undef JSON_HEDLEY_ALWAYS_INLINE
24615#undef JSON_HEDLEY_ARM_VERSION
24616#undef JSON_HEDLEY_ARM_VERSION_CHECK
24617#undef JSON_HEDLEY_ARRAY_PARAM
24618#undef JSON_HEDLEY_ASSUME
24619#undef JSON_HEDLEY_BEGIN_C_DECLS
24620#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE
24621#undef JSON_HEDLEY_CLANG_HAS_BUILTIN
24622#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
24623#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
24624#undef JSON_HEDLEY_CLANG_HAS_EXTENSION
24625#undef JSON_HEDLEY_CLANG_HAS_FEATURE
24626#undef JSON_HEDLEY_CLANG_HAS_WARNING
24627#undef JSON_HEDLEY_COMPCERT_VERSION
24628#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK
24629#undef JSON_HEDLEY_CONCAT
24630#undef JSON_HEDLEY_CONCAT3
24631#undef JSON_HEDLEY_CONCAT3_EX
24632#undef JSON_HEDLEY_CONCAT_EX
24633#undef JSON_HEDLEY_CONST
24634#undef JSON_HEDLEY_CONSTEXPR
24635#undef JSON_HEDLEY_CONST_CAST
24636#undef JSON_HEDLEY_CPP_CAST
24637#undef JSON_HEDLEY_CRAY_VERSION
24638#undef JSON_HEDLEY_CRAY_VERSION_CHECK
24639#undef JSON_HEDLEY_C_DECL
24640#undef JSON_HEDLEY_DEPRECATED
24641#undef JSON_HEDLEY_DEPRECATED_FOR
24642#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
24643#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
24644#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
24645#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
24646#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
24647#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION
24648#undef JSON_HEDLEY_DIAGNOSTIC_POP
24649#undef JSON_HEDLEY_DIAGNOSTIC_PUSH
24650#undef JSON_HEDLEY_DMC_VERSION
24651#undef JSON_HEDLEY_DMC_VERSION_CHECK
24652#undef JSON_HEDLEY_EMPTY_BASES
24653#undef JSON_HEDLEY_EMSCRIPTEN_VERSION
24654#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK
24655#undef JSON_HEDLEY_END_C_DECLS
24656#undef JSON_HEDLEY_FLAGS
24657#undef JSON_HEDLEY_FLAGS_CAST
24658#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE
24659#undef JSON_HEDLEY_GCC_HAS_BUILTIN
24660#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE
24661#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
24662#undef JSON_HEDLEY_GCC_HAS_EXTENSION
24663#undef JSON_HEDLEY_GCC_HAS_FEATURE
24664#undef JSON_HEDLEY_GCC_HAS_WARNING
24665#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
24666#undef JSON_HEDLEY_GCC_VERSION
24667#undef JSON_HEDLEY_GCC_VERSION_CHECK
24668#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE
24669#undef JSON_HEDLEY_GNUC_HAS_BUILTIN
24670#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
24671#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
24672#undef JSON_HEDLEY_GNUC_HAS_EXTENSION
24673#undef JSON_HEDLEY_GNUC_HAS_FEATURE
24674#undef JSON_HEDLEY_GNUC_HAS_WARNING
24675#undef JSON_HEDLEY_GNUC_VERSION
24676#undef JSON_HEDLEY_GNUC_VERSION_CHECK
24677#undef JSON_HEDLEY_HAS_ATTRIBUTE
24678#undef JSON_HEDLEY_HAS_BUILTIN
24679#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE
24680#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS
24681#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE
24682#undef JSON_HEDLEY_HAS_EXTENSION
24683#undef JSON_HEDLEY_HAS_FEATURE
24684#undef JSON_HEDLEY_HAS_WARNING
24685#undef JSON_HEDLEY_IAR_VERSION
24686#undef JSON_HEDLEY_IAR_VERSION_CHECK
24687#undef JSON_HEDLEY_IBM_VERSION
24688#undef JSON_HEDLEY_IBM_VERSION_CHECK
24689#undef JSON_HEDLEY_IMPORT
24690#undef JSON_HEDLEY_INLINE
24691#undef JSON_HEDLEY_INTEL_CL_VERSION
24692#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK
24693#undef JSON_HEDLEY_INTEL_VERSION
24694#undef JSON_HEDLEY_INTEL_VERSION_CHECK
24695#undef JSON_HEDLEY_IS_CONSTANT
24696#undef JSON_HEDLEY_IS_CONSTEXPR_
24697#undef JSON_HEDLEY_LIKELY
24698#undef JSON_HEDLEY_MALLOC
24699#undef JSON_HEDLEY_MCST_LCC_VERSION
24700#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK
24701#undef JSON_HEDLEY_MESSAGE
24702#undef JSON_HEDLEY_MSVC_VERSION
24703#undef JSON_HEDLEY_MSVC_VERSION_CHECK
24704#undef JSON_HEDLEY_NEVER_INLINE
24705#undef JSON_HEDLEY_NON_NULL
24706#undef JSON_HEDLEY_NO_ESCAPE
24707#undef JSON_HEDLEY_NO_RETURN
24708#undef JSON_HEDLEY_NO_THROW
24709#undef JSON_HEDLEY_NULL
24710#undef JSON_HEDLEY_PELLES_VERSION
24711#undef JSON_HEDLEY_PELLES_VERSION_CHECK
24712#undef JSON_HEDLEY_PGI_VERSION
24713#undef JSON_HEDLEY_PGI_VERSION_CHECK
24714#undef JSON_HEDLEY_PREDICT
24715#undef JSON_HEDLEY_PRINTF_FORMAT
24716#undef JSON_HEDLEY_PRIVATE
24717#undef JSON_HEDLEY_PUBLIC
24718#undef JSON_HEDLEY_PURE
24719#undef JSON_HEDLEY_REINTERPRET_CAST
24720#undef JSON_HEDLEY_REQUIRE
24721#undef JSON_HEDLEY_REQUIRE_CONSTEXPR
24722#undef JSON_HEDLEY_REQUIRE_MSG
24723#undef JSON_HEDLEY_RESTRICT
24724#undef JSON_HEDLEY_RETURNS_NON_NULL
24725#undef JSON_HEDLEY_SENTINEL
24726#undef JSON_HEDLEY_STATIC_ASSERT
24727#undef JSON_HEDLEY_STATIC_CAST
24728#undef JSON_HEDLEY_STRINGIFY
24729#undef JSON_HEDLEY_STRINGIFY_EX
24730#undef JSON_HEDLEY_SUNPRO_VERSION
24731#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK
24732#undef JSON_HEDLEY_TINYC_VERSION
24733#undef JSON_HEDLEY_TINYC_VERSION_CHECK
24734#undef JSON_HEDLEY_TI_ARMCL_VERSION
24735#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK
24736#undef JSON_HEDLEY_TI_CL2000_VERSION
24737#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK
24738#undef JSON_HEDLEY_TI_CL430_VERSION
24739#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK
24740#undef JSON_HEDLEY_TI_CL6X_VERSION
24741#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK
24742#undef JSON_HEDLEY_TI_CL7X_VERSION
24743#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK
24744#undef JSON_HEDLEY_TI_CLPRU_VERSION
24745#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK
24746#undef JSON_HEDLEY_TI_VERSION
24747#undef JSON_HEDLEY_TI_VERSION_CHECK
24748#undef JSON_HEDLEY_UNAVAILABLE
24749#undef JSON_HEDLEY_UNLIKELY
24750#undef JSON_HEDLEY_UNPREDICTABLE
24751#undef JSON_HEDLEY_UNREACHABLE
24752#undef JSON_HEDLEY_UNREACHABLE_RETURN
24753#undef JSON_HEDLEY_VERSION
24754#undef JSON_HEDLEY_VERSION_DECODE_MAJOR
24755#undef JSON_HEDLEY_VERSION_DECODE_MINOR
24756#undef JSON_HEDLEY_VERSION_DECODE_REVISION
24757#undef JSON_HEDLEY_VERSION_ENCODE
24758#undef JSON_HEDLEY_WARNING
24759#undef JSON_HEDLEY_WARN_UNUSED_RESULT
24760#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG
24761#undef JSON_HEDLEY_FALL_THROUGH
bool operator<(const Index2D &lhs, const Index2D &rhs)
namespace for Niels Lohmann
constexpr bool is_string() const noexcept
reference set_parent(reference j, std::size_t old_capacity=static_cast< std::size_t >(-1))
number_integer_t * get_impl_ptr(number_integer_t *) noexcept
get a pointer to the value (integer number)
size_type erase(const typename object_t::key_type &key)
remove element from a JSON object given a key
detail::cbor_tag_handler_t cbor_tag_handler_t
reference operator[](KeyType &&key)
access specified object element
json_value(object_t &&value)
constructor for rvalue objects
size_type size() const noexcept
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_cbor(IteratorType first, IteratorType last, const bool strict=true, const bool allow_exceptions=true, const cbor_tag_handler_t tag_handler=cbor_tag_handler_t::error)
create a JSON value from an input in CBOR format
json_value(typename binary_t::container_type &&value)
constructor for rvalue binary arrays
static std::vector< std::uint8_t > to_bjdata(const basic_json &j, const bool use_size=false, const bool use_type=false)
create a BJData serialization of a given JSON value
number_unsigned_t number_unsigned
auto get() const noexcept(noexcept(std::declval< const basic_json_t & >().template get_impl< ValueType >(detail::priority_tag< 4 > {}))) -> decltype(std::declval< const basic_json_t & >().template get_impl< ValueType >(detail::priority_tag< 4 > {}))
::nlohmann::detail::iteration_proxy< Iterator > iteration_proxy
const_iterator end() const noexcept
returns an iterator to one past the last element
reference back()
access the last element
basic_json(CompatibleType &&val) noexcept(noexcept(//NOLINT(bugprone-forwarding-reference-overload, bugprone-exception-escape) JSONSerializer< U >::to_json(std::declval< basic_json_t & >(), std::forward< CompatibleType >(val))))
create a JSON value from compatible types
detail::parse_error parse_error
number_float_t number_float
reverse_iterator rbegin() noexcept
returns an iterator to the reverse-beginning
detail::input_format_t input_format_t
basic_json patch(const basic_json &json_patch) const
applies a JSON patch to a copy of the current object
json_value(const array_t &value)
constructor for arrays
array_t * get_impl_ptr(array_t *) noexcept
get a pointer to the value (array)
JSON_HEDLEY_RETURNS_NON_NULL const char * type_name() const noexcept
const_reference front() const
access the first element
constexpr bool is_array() const noexcept
return whether value is an array
nlohmann::ordered_map< std::string, basic_json, default_object_comparator_t, std::allocator< std::pair< const std::string, basic_json > > > object_t
number_float_t * get_impl_ptr(number_float_t *) noexcept
get a pointer to the value (floating-point number)
void swap(reference other) noexcept(std::is_nothrow_move_constructible< value_t >::value &&std::is_nothrow_move_assignable< value_t >::value &&std::is_nothrow_move_constructible< json_value >::value &&//NOLINT(cppcoreguidelines-noexcept-swap, performance-noexcept-swap) std::is_nothrow_move_assignable< json_value >::value)
ReturnType value(const json_pointer &ptr, ValueType &&default_value) const
access specified object element via JSON Pointer with default value
size_type count(KeyType &&key) const
returns the number of occurrences of a key in a JSON object
constexpr const number_integer_t * get_impl_ptr(const number_integer_t *) const noexcept
get a pointer to the value (integer number)
iter_impl< const basic_json > const_iterator
static void to_bjdata(const basic_json &j, detail::output_adapter< char > o, const bool use_size=false, const bool use_type=false)
create a BJData serialization of a given JSON value
std::conditional< detail::is_c_string_uncvref< ValueType >::value, string_t, typename std::decay< ValueType >::type > value_return_type
constexpr bool is_number_integer() const noexcept
json_reverse_iterator< typename basic_json::const_iterator > const_reverse_iterator
data(size_type cnt, const basic_json &val)
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_bson(IteratorType first, IteratorType last, const bool strict=true, const bool allow_exceptions=true)
create a JSON value from an input in BSON format
::nlohmann::detail::json_base_class< void > json_base_class_t
basic_json get_impl(detail::priority_tag< 3 >) const
get special-case overload
static void to_bjdata(const basic_json &j, detail::output_adapter< std::uint8_t > o, const bool use_size=false, const bool use_type=false)
create a BJData serialization of a given JSON value
reference operator[](const json_pointer &ptr)
access specified element via JSON Pointer
typename std::allocator_traits< allocator_type >::const_pointer const_pointer
static JSON_HEDLEY_RETURNS_NON_NULL T * create(Args &&... args)
helper for exception-safe object creation
detail::type_error type_error
constexpr bool is_structured() const noexcept
json_value(boolean_t v) noexcept
constructor for booleans
const_reference operator[](KeyType &&key) const
access specified object element
detail::error_handler_t error_handler_t
boolean_t get_impl(boolean_t *) const
get a boolean (explicit)
const value_type & const_reference
detail::invalid_iterator invalid_iterator
void swap(binary_t &other)
exchanges the values
size_type max_size() const noexcept
returns the maximum possible number of elements
void update(const_reference j, bool merge_objects=false)
updates a JSON object from another object, overwriting existing keys
::nlohmann::detail::iter_impl< BasicJsonType > iter_impl
ReferenceType get_ref() const
get a reference value (implicit)
constexpr bool is_discarded() const noexcept
return whether value is discarded
JSON_PRIVATE_UNLESS_TESTED const_reference rhs
reference operator+=(initializer_list_t init)
add an object to an object
::nlohmann::detail::output_adapter_t< CharType > output_adapter_t
void push_back(basic_json &&val)
add an object to an array
const_reference operator[](const typename object_t::key_type &key) const
access specified object element
iteration_proxy< const_iterator > items() const noexcept
helper to access iterator member functions in range-based for
json_value(number_integer_t v) noexcept
constructor for numbers (integer)
static ReferenceType get_ref_impl(ThisType &obj)
helper function to implement get_ref()
::nlohmann::detail::json_reverse_iterator< Base > json_reverse_iterator
const_reference back() const
access the last element
IteratorType erase(IteratorType first, IteratorType last)
remove elements given an iterator range
reference operator+=(const basic_json &val)
add an object to an array
friend void swap(reference left, reference right) noexcept(std::is_nothrow_move_constructible< value_t >::value &&std::is_nothrow_move_assignable< value_t >::value &&std::is_nothrow_move_constructible< json_value >::value &&//NOLINT(cppcoreguidelines-noexcept-swap, performance-noexcept-swap) std::is_nothrow_move_assignable< json_value >::value)
exchanges the values
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_ubjson(InputType &&i, const bool strict=true, const bool allow_exceptions=true)
create a JSON value from an input in UBJSON format
constexpr const string_t * get_impl_ptr(const string_t *) const noexcept
get a pointer to the value (string)
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json binary(const typename binary_t::container_type &init, typename binary_t::subtype_type subtype)
explicitly create a binary array (with subtype)
detail::is_comparable< object_comparator_t, const typename object_t::key_type &, KeyType > is_comparable_with_object_key
iterator insert(const_iterator pos, size_type cnt, const basic_json &val)
inserts copies of element into array
object_t * get_impl_ptr(object_t *) noexcept
get a pointer to the value (object)
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_bson(InputType &&i, const bool strict=true, const bool allow_exceptions=true)
create a JSON value from an input in BSON format
static allocator_type get_allocator()
returns the allocator associated with the container
nlohmann::byte_container_with_subtype< std::vector< std::uint8_t > > binary_t
reference at(KeyType &&key)
access specified object element with bounds checking
constexpr bool is_number_unsigned() const noexcept
return whether value is an unsigned integer number
json_value(array_t &&value)
constructor for rvalue arrays
void update(const_iterator first, const_iterator last, bool merge_objects=false)
updates a JSON object from another object, overwriting existing keys
static std::vector< std::uint8_t > to_bson(const basic_json &j)
create a BSON serialization of a given JSON value
detail::exception exception
const_reverse_iterator rbegin() const noexcept
returns an iterator to the reverse-beginning
void push_back(initializer_list_t init)
add an object to an object
detail::parser_callback_t< basic_json > parser_callback_t
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json object(initializer_list_t init={})
ValueType & get_to(ValueType &v) const
static void to_msgpack(const basic_json &j, detail::output_adapter< char > o)
create a MessagePack serialization of a given JSON value
iterator begin() noexcept
detail::parse_event_t parse_event_t
JSON_PRIVATE_UNLESS_TESTED const_reference bool inverse
void assert_invariant(bool check_parents=true) const noexcept
checks the class invariants
ReturnType value(const typename object_t::key_type &key, ValueType &&default_value) const
access specified object element with default value
ValueType get_impl(detail::priority_tag< 0 >) const noexcept(noexcept(JSONSerializer< ValueType >::from_json(std::declval< const basic_json_t & >(), std::declval< ValueType & >())))
get a value (explicit)
json_value(string_t &&value)
constructor for rvalue strings
const_iterator cend() const noexcept
constexpr const binary_t * get_impl_ptr(const binary_t *) const noexcept
get a pointer to the value (binary)
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_bjdata(InputType &&i, const bool strict=true, const bool allow_exceptions=true)
create a JSON value from an input in BJData format
const_reference at(const json_pointer &ptr) const
access specified element via JSON Pointer
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json binary(typename binary_t::container_type &&init)
explicitly create a binary array
basic_json(std::nullptr_t=nullptr) noexcept
create a null object
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_cbor(InputType &&i, const bool strict=true, const bool allow_exceptions=true, const cbor_tag_handler_t tag_handler=cbor_tag_handler_t::error)
create a JSON value from an input in CBOR format
constexpr const number_unsigned_t * get_impl_ptr(const number_unsigned_t *) const noexcept
get a pointer to the value (unsigned number)
constexpr const boolean_t * get_impl_ptr(const boolean_t *) const noexcept
get a pointer to the value (boolean)
basic_json flatten() const
return flattened JSON value
constexpr const array_t * get_impl_ptr(const array_t *) const noexcept
get a pointer to the value (array)
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_ubjson(IteratorType first, IteratorType last, const bool strict=true, const bool allow_exceptions=true)
create a JSON value from an input in UBJSON format
json_value(number_unsigned_t v) noexcept
constructor for numbers (unsigned)
size_type erase(KeyType &&key)
remove element from a JSON object given a key
std::vector< basic_json, std::allocator< basic_json > > array_t
::nlohmann::detail::primitive_iterator_t primitive_iterator_t
json_value(const string_t &value)
constructor for strings
const binary_t & get_binary() const
get a binary value
iterator insert(const_iterator pos, const_iterator first, const_iterator last)
inserts range of elements into array
void patch_inplace(const basic_json &json_patch)
applies a JSON patch in-place without copying the object
ReturnType value(KeyType &&key, ValueType &&default_value) const
access specified object element via JSON Pointer with default value
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json diff(const basic_json &source, const basic_json &target, const std::string &path="")
creates a diff as a JSON patch
const_reference operator[](const json_pointer &ptr) const
access specified element via JSON Pointer
json_value(number_float_t v) noexcept
constructor for numbers (floating-point)
std::initializer_list< detail::json_ref< basic_json > > initializer_list_t
bool contains(KeyType &&key) const
check the existence of an element in a JSON object
static void to_cbor(const basic_json &j, detail::output_adapter< std::uint8_t > o)
create a CBOR serialization of a given JSON value
::nlohmann::detail::binary_reader< basic_json, InputType > binary_reader
static void to_bson(const basic_json &j, detail::output_adapter< char > o)
create a BSON serialization of a given JSON value
iterator find(const typename object_t::key_type &key)
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json binary(const typename binary_t::container_type &init)
explicitly create a binary array (without subtype)
BasicJsonType get_impl(detail::priority_tag< 2 >) const
get special-case overload
const_reference at(KeyType &&key) const
access specified object element with bounds checking
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json meta()
returns version information on the library
basic_json(size_type cnt, const basic_json &val)
construct an array with count copies of given value
const_iterator find(const typename object_t::key_type &key) const
find an element in a JSON object
static std::vector< std::uint8_t > to_cbor(const basic_json &j)
create a CBOR serialization of a given JSON value
IteratorType erase(IteratorType pos)
remove element given an iterator
iterator insert(const_iterator pos, const basic_json &val)
inserts element into array
ValueType value(const typename object_t::key_type &key, const ValueType &default_value) const
std::allocator< basic_json > allocator_type
typename std::allocator_traits< allocator_type >::pointer pointer
string_t dump(const int indent=-1, const char indent_char=' ', const bool ensure_ascii=false, const error_handler_t error_handler=error_handler_t::strict) const
serialization
void merge_patch(const basic_json &apply_patch)
applies a JSON Merge Patch
ValueType & get_to(ValueType &v) const noexcept(noexcept(JSONSerializer< ValueType >::from_json(std::declval< const basic_json_t & >(), v)))
get a value (explicit)
reference operator[](T *key)
reference at(size_type idx)
access specified array element with bounds checking
iterator find(KeyType &&key)
find an element in a JSON object
constexpr bool is_number_float() const noexcept
reverse_iterator rend() noexcept
returns an iterator to the reverse-end
static std::vector< std::uint8_t > to_ubjson(const basic_json &j, const bool use_size=false, const bool use_type=false)
create a UBJSON serialization of a given JSON value
reference at(const json_pointer &ptr)
access specified element via JSON Pointer
::nlohmann::detail::internal_iterator< BasicJsonType > internal_iterator
size_type erase_internal(KeyType &&key)
std::less< std::string > default_object_comparator_t
reference operator+=(const typename object_t::value_type &val)
add an object to an object
const_iterator cbegin() const noexcept
constexpr const number_float_t * get_impl_ptr(const number_float_t *) const noexcept
get a pointer to the value (floating-point number)
reference operator[](typename object_t::key_type key)
access specified object element
string_t * get_impl_ptr(string_t *) noexcept
get a pointer to the value (string)
constexpr auto get_ptr() const noexcept -> decltype(std::declval< const basic_json_t & >().get_impl_ptr(std::declval< PointerType >()))
get a pointer value (implicit)
~basic_json() noexcept
destructor
detail::out_of_range out_of_range
json_value(binary_t &&value)
constructor for rvalue binary arrays (internal type)
const_reverse_iterator crend() const noexcept
basic_json(initializer_list_t init, bool type_deduction=true, value_t manual_type=value_t::array)
create a container (array or object) from an initializer list
json_value(const object_t &value)
constructor for objects
void swap(typename binary_t::container_type &other)
exchanges the values
binary_t & get_binary()
get a binary value
const_iterator begin() const noexcept
returns an iterator to the first element
constexpr bool is_number() const noexcept
number_unsigned_t * get_impl_ptr(number_unsigned_t *) noexcept
get a pointer to the value (unsigned number)
void insert(const_iterator first, const_iterator last)
inserts range of elements into object
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_msgpack(InputType &&i, const bool strict=true, const bool allow_exceptions=true)
create a JSON value from an input in MessagePack format
auto get() noexcept -> decltype(std::declval< basic_json_t & >().template get_ptr< PointerType >())
get a pointer value (explicit)
const_reference operator[](T *key) const
reference operator[](size_type idx)
access specified array element
basic_json(const JsonRef &ref)
adl_serializer< T, SFINAE > json_serializer
basic_json & operator=(basic_json other) noexcept(std::is_nothrow_move_constructible< value_t >::value &&std::is_nothrow_move_assignable< value_t >::value &&std::is_nothrow_move_constructible< json_value >::value &&std::is_nothrow_move_assignable< json_value >::value &&std::is_nothrow_move_assignable< json_base_class_t >::value)
copy assignment
static iteration_proxy< iterator > iterator_wrapper(reference ref) noexcept
static void to_ubjson(const basic_json &j, detail::output_adapter< char > o, const bool use_size=false, const bool use_type=false)
create a UBJSON serialization of a given JSON value
Array get_to(T(&v)[N]) const noexcept(noexcept(JSONSerializer< Array >::from_json(std::declval< const basic_json_t & >(), v)))
std::int64_t number_integer_t
auto get_ptr() noexcept -> decltype(std::declval< basic_json_t & >().get_impl_ptr(std::declval< PointerType >()))
const_reference at(const typename object_t::key_type &key) const
access specified object element with bounds checking
binary_t * get_impl_ptr(binary_t *) noexcept
get a pointer to the value (binary)
constexpr bool is_binary() const noexcept
void swap(object_t &other)
exchanges the values
iterator set_parents(iterator it, typename iterator::difference_type count_set_parents)
constexpr auto get_impl(detail::priority_tag< 4 >) const noexcept -> decltype(std::declval< const basic_json_t & >().template get_ptr< PointerType >())
get a pointer value (explicit)
basic_json unflatten() const
unflatten a previously flattened JSON value
iterator insert(const_iterator pos, initializer_list_t ilist)
inserts elements from initializer list into array
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json binary(typename binary_t::container_type &&init, typename binary_t::subtype_type subtype)
explicitly create a binary array (with subtype)
iteration_proxy< iterator > items() noexcept
helper to access iterator member functions in range-based for
bool empty() const noexcept
checks whether the container is empty.
void swap(array_t &other)
exchanges the values
void erase(const size_type idx)
remove element from a JSON array given an index
reference operator+=(basic_json &&val)
add an object to an array
bool contains(const json_pointer &ptr) const
check the existence of an element in a JSON object given a JSON pointer
ValueType get_impl(detail::priority_tag< 1 >) const noexcept(noexcept(JSONSerializer< ValueType >::from_json(std::declval< const basic_json_t & >())))
get a value (explicit); special case
constexpr value_t type() const noexcept
reference emplace_back(Args &&... args)
add an object to an array
ValueType value(const json_pointer &ptr, const ValueType &default_value) const
access specified object element via JSON Pointer with default value
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json array(initializer_list_t init={})
explicitly create an array from an initializer list
friend class ::nlohmann::detail::parser
void push_back(const basic_json &val)
add an object to an array
ValueType value(KeyType &&key, const ValueType &default_value) const
access specified object element with default value
reference at(const typename object_t::key_type &key)
access specified object element with bounds checking
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_bjdata(IteratorType first, IteratorType last, const bool strict=true, const bool allow_exceptions=true)
create a JSON value from an input in BJData format
number_integer_t number_integer
const_reverse_iterator crbegin() const noexcept
json_sax< basic_json > json_sax_t
constexpr bool is_boolean() const noexcept
size_type count(const typename object_t::key_type &key) const
returns the number of occurrences of a key in a JSON object
reference front()
access the first element
constexpr bool is_primitive() const noexcept
return whether type is primitive
constexpr bool is_null() const noexcept
void clear() noexcept
clears the contents
constexpr const object_t * get_impl_ptr(const object_t *) const noexcept
get a pointer to the value (object)
json_value(value_t t)
constructor for empty values of a given type
static ::nlohmann::detail::parser< basic_json, InputAdapterType > parser(InputAdapterType adapter, detail::parser_callback_t< basic_json >cb=nullptr, const bool allow_exceptions=true, const bool ignore_comments=false)
static void to_ubjson(const basic_json &j, detail::output_adapter< std::uint8_t > o, const bool use_size=false, const bool use_type=false)
create a UBJSON serialization of a given JSON value
detail::other_error other_error
JSON_PRIVATE_UNLESS_TESTED const_reference bool static SAX bool sax_parse(InputType &&i, SAX *sax, input_format_t format=input_format_t::json, const bool strict=true, const bool ignore_comments=false)
basic_json(basic_json &&other) noexcept
move constructor
iter_impl< basic_json > iterator
basic_json(const value_t v)
create an empty value with a given type
const_reference operator[](size_type idx) const
access specified array element
std::ptrdiff_t difference_type
iterator insert(const_iterator pos, basic_json &&val)
inserts element into array
const_reverse_iterator rend() const noexcept
returns an iterator to the reverse-end
std::uint64_t number_unsigned_t
friend std::istream & operator>>(std::istream &i, basic_json &j)
static std::vector< std::uint8_t > to_msgpack(const basic_json &j)
create a MessagePack serialization of a given JSON value
void swap(string_t &other)
exchanges the values
basic_json(const BasicJsonType &val)
create a JSON value from an existing one
NLOHMANN_BASIC_JSON_TPL basic_json_t
boolean_t * get_impl_ptr(boolean_t *) noexcept
get a pointer to the value (boolean)
::nlohmann::detail::binary_writer< basic_json, CharType > binary_writer
json_reverse_iterator< typename basic_json::iterator > reverse_iterator
json_value(const binary_t &value)
constructor for binary arrays (internal type)
const_reference at(size_type idx) const
access specified array element with bounds checking
detail::actual_object_comparator_t< basic_json > object_comparator_t
basic_json(const basic_json &other)
copy constructor
void push_back(const typename object_t::value_type &val)
add an object to an object
std::pair< iterator, bool > emplace(Args &&... args)
add an object to an object if key does not exist
static void to_cbor(const basic_json &j, detail::output_adapter< char > o)
create a CBOR serialization of a given JSON value
constexpr bool is_object() const noexcept
return whether value is an object
static void to_msgpack(const basic_json &j, detail::output_adapter< std::uint8_t > o)
create a MessagePack serialization of a given JSON value
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json from_msgpack(IteratorType first, IteratorType last, const bool strict=true, const bool allow_exceptions=true)
create a JSON value from an input in MessagePack format
iterator insert_iterator(const_iterator pos, Args &&... args)
basic_json(InputIT first, InputIT last)
construct a JSON container given an iterator range
bool contains(const typename object_t::key_type &key) const
check the existence of an element in a JSON object
static void to_bson(const basic_json &j, detail::output_adapter< std::uint8_t > o)
create a BSON serialization of a given JSON value
const_iterator find(KeyType &&key) const
find an element in a JSON object
json_value(const typename binary_t::container_type &value)
constructor for binary arrays
::nlohmann::json_pointer< std::string > json_pointer
bool operator!=(const byte_container_with_subtype &rhs) const
byte_container_with_subtype() noexcept(noexcept(container_type()))
std::uint64_t subtype_type
bool operator==(const byte_container_with_subtype &rhs) const
BinaryType container_type
byte_container_with_subtype(container_type &&b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b))))
byte_container_with_subtype(container_type &&b) noexcept(noexcept(container_type(std::move(b))))
constexpr subtype_type subtype() const noexcept
return the binary subtype
byte_container_with_subtype(const container_type &b, subtype_type subtype_) noexcept(noexcept(container_type(b)))
constexpr bool has_subtype() const noexcept
return whether the value has a subtype
byte_container_with_subtype(const container_type &b) noexcept(noexcept(container_type(b)))
void set_subtype(subtype_type subtype_) noexcept
sets the binary subtype
void clear_subtype() noexcept
clears the binary subtype
deserialization of CBOR, MessagePack, and UBJSON values
json_sax_t * sax
the SAX parser
bool get_string(const input_format_t format, const NumberType len, string_t &result)
create a string by reading characters from the input
bool get_ubjson_size_type(std::pair< std::size_t, char_int_type > &result, bool inside_ndarray=false)
determine the type and size for a container
binary_reader(const binary_reader &)=delete
bool parse_bson_array()
Reads an array from the BSON input and passes it to the SAX-parser.
typename BasicJsonType::string_t string_t
std::size_t chars_read
the number of characters read
std::pair< char_int_type, string_t > bjd_type
bool parse_bson_element_list(const bool is_array)
Read a BSON element list (as specified in the BSON-spec)
typename InputAdapterType::char_type char_type
bool parse_msgpack_internal()
std::string get_token_string() const
const bool is_little_endian
whether we can assume little endianness
typename BasicJsonType::number_unsigned_t number_unsigned_t
bool get_msgpack_string(string_t &result)
reads a MessagePack string
std::string exception_message(const input_format_t format, const std::string &detail, const std::string &context) const
InputAdapterType ia
input adapter
bool get_ubjson_high_precision_number()
bool get_binary(const input_format_t format, const NumberType len, binary_t &result)
create a byte array by reading bytes from the input
binary_reader(binary_reader &&)=default
char_int_type get_ignore_noop()
bool get_ubjson_value(const char_int_type prefix)
bool get_ubjson_ndarray_size(std::vector< size_t > &dim)
bool parse_bson_element_internal(const char_int_type element_type, const std::size_t element_type_parse_position)
Read a BSON document element of the given element_type.
bool get_msgpack_object(const std::size_t len)
typename char_traits< char_type >::int_type char_int_type
binary_reader(InputAdapterType &&adapter, const input_format_t format=input_format_t::json) noexcept
create a binary reader
typename BasicJsonType::binary_t binary_t
bool parse_bson_internal()
Reads in a BSON-object and passes it to the SAX-parser.
binary_reader & operator=(const binary_reader &)=delete
bool get_cbor_object(const std::size_t len, const cbor_tag_handler_t tag_handler)
bool get_cbor_binary(binary_t &result)
reads a CBOR byte array
bool get_number(const input_format_t format, NumberType &result)
typename BasicJsonType::number_integer_t number_integer_t
bool unexpect_eof(const input_format_t format, const char *context) const
bool get_bson_cstr(string_t &result)
Parses a C-style string from the BSON input.
bool sax_parse(const input_format_t format, json_sax_t *sax_, const bool strict=true, const cbor_tag_handler_t tag_handler=cbor_tag_handler_t::error)
bool get_cbor_array(const std::size_t len, const cbor_tag_handler_t tag_handler)
char_int_type current
the current character
bool get_msgpack_array(const std::size_t len)
char_int_type get()
get next character from the input
typename BasicJsonType::number_float_t number_float_t
bool get_msgpack_binary(binary_t &result)
reads a MessagePack byte array
bool parse_ubjson_internal(const bool get_char=true)
bool get_ubjson_size_value(std::size_t &result, bool &is_ndarray, char_int_type prefix=0)
bool parse_cbor_internal(const bool get_char, const cbor_tag_handler_t tag_handler)
const decltype(JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_) bjd_types_map
bool get_bson_string(const NumberType len, string_t &result)
Parses a zero-terminated string of length len from the BSON input.
bool get_ubjson_string(string_t &result, const bool get_char=true)
reads a UBJSON string
static JSON_INLINE_VARIABLE constexpr std::size_t npos
bool get_cbor_string(string_t &result)
reads a CBOR string
const input_format_t input_format
input format
bool get_bson_binary(const NumberType len, binary_t &result)
Parses a byte array input of length len from the BSON input.
binary_reader & operator=(binary_reader &&)=default
void write_bson_binary(const string_t &name, const binary_t &value)
Writes a BSON element with key name and binary value value.
void write_bson_boolean(const string_t &name, const bool value)
Writes a BSON element with key name and boolean value value.
void write_bson(const BasicJsonType &j)
typename BasicJsonType::binary_t binary_t
void write_bson_integer(const string_t &name, const std::int64_t value)
Writes a BSON element with key name and integer value.
typename BasicJsonType::string_t string_t
static constexpr CharType to_char_type(std::uint8_t x) noexcept
static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept
void write_bson_array(const string_t &name, const typename BasicJsonType::array_t &value)
Writes a BSON element with key name and array value.
bool write_bjdata_ndarray(const typename BasicJsonType::object_t &value, const bool use_count, const bool use_type)
static CharType to_char_type(std::uint8_t x) noexcept
static constexpr CharType get_cbor_float_prefix(double)
void write_bson_string(const string_t &name, const string_t &value)
Writes a BSON element with key name and string value value.
binary_writer(output_adapter_t< CharType > adapter)
create a binary writer
static constexpr CharType get_ubjson_float_prefix(double)
void write_number_with_ubjson_prefix(const NumberType n, const bool add_prefix, const bool use_bjdata)
static constexpr CharType get_msgpack_float_prefix(double)
void write_bson_element(const string_t &name, const BasicJsonType &j)
Serializes the JSON value j to BSON and associates it with the key name.
static constexpr CharType to_char_type(InputCharType x) noexcept
void write_bson_object(const typename BasicJsonType::object_t &value)
void write_ubjson(const BasicJsonType &j, const bool use_count, const bool use_type, const bool add_prefix=true, const bool use_bjdata=false)
void write_bson_double(const string_t &name, const double value)
Writes a BSON element with key name and double value value.
static std::size_t calc_bson_string_size(const string_t &value)
void write_number(const NumberType n, const bool OutputIsLittleEndian=false)
static std::size_t calc_bson_entry_header_size(const string_t &name, const BasicJsonType &j)
void write_bson_null(const string_t &name)
Writes a BSON element with key name and null value.
typename BasicJsonType::number_float_t number_float_t
CharType ubjson_prefix(const BasicJsonType &j, const bool use_bjdata) const noexcept
determine the type prefix of container values
void write_bson_unsigned(const string_t &name, const BasicJsonType &j)
Writes a BSON element with key name and unsigned value.
static constexpr CharType get_ubjson_float_prefix(float)
static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t &value)
static std::size_t calc_bson_element_size(const string_t &name, const BasicJsonType &j)
Calculates the size necessary to serialize the JSON value j with its name.
void write_msgpack(const BasicJsonType &j)
static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t &value)
Calculates the size of the BSON serialization of the given JSON-object j.
void write_compact_float(const number_float_t n, detail::input_format_t format)
output_adapter_t< CharType > oa
the output
void write_cbor(const BasicJsonType &j)
static constexpr CharType get_cbor_float_prefix(float)
void write_bson_entry_header(const string_t &name, const std::uint8_t element_type)
Writes the given element_type and name to the output adapter.
void write_bson_object_entry(const string_t &name, const typename BasicJsonType::object_t &value)
Writes a BSON element with key name and object value.
static constexpr CharType get_msgpack_float_prefix(float)
const bool is_little_endian
whether we can assume little endianness
static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t &value)
static std::size_t calc_bson_integer_size(const std::int64_t value)
general exception of the basic_json class
exception(int id_, const char *what_arg)
const int id
the id of the exception
static std::string diagnostics(std::nullptr_t)
std::runtime_error m
an exception object as storage for error messages
static std::string name(const std::string &ename, int id_)
const char * what() const noexcept override
returns the explanatory string
static std::string diagnostics(const BasicJsonType *leaf_element)
exception indicating errors with iterators
static invalid_iterator create(int id_, const std::string &what_arg, BasicJsonContext context)
invalid_iterator(int id_, const char *what_arg)
iter_impl operator+(difference_type i) const
add to iterator
iter_impl & operator=(const iter_impl< typename std::remove_const< BasicJsonType >::type > &other) noexcept
converting assignment
typename std::conditional< std::is_const< BasicJsonType >::value, typename BasicJsonType::const_pointer, typename BasicJsonType::pointer >::type pointer
bool operator>=(const iter_impl &other) const
comparison: greater than or equal
iter_impl(const iter_impl< typename std::remove_const< BasicJsonType >::type > &other) noexcept
converting constructor
bool operator<(const iter_impl &other) const
comparison: smaller
bool operator<=(const iter_impl &other) const
comparison: less than or equal
iter_impl & operator-=(difference_type i)
subtract from iterator
iter_impl & operator--()
pre-decrement (–it)
const object_t::key_type & key() const
return the key of an object iterator
bool operator==(const IterImpl &other) const
comparison: equal
iter_impl operator++(int) &
post-increment (it++)
iter_impl & operator+=(difference_type i)
add to iterator
reference operator[](difference_type n) const
access to successor
typename BasicJsonType::difference_type difference_type
pointer operator->() const
dereference the iterator
internal_iterator< typename std::remove_const< BasicJsonType >::type > m_it
difference_type operator-(const iter_impl &other) const
return difference
iter_impl(iter_impl &&) noexcept=default
std::bidirectional_iterator_tag iterator_category
friend iter_impl operator+(difference_type i, const iter_impl &it)
addition of distance and iterator
bool operator>(const iter_impl &other) const
comparison: greater than
typename BasicJsonType::array_t array_t
typename BasicJsonType::object_t object_t
iter_impl & operator++()
pre-increment (++it)
typename std::conditional< std::is_const< BasicJsonType >::value, typename BasicJsonType::const_reference, typename BasicJsonType::reference >::type reference
typename BasicJsonType::value_type value_type
reference operator*() const
return a reference to the value pointed to by the iterator
iter_impl operator-(difference_type i) const
subtract from iterator
iter_impl< typename std::conditional< std::is_const< BasicJsonType >::value, typename std::remove_const< BasicJsonType >::type, const BasicJsonType >::type > other_iter_impl
the iterator with BasicJsonType of different const-ness
iter_impl & operator=(const iter_impl< const BasicJsonType > &other) noexcept
converting assignment
bool operator!=(const IterImpl &other) const
comparison: not equal
iter_impl operator--(int) &
post-decrement (it–)
iter_impl(const iter_impl< const BasicJsonType > &other) noexcept
const copy constructor
void set_end() noexcept
set the iterator past the last value
iteration_proxy_value operator++(int) &
iteration_proxy_value(iteration_proxy_value const &)=default
bool operator==(const iteration_proxy_value &o) const
equality operator (needed for InputIterator)
bool operator!=(const iteration_proxy_value &o) const
inequality operator (needed for range-based for)
std::ptrdiff_t difference_type
string_type empty_str
an empty string (to return a reference for primitive values)
iteration_proxy_value(IteratorType it, std::size_t array_index_=0) noexcept(std::is_nothrow_move_constructible< IteratorType >::value &&std::is_nothrow_default_constructible< string_type >::value)
iteration_proxy_value & operator++()
increment operator (needed for range-based for)
iteration_proxy_value()=default
iteration_proxy_value value_type
std::size_t array_index_last
last stringified array index
std::size_t array_index
an index for arrays (used to create key names)
iteration_proxy_value(iteration_proxy_value &&) noexcept(std::is_nothrow_move_constructible< IteratorType >::value &&std::is_nothrow_move_constructible< string_type >::value)=default
typename std::remove_cv< typename std::remove_reference< decltype(std::declval< IteratorType >().key()) >::type >::type string_type
IteratorType::reference value() const
return value of the iterator
const string_type & key() const
return key of the iterator
iteration_proxy_value & operator=(iteration_proxy_value const &)=default
std::input_iterator_tag iterator_category
string_type array_index_str
a string representation of the array index
IteratorType anchor
the iterator
proxy class for the items() function
IteratorType::pointer container
the container to iterate
iteration_proxy_value< IteratorType > end() const noexcept
return iterator end (needed for range-based for)
iteration_proxy(iteration_proxy const &)=default
iteration_proxy()=default
iteration_proxy(iteration_proxy &&) noexcept=default
iteration_proxy_value< IteratorType > begin() const noexcept
return iterator begin (needed for range-based for)
iteration_proxy(typename IteratorType::reference cont) noexcept
construct iteration proxy from a container
iteration_proxy & operator=(iteration_proxy const &)=default
json_ref(json_ref &&) noexcept=default
json_ref(const value_type &value)
json_ref(value_type &&value)
value_type const & operator*() const
value_type const * operator->() const
json_ref(std::initializer_list< json_ref > init)
json_ref(Args &&... args)
value_type moved_or_copied() const
value_type const * value_ref
json_reverse_iterator operator++(int) &
post-increment (it++)
json_reverse_iterator operator--(int) &
post-decrement (it–)
json_reverse_iterator & operator++()
pre-increment (++it)
std::ptrdiff_t difference_type
json_reverse_iterator & operator+=(difference_type i)
add to iterator
reference operator[](difference_type n) const
access to successor
auto key() const -> decltype(std::declval< Base >().key())
return the key of an object iterator
difference_type operator-(const json_reverse_iterator &other) const
return difference
typename Base::reference reference
the reference type for the pointed-to element
reference value() const
return the value of an iterator
json_reverse_iterator(const base_iterator &it) noexcept
create reverse iterator from base class
json_reverse_iterator & operator--()
pre-decrement (–it)
std::reverse_iterator< Base > base_iterator
shortcut to the reverse iterator adapter
json_reverse_iterator operator-(difference_type i) const
subtract from iterator
json_reverse_iterator(const typename base_iterator::iterator_type &it) noexcept
create reverse iterator from iterator
json_reverse_iterator operator+(difference_type i) const
add to iterator
typename BasicJsonType::number_unsigned_t number_unsigned_t
bool start_object(std::size_t=static_cast< std::size_t >(-1))
bool number_integer(number_integer_t)
bool start_array(std::size_t=static_cast< std::size_t >(-1))
bool number_unsigned(number_unsigned_t)
typename BasicJsonType::binary_t binary_t
bool number_float(number_float_t, const string_t &)
bool parse_error(std::size_t, const std::string &, const detail::exception &)
typename BasicJsonType::number_integer_t number_integer_t
typename BasicJsonType::number_float_t number_float_t
typename BasicJsonType::string_t string_t
bool parse_error(std::size_t, const std::string &, const Exception &ex)
const parser_callback_t callback
callback function
BasicJsonType & root
the parsed JSON value
typename BasicJsonType::string_t string_t
bool number_float(number_float_t val, const string_t &)
constexpr bool is_errored() const
bool string(string_t &val)
bool errored
whether a syntax error occurred
json_sax_dom_callback_parser & operator=(const json_sax_dom_callback_parser &)=delete
json_sax_dom_callback_parser(const json_sax_dom_callback_parser &)=delete
typename BasicJsonType::number_unsigned_t number_unsigned_t
typename BasicJsonType::binary_t binary_t
bool start_object(std::size_t len)
bool start_array(std::size_t len)
std::vector< bool > key_keep_stack
stack to manage which object keys to keep
typename BasicJsonType::number_integer_t number_integer_t
const bool allow_exceptions
whether to throw exceptions in case of errors
json_sax_dom_callback_parser(json_sax_dom_callback_parser &&)=default
std::vector< BasicJsonType * > ref_stack
stack to model hierarchy of values
std::vector< bool > keep_stack
stack to manage which values to keep
std::pair< bool, BasicJsonType * > handle_value(Value &&v, const bool skip_callback=false)
~json_sax_dom_callback_parser()=default
typename BasicJsonType::parse_event_t parse_event_t
BasicJsonType discarded
a discarded value for the callback
typename BasicJsonType::parser_callback_t parser_callback_t
bool number_unsigned(number_unsigned_t val)
json_sax_dom_callback_parser & operator=(json_sax_dom_callback_parser &&)=default
BasicJsonType * object_element
helper to hold the reference for the next object element
json_sax_dom_callback_parser(BasicJsonType &r, const parser_callback_t cb, const bool allow_exceptions_=true)
typename BasicJsonType::number_float_t number_float_t
bool number_integer(number_integer_t val)
bool binary(binary_t &val)
SAX implementation to create a JSON value from SAX events.
bool errored
whether a syntax error occurred
json_sax_dom_parser(const json_sax_dom_parser &)=delete
json_sax_dom_parser & operator=(json_sax_dom_parser &&)=default
bool string(string_t &val)
json_sax_dom_parser(BasicJsonType &r, const bool allow_exceptions_=true)
bool parse_error(std::size_t, const std::string &, const Exception &ex)
~json_sax_dom_parser()=default
typename BasicJsonType::string_t string_t
const bool allow_exceptions
whether to throw exceptions in case of errors
bool start_object(std::size_t len)
std::vector< BasicJsonType * > ref_stack
stack to model hierarchy of values
typename BasicJsonType::number_unsigned_t number_unsigned_t
bool number_unsigned(number_unsigned_t val)
bool number_integer(number_integer_t val)
JSON_HEDLEY_RETURNS_NON_NULL BasicJsonType * handle_value(Value &&v)
typename BasicJsonType::number_integer_t number_integer_t
json_sax_dom_parser & operator=(const json_sax_dom_parser &)=delete
bool binary(binary_t &val)
json_sax_dom_parser(json_sax_dom_parser &&)=default
BasicJsonType & root
the parsed JSON value
bool number_float(number_float_t val, const string_t &)
constexpr bool is_errored() const
typename BasicJsonType::binary_t binary_t
BasicJsonType * object_element
helper to hold the reference for the next object element
typename BasicJsonType::number_float_t number_float_t
bool start_array(std::size_t len)
JSON_HEDLEY_RETURNS_NON_NULL static JSON_HEDLEY_CONST const char * token_type_name(const token_type t) noexcept
return name of values of type token_type (only used for errors)
token_type
token types for the parser
@ value_float
an floating point number – use get_number_float() for actual value
@ begin_array
the character for array begin [
@ value_string
a string – use get_string() for actual value
@ end_array
the character for array end ]
@ uninitialized
indicating the scanner is uninitialized
@ parse_error
indicating a parse error
@ value_integer
a signed integer – use get_number_integer() for actual value
@ value_separator
the value separator ,
@ end_object
the character for object end }
@ literal_true
the true literal
@ begin_object
the character for object begin {
@ value_unsigned
an unsigned integer – use get_number_unsigned() for actual value
@ literal_null
the null literal
@ end_of_input
indicating the end of the input buffer
@ name_separator
the name separator :
@ literal_or_value
a literal or the begin of a value (only for diagnostics)
@ literal_false
the false literal
void reset() noexcept
reset token_buffer; current character is beginning of token
bool skip_bom()
skip the UTF-8 byte order mark
string_t token_buffer
buffer for variable-length tokens (numbers, strings)
int get_codepoint()
get codepoint from 4 hex characters following \u
token_type scan_string()
scan a string literal
number_integer_t value_integer
const bool ignore_comments
whether comments should be ignored (true) or signaled as errors (false)
lexer(InputAdapterType &&adapter, bool ignore_comments_=false) noexcept
char_int_type current
the current character
JSON_HEDLEY_RETURNS_NON_NULL constexpr const char * get_error_message() const noexcept
return syntax error message
std::string get_token_string() const
typename BasicJsonType::number_float_t number_float_t
constexpr number_integer_t get_number_integer() const noexcept
return integer value
typename BasicJsonType::string_t string_t
typename BasicJsonType::number_unsigned_t number_unsigned_t
bool next_byte_in_range(std::initializer_list< char_int_type > ranges)
check if the next byte(s) are inside a given range
constexpr position_t get_position() const noexcept
return position of last read token
static void strtof(float &f, const char *str, char **endptr) noexcept
const char_int_type decimal_point_char
the decimal point
number_unsigned_t value_unsigned
typename BasicJsonType::number_integer_t number_integer_t
constexpr number_unsigned_t get_number_unsigned() const noexcept
return unsigned integer value
typename char_traits< char_type >::int_type char_int_type
bool scan_comment()
scan a comment
typename lexer_base< BasicJsonType >::token_type token_type
const char * error_message
a description of occurred lexer errors
lexer & operator=(lexer &&)=default
bool next_unget
whether the next get() call should just return current
lexer(const lexer &)=delete
typename InputAdapterType::char_type char_type
InputAdapterType ia
input adapter
lexer & operator=(lexer &)=delete
token_type scan_number()
scan a number literal
number_float_t value_float
string_t & get_string()
return current string value (implicitly resets the token; useful only once)
token_type scan_literal(const char_type *literal_text, const std::size_t length, token_type return_type)
std::vector< char_type > token_string
raw input token string (for error messages)
void add(char_int_type c)
add a character to token_buffer
position_t position
the start position of the current token
void unget()
unget current character (read it again on next get)
constexpr number_float_t get_number_float() const noexcept
return floating-point value
static JSON_HEDLEY_PURE char get_decimal_point() noexcept
return the locale-dependent decimal point
exception indicating other library errors
other_error(int id_, const char *what_arg)
static other_error create(int id_, const std::string &what_arg, BasicJsonContext context)
exception indicating access out of the defined range
out_of_range(int id_, const char *what_arg)
static out_of_range create(int id_, const std::string &what_arg, BasicJsonContext context)
output_adapter(StringType &s)
output_adapter_t< CharType > oa
output_adapter(std::basic_ostream< CharType > &s)
output_adapter(std::vector< CharType, AllocatorType > &vec)
output adapter for output streams
void write_characters(const CharType *s, std::size_t length) override
output_stream_adapter(std::basic_ostream< CharType > &s) noexcept
void write_character(CharType c) override
std::basic_ostream< CharType > & stream
output adapter for basic_string
void write_character(CharType c) override
output_string_adapter(StringType &s) noexcept
void write_characters(const CharType *s, std::size_t length) override
output adapter for byte vectors
std::vector< CharType, AllocatorType > & v
output_vector_adapter(std::vector< CharType, AllocatorType > &vec) noexcept
void write_characters(const CharType *s, std::size_t length) override
void write_character(CharType c) override
exception indicating a parse error
static parse_error create(int id_, const position_t &pos, const std::string &what_arg, BasicJsonContext context)
create a parse error exception
static std::string position_string(const position_t &pos)
static parse_error create(int id_, std::size_t byte_, const std::string &what_arg, BasicJsonContext context)
const std::size_t byte
byte index of the parse error
parse_error(int id_, std::size_t byte_, const char *what_arg)
std::string exception_message(const token_type expected, const std::string &context)
const bool allow_exceptions
whether to throw exceptions in case of errors
bool sax_parse_internal(SAX *sax)
parser(InputAdapterType &&adapter, const parser_callback_t< BasicJsonType > cb=nullptr, const bool allow_exceptions_=true, const bool skip_comments=false)
a parser reading from an input adapter
typename lexer_t::token_type token_type
void parse(const bool strict, BasicJsonType &result)
public parser interface
token_type last_token
the type of the last read token
typename BasicJsonType::number_unsigned_t number_unsigned_t
typename BasicJsonType::number_integer_t number_integer_t
typename BasicJsonType::string_t string_t
lexer< BasicJsonType, InputAdapterType > lexer_t
bool accept(const bool strict=true)
public accept interface
typename BasicJsonType::number_float_t number_float_t
const parser_callback_t< BasicJsonType > callback
callback function
bool sax_parse(SAX *sax, const bool strict=true)
token_type get_token()
get next token from lexer
primitive_iterator_t & operator++() noexcept
primitive_iterator_t & operator-=(difference_type n) noexcept
static constexpr difference_type end_value
constexpr bool is_begin() const noexcept
return whether the iterator can be dereferenced
primitive_iterator_t & operator--() noexcept
static constexpr difference_type begin_value
void set_end() noexcept
set iterator to a defined past the end
friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
constexpr bool is_end() const noexcept
return whether the iterator is at end
primitive_iterator_t operator++(int) &noexcept
primitive_iterator_t & operator+=(difference_type n) noexcept
friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
constexpr difference_type get_value() const noexcept
friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
primitive_iterator_t operator+(difference_type n) noexcept
void set_begin() noexcept
set iterator to a defined beginning
primitive_iterator_t operator--(int) &noexcept
std::ptrdiff_t difference_type
typename BasicJsonType::binary_t::value_type binary_char_t
std::array< char, 512 > string_buffer
string buffer
typename BasicJsonType::number_unsigned_t number_unsigned_t
std::size_t bytes_after_last_accept
serializer(output_adapter_t< char > s, const char ichar, error_handler_t error_handler_=error_handler_t::strict)
JSON_PRIVATE_UNLESS_TESTED const bool ensure_ascii
std::size_t undumped_chars
const char thousands_sep
the locale's thousand separator character
static constexpr std::uint8_t UTF8_REJECT
const char decimal_point
the locale's decimal point character
serializer & operator=(const serializer &)=delete
const error_handler_t error_handler
error_handler how to react on decoding errors
string_t indent_string
the indentation string
const std::lconv * loc
the locale
typename BasicJsonType::number_integer_t number_integer_t
typename BasicJsonType::number_float_t number_float_t
serializer & operator=(serializer &&)=delete
typename BasicJsonType::string_t string_t
std::array< char, 64 > number_buffer
a (hopefully) large enough character buffer
const char indent_char
the indentation character
static constexpr std::uint8_t UTF8_ACCEPT
void dump(const BasicJsonType &val, const bool pretty_print, const bool ensure_ascii, const unsigned int indent_step, const unsigned int current_indent=0)
internal implementation of the serialization function
serializer(const serializer &)=delete
serializer(serializer &&)=delete
exception indicating executing a member function with a wrong type
static type_error create(int id_, const std::string &what_arg, BasicJsonContext context)
type_error(int id_, const char *what_arg)
JSON Pointer defines a string syntax for identifying a specific value within a JSON document.
BasicJsonType & get_checked(BasicJsonType *ptr) const
json_pointer< string_t > convert() const &
friend json_pointer operator/(const json_pointer &lhs, string_t token)
create a new JSON pointer by appending the unescaped token at the end of the JSON pointer
static BasicJsonType::size_type array_index(const string_t &s)
typename string_t_helper< RefStringType >::type string_t
friend json_pointer operator/(const json_pointer &lhs, std::size_t array_idx)
create a new JSON pointer by appending the array-index-token at the end of the JSON pointer
json_pointer(const string_t &s="")
create JSON pointer
static std::vector< string_t > split(const string_t &reference_string)
split the string input to reference tokens
bool empty() const noexcept
return whether pointer points to the root document
BasicJsonType & get_and_create(BasicJsonType &j) const
create and return a reference to the pointed to value
void pop_back()
remove last reference token
string_t to_string() const
return a string representation of the JSON pointer
json_pointer & operator/=(std::size_t array_idx)
append an array index at the end of this JSON pointer
void push_back(string_t &&token)
append an unescaped token at the end of the reference pointer
json_pointer< string_t > convert() &&
static void flatten(const string_t &reference_string, const BasicJsonType &value, BasicJsonType &result)
json_pointer & operator/=(const json_pointer &ptr)
append another JSON pointer at the end of this JSON pointer
friend json_pointer operator/(const json_pointer &lhs, const json_pointer &rhs)
create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer
BasicJsonType & get_unchecked(BasicJsonType *ptr) const
return a reference to the pointed to value
json_pointer parent_pointer() const
returns the parent of this JSON pointer
static BasicJsonType unflatten(const BasicJsonType &value)
json_pointer & operator/=(string_t token)
append an unescaped reference token at the end of this JSON pointer
friend class json_pointer
const string_t & back() const
return last reference token
friend std::ostream & operator<<(std::ostream &o, const json_pointer &ptr)
write string representation of the JSON pointer to stream
const BasicJsonType & get_unchecked(const BasicJsonType *ptr) const
return a const reference to the pointed to value
void push_back(const string_t &token)
append an unescaped token at the end of the reference pointer
const BasicJsonType & get_checked(const BasicJsonType *ptr) const
bool contains(const BasicJsonType *ptr) const
decltype( get< N >(std::declval< ::nlohmann::detail::iteration_proxy_value< IteratorType > >())) type
#define NLOHMANN_BASIC_JSON_TPL_DECLARATION
#define JSON_HEDLEY_CONST
#define JSON_HEDLEY_DIAGNOSTIC_PUSH
#define JSON_INLINE_VARIABLE
#define JSON_HEDLEY_WARN_UNUSED_RESULT
#define JSON_PRIVATE_UNLESS_TESTED
#define NLOHMANN_JSON_VERSION_PATCH
#define JSON_HEDLEY_LIKELY(expr)
bool operator==(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
#define JSON_HEDLEY_NON_NULL(...)
#define JSON_INTERNAL_CATCH(exception)
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
#define JSON_HEDLEY_RETURNS_NON_NULL
#define JSON_CATCH(exception)
#define JSON_THROW(exception)
#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
#define NLOHMANN_JSON_VERSION_MAJOR
bool operator<(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
#define NLOHMANN_BASIC_JSON_TPL
#define JSON_HEDLEY_UNLIKELY(expr)
#define JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_
#define NLOHMANN_JSON_NAMESPACE_END
#define JSON_NO_UNIQUE_ADDRESS
basic_json< nlohmann::ordered_map > ordered_json
specialization that maintains the insertion order of object keys
#define NLOHMANN_JSON_VERSION_MINOR
#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name)
bool operator!=(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
#define NLOHMANN_JSON_NAMESPACE_BEGIN
#define JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_
basic_json<> json
default specialization
#define JSON_HEDLEY_DIAGNOSTIC_POP
#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement)
#define JSON_IMPLEMENT_OPERATOR(op, null_result, unordered_result, default_result)
std::ostream & operator<<(std::ostream &s, const Guid &guid)
implements the Grisu2 algorithm for binary to decimal floating-point conversion.
int find_largest_pow10(const std::uint32_t n, std::uint32_t &pow10)
cached_power get_cached_power_for_binary_exponent(int e)
Target reinterpret_bits(const Source source)
boundaries compute_boundaries(FloatType value)
void grisu2_round(char *buf, int len, std::uint64_t dist, std::uint64_t delta, std::uint64_t rest, std::uint64_t ten_k)
void grisu2(char *buf, int &len, int &decimal_exponent, diyfp m_minus, diyfp v, diyfp m_plus)
void grisu2_digit_gen(char *buffer, int &length, int &decimal_exponent, diyfp M_minus, diyfp w, diyfp M_plus)
JSON_HEDLEY_RETURNS_NON_NULL char * append_exponent(char *buf, int e)
appends a decimal representation of e to buf
JSON_HEDLEY_RETURNS_NON_NULL char * format_buffer(char *buf, int len, int decimal_exponent, int min_exp, int max_exp)
prettify v = buf * 10^decimal_exponent
constexpr bool is_transparent()
constexpr bool is_c_string()
detail namespace with internal helper functions
std::function< bool(int, parse_event_t, BasicJsonType &)> parser_callback_t
make_integer_sequence< size_t, N > make_index_sequence
decltype(std::declval< T & >().boolean(std::declval< bool >())) boolean_function_t
input_format_t
the supported input formats
typename detector< nonesuch, void, Op, Args... >::type detected_t
void to_json_tuple_impl(BasicJsonType &j, const Tuple &t, index_sequence< Idx... >)
static void unescape(StringType &s)
string unescaping as described in RFC 6901 (Sect. 4)
decltype(T::to_json(std::declval< Args >()...)) to_json_function
detector< Default, void, Op, Args... > detected_or
decltype(std::declval< T & >().start_object(std::declval< std::size_t >())) start_object_function_t
is_detected< string_can_append_data, StringType, Arg > detect_string_can_append_data
decltype(std::declval< T & >().end_object()) end_object_function_t
OutStringType concat(Args &&... args)
decltype(std::declval< T & >().string(std::declval< String & >())) string_function_t
typename T::value_type value_type_t
decltype(std::declval< T & >().binary(std::declval< Binary & >())) binary_function_t
constexpr std::array< T, sizeof...(Args)> make_array(Args &&... args)
decltype(std::declval< T & >().number_float( std::declval< Float >(), std::declval< const String & >())) number_float_function_t
JSON_HEDLEY_RETURNS_NON_NULL char * to_chars(char *first, const char *last, FloatType value)
generates a decimal representation of the floating-point number value in [first, last).
std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact
is_detected< string_can_append, StringType, Arg > detect_string_can_append
typename std::enable_if< B, T >::type enable_if_t
@ value
the parser finished reading a JSON value
@ key
the parser read a key of a value in an object
@ array_end
the parser read ] and finished processing a JSON array
@ array_start
the parser read [ and started to process a JSON array
@ object_start
the parser read { and started to process a JSON object
@ object_end
the parser read } and finished processing a JSON object
typename detector< nonesuch, void, Op, Args... >::value_t is_detected
typename T::pointer pointer_t
std::pair< A1, A2 > from_json_tuple_impl(BasicJsonType &&j, identity_tag< std::pair< A1, A2 > >, priority_tag< 0 >)
void from_json_array_impl(const BasicJsonType &j, typename BasicJsonType::array_t &arr, priority_tag< 3 >)
typename utility_internal::Gen< T, N >::type make_integer_sequence
conjunction< std::is_integral< Types >... > all_integral
std::shared_ptr< output_adapter_protocol< CharType > > output_adapter_t
a type to simplify interfaces
typename detected_or< Default, Op, Args... >::type detected_or_t
decltype(std::declval< T & >().null()) null_function_t
T conditional_static_cast(U value)
typename T::difference_type difference_type_t
conjunction< std::is_unsigned< Types >... > all_unsigned
constexpr T static_const< T >::value
void replace_substring(StringType &s, const StringType &f, const StringType &t)
replace all occurrences of a substring by another string
is_detected< string_can_append_iter, StringType, Arg > detect_string_can_append_iter
auto get(const nlohmann::detail::iteration_proxy_value< IteratorType > &i) -> decltype(i.key())
typename actual_object_comparator< BasicJsonType >::type actual_object_comparator_t
decltype(std::declval< ObjectType & >().erase(std::declval< KeyType >())) detect_erase_with_key_type
decltype(input_adapter(std::declval< const char * >(), std::declval< const char * >())) contiguous_bytes_input_adapter
cbor_tag_handler_t
how to treat CBOR tags
@ store
store tags as binary type
@ error
throw a parse_error exception in case of a tag
value_type_t< iterator_traits< iterator_t< T > > > range_value_t
make_index_sequence< sizeof...(Ts)> index_sequence_for
void concat_into(OutStringType &)
constexpr bool value_in_range_of(T val)
value_t
the JSON type enumeration
@ number_integer
number value (signed integer)
@ discarded
discarded by the parser callback function
@ binary
binary array (ordered collection of bytes)
@ object
object (unordered set of name/value pairs)
@ number_float
number value (floating-point)
@ number_unsigned
number value (unsigned integer)
@ array
array (ordered collection of values)
decltype(T::from_json(std::declval< Args >()...)) from_json_function
conjunction< std::is_signed< Types >... > all_signed
std::array< T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJsonType &&j, identity_tag< std::array< T, sizeof...(Idx)> >, index_sequence< Idx... >)
static bool little_endianness(int num=1) noexcept
determine system byte order
std::size_t hash(const BasicJsonType &j)
hash a JSON value
decltype(std::declval< StringType & >().append(std::declval< Arg && >())) string_can_append
typename make_void< Ts... >::type void_t
std::size_t combine(std::size_t seed, std::size_t h) noexcept
decltype(std::declval< T & >().parse_error( std::declval< std::size_t >(), std::declval< const std::string & >(), std::declval< const Exception & >())) parse_error_function_t
bool operator<(const value_t lhs, const value_t rhs) noexcept
comparison operator for JSON types
iterator_input_adapter_factory< IteratorType >::adapter_type input_adapter(IteratorType first, IteratorType last)
enable_if_t< is_range< R >::value, result_of_begin< decltype(std::declval< R & >())> > iterator_t
typename T::iterator_category iterator_category_t
decltype(std::declval< T & >().key(std::declval< String & >())) key_function_t
is_c_string< uncvref_t< T > > is_c_string_uncvref
error_handler_t
how to treat decoding errors
@ strict
throw a type_error exception in case of invalid UTF-8
@ ignore
ignore invalid UTF-8 sequences
@ replace
replace invalid UTF-8 sequences with U+FFFD
std::size_t concat_length()
std::integral_constant< bool, Value > bool_constant
std::is_convertible< detected_t< Op, Args... >, To > is_detected_convertible
typename std::remove_cv< typename std::remove_reference< T >::type >::type uncvref_t
void from_json(const BasicJsonType &j, typename std::nullptr_t &n)
typename T::key_compare detect_key_compare
typename std::conditional< std::is_same< T, void >::value, json_default_base, T >::type json_base_class
void to_json(BasicJsonType &j, T b) noexcept
void get_arithmetic_value(const BasicJsonType &j, ArithmeticType &val)
integer_sequence< size_t, Ints... > index_sequence
is_specialization_of<::nlohmann::json_pointer, uncvref_t< T > > is_json_pointer
decltype(std::declval< StringType & >().append(std::declval< const Arg & >().begin(), std::declval< const Arg & >().end())) string_can_append_iter
decltype(std::declval< T & >().end_array()) end_array_function_t
std::tuple< Args... > from_json_tuple_impl_base(BasicJsonType &&j, index_sequence< Idx... >)
typename std::conditional< is_usable_as_key_type< typename BasicJsonType::object_comparator_t, typename BasicJsonType::object_t::key_type, KeyTypeCVRef, RequireTransparentComparator, ExcludeObjectKeyType >::value &&!is_json_iterator_of< BasicJsonType, KeyType >::value, std::true_type, std::false_type >::type is_usable_as_basic_json_key_type
decltype(std::declval< T & >().number_integer(std::declval< Integer >())) number_integer_function_t
typename std::conditional< is_detected< detect_erase_with_key_type, typename BasicJsonType::object_t, KeyType >::value, std::true_type, std::false_type >::type has_erase_with_key_type
decltype(std::declval< StringType & >().append(std::declval< const Arg & >().data(), std::declval< const Arg & >().size())) string_can_append_data
typename T::key_type key_type_t
typename T::reference reference_t
typename T::is_transparent detect_is_transparent
is_detected< string_can_append_op, StringType, Arg > detect_string_can_append_op
typename T::mapped_type mapped_type_t
decltype(std::declval< T & >().number_unsigned(std::declval< Unsigned >())) number_unsigned_function_t
StringType escape(StringType s)
string escaping as described in RFC 6901 (Sect. 4)
std::integral_constant< bool, all_signed< Types... >::value||all_unsigned< Types... >::value > same_sign
typename std::conditional< is_comparable< Comparator, ObjectKeyType, KeyTypeCVRef >::value &&!(ExcludeObjectKeyType &&std::is_same< KeyType, ObjectKeyType >::value) &&(!RequireTransparentComparator||is_detected< detect_is_transparent, Comparator >::value) &&!is_json_pointer< KeyType >::value, std::true_type, std::false_type >::type is_usable_as_key_type
std::integral_constant< bool,(std::is_signed< OfType >::value &&(sizeof(T)< sizeof(OfType)))||(same_sign< OfType, T >::value &&sizeof(OfType)==sizeof(T)) > never_out_of_range
void int_to_string(string_type &target, std::size_t value)
decltype(std::declval< T & >().start_array(std::declval< std::size_t >())) start_array_function_t
decltype(std::declval< T >().template get< U >()) get_template_function
decltype(std::declval< StringType & >()+=std::declval< Arg && >()) string_can_append_op
DYN_FUNC bool operator<=(const priority_queue< T, Container, Compare > &a, const priority_queue< T, Container, Compare > &b)
DYN_FUNC bool operator>(const priority_queue< T, Container, Compare > &a, const priority_queue< T, Container, Compare > &b)
DYN_FUNC bool operator>=(const priority_queue< T, Container, Compare > &a, const priority_queue< T, Container, Compare > &b)
void swap(Wt::Guid &lhs, Wt::Guid &rhs) noexcept
namespace for Niels Lohmann
static auto to_json(BasicJsonType &j, TargetType &&val) noexcept(noexcept(::nlohmann::to_json(j, std::forward< TargetType >(val)))) -> decltype(::nlohmann::to_json(j, std::forward< TargetType >(val)), void())
convert any value type to a JSON value
static auto from_json(BasicJsonType &&j) noexcept(noexcept(::nlohmann::from_json(std::forward< BasicJsonType >(j), detail::identity_tag< TargetType > {}))) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), detail::identity_tag< TargetType > {}))
convert a JSON value to any value type
static auto from_json(BasicJsonType &&j, TargetType &val) noexcept(noexcept(::nlohmann::from_json(std::forward< BasicJsonType >(j), val))) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), val), void())
convert a JSON value to any value type
typename BasicJsonType::object_t object_t
typename BasicJsonType::default_object_comparator_t object_comparator_t
typename std::conditional< has_key_compare< object_t >::value, typename object_t::key_compare, object_comparator_t >::type type
static constexpr int_type eof() noexcept
static char_type to_char_type(int_type i) noexcept
static int_type to_int_type(char_type c) noexcept
static char_type to_char_type(int_type i) noexcept
static constexpr int_type eof() noexcept
static int_type to_int_type(char_type c) noexcept
static diyfp mul(const diyfp &x, const diyfp &y) noexcept
returns x * y
static diyfp normalize_to(const diyfp &x, const int target_exponent) noexcept
normalize x such that the result has the exponent E
static diyfp normalize(diyfp x) noexcept
normalize x such that the significand is >= 2^(q-1)
static diyfp sub(const diyfp &x, const diyfp &y) noexcept
returns x - y
constexpr diyfp(std::uint64_t f_, int e_) noexcept
static constexpr int kPrecision
static void construct(BasicJsonType &j, const std::vector< bool > &arr)
static void construct(BasicJsonType &j, typename BasicJsonType::array_t &&arr)
static void construct(BasicJsonType &j, const typename BasicJsonType::array_t &arr)
static void construct(BasicJsonType &j, const CompatibleArrayType &arr)
static void construct(BasicJsonType &j, const std::valarray< T > &arr)
static void construct(BasicJsonType &j, const typename BasicJsonType::binary_t &b)
static void construct(BasicJsonType &j, typename BasicJsonType::binary_t &&b)
static void construct(BasicJsonType &j, typename BasicJsonType::boolean_t b) noexcept
static void construct(BasicJsonType &j, typename BasicJsonType::number_float_t val) noexcept
static void construct(BasicJsonType &j, typename BasicJsonType::number_integer_t val) noexcept
static void construct(BasicJsonType &j, typename BasicJsonType::number_unsigned_t val) noexcept
static void construct(BasicJsonType &j, const typename BasicJsonType::object_t &obj)
static void construct(BasicJsonType &j, const CompatibleObjectType &obj)
static void construct(BasicJsonType &j, typename BasicJsonType::object_t &&obj)
static void construct(BasicJsonType &j, typename BasicJsonType::string_t &&s)
static void construct(BasicJsonType &j, const CompatibleStringType &str)
static void construct(BasicJsonType &j, const typename BasicJsonType::string_t &s)
auto operator()(const BasicJsonType &j, T &&val) const noexcept(noexcept(from_json(j, std::forward< T >(val)))) -> decltype(from_json(j, std::forward< T >(val)))
typename BasicJsonType::template json_serializer< T, void > serializer
static constexpr bool value
typename BasicJsonType::template json_serializer< T, void > serializer
static constexpr bool value
static constexpr bool value
typename BasicJsonType::template json_serializer< T, void > serializer
static constexpr std::size_t size() noexcept
BasicJsonType::array_t::iterator array_iterator
iterator for JSON arrays
primitive_iterator_t primitive_iterator
generic iterator for all other types
BasicJsonType::object_t::iterator object_iterator
iterator for JSON objects
static constexpr bool value
static constexpr auto value
std::numeric_limits< RealIntegerType > RealLimits
std::numeric_limits< CompatibleNumberIntegerType > CompatibleLimits
typename BasicJsonType::object_t object_t
static constexpr bool value
static constexpr auto value
static constexpr bool value
detail::is_constructible_array_type_impl< BasicJsonType, ConstructibleArrayType, enable_if_t< !std::is_same< ConstructibleArrayType, typename BasicJsonType::value_type >::value &&!is_compatible_string_type< BasicJsonType, ConstructibleArrayType >::value &&is_default_constructible< ConstructibleArrayType >::value &&(std::is_move_assignable< ConstructibleArrayType >::value||std::is_copy_assignable< ConstructibleArrayType >::value) &&is_detected< iterator_t, ConstructibleArrayType >::value &&is_iterator_traits< iterator_traits< detected_t< iterator_t, ConstructibleArrayType > > >::value &&is_detected< range_value_t, ConstructibleArrayType >::value &&!std::is_same< ConstructibleArrayType, detected_t< range_value_t, ConstructibleArrayType > >::value &&is_complete_type< detected_t< range_value_t, ConstructibleArrayType > >::value > >::value_type range_value_t< ConstructibleArrayType > value_type
detail::is_constructible_array_type_impl< BasicJsonType, ConstructibleArrayType, enable_if_t< !std::is_same< ConstructibleArrayType, typename BasicJsonType::value_type >::value &&!is_compatible_string_type< BasicJsonType, ConstructibleArrayType >::value &&is_default_constructible< ConstructibleArrayType >::value &&(std::is_move_assignable< ConstructibleArrayType >::value||std::is_copy_assignable< ConstructibleArrayType >::value) &&is_detected< iterator_t, ConstructibleArrayType >::value &&is_iterator_traits< iterator_traits< detected_t< iterator_t, ConstructibleArrayType > > >::value &&is_detected< range_value_t, ConstructibleArrayType >::value &&!std::is_same< ConstructibleArrayType, detected_t< range_value_t, ConstructibleArrayType > >::value &&is_complete_type< detected_t< range_value_t, ConstructibleArrayType > >::value > >::value static constexpr bool value
typename BasicJsonType::object_t object_t
static constexpr bool value
ConstructibleStringType laundered_type
static constexpr auto value
static constexpr bool value
typename std::iterator_traits< T >::value_type value_type
static constexpr auto value
iterator_traits< T > traits
static one test(decltype(&C::capacity))
detected_t< result_of_end, t_ref > sentinel
detected_t< result_of_begin, t_ref > iterator
typename std::add_lvalue_reference< T >::type t_ref
static constexpr bool value
static constexpr auto is_iterator_begin
typename BasicJsonType::number_integer_t number_integer_t
typename BasicJsonType::number_unsigned_t number_unsigned_t
typename BasicJsonType::binary_t binary_t
typename BasicJsonType::exception exception_t
typename BasicJsonType::string_t string_t
typename BasicJsonType::number_float_t number_float_t
typename BasicJsonType::binary_t binary_t
typename BasicJsonType::exception exception_t
typename BasicJsonType::number_float_t number_float_t
typename BasicJsonType::string_t string_t
typename BasicJsonType::number_unsigned_t number_unsigned_t
static constexpr bool value
typename BasicJsonType::number_integer_t number_integer_t
ptrdiff_t difference_type
std::random_access_iterator_tag iterator_category
typename It::iterator_category iterator_category
typename It::difference_type difference_type
typename It::value_type value_type
typename It::reference reference
typename It::pointer pointer
Default base class of the basic_json class.
nonesuch(nonesuch const &&)=delete
void operator=(nonesuch &&)=delete
void operator=(nonesuch const &)=delete
nonesuch(nonesuch const &)=delete
abstract output adapter interface
output_adapter_protocol(const output_adapter_protocol &)=default
virtual ~output_adapter_protocol()=default
virtual void write_character(CharType c)=0
output_adapter_protocol(output_adapter_protocol &&) noexcept=default
output_adapter_protocol()=default
virtual void write_characters(const CharType *s, std::size_t length)=0
struct to capture the start position of the current token
std::size_t chars_read_current_line
the number of characters read in the current line
std::size_t lines_read
the number of lines read
std::size_t chars_read_total
the total number of characters read
static JSON_INLINE_VARIABLE constexpr T value
auto operator()(BasicJsonType &j, T &&val) const noexcept(noexcept(to_json(j, std::forward< T >(val)))) -> decltype(to_json(j, std::forward< T >(val)), void())
integer_sequence< T, Ints...,(Ints+SeqSize)... > type
integer_sequence< T, Ints...,(Ints+SeqSize)..., 2 *SeqSize > type
integer_sequence< T > type
typename Extend< typename Gen< T, N/2 >::type, N/2, N % 2 >::type type
static constexpr bool test(T val)
static constexpr bool test(T)
static constexpr bool test(T val)
static constexpr bool test(T val)
static constexpr bool test(T val)
static constexpr bool test(T val)
virtual bool binary(binary_t &val)=0
a binary value was read
virtual bool number_float(number_float_t val, const string_t &s)=0
a floating-point number was read
virtual bool number_unsigned(number_unsigned_t val)=0
an unsigned integer number was read
virtual bool key(string_t &val)=0
an object key was read
virtual bool string(string_t &val)=0
a string value was read
virtual bool number_integer(number_integer_t val)=0
an integer number was read
virtual bool start_object(std::size_t elements)=0
the beginning of an object was read
typename BasicJsonType::number_integer_t number_integer_t
typename BasicJsonType::string_t string_t
virtual bool end_array()=0
the end of an array was read
json_sax(const json_sax &)=default
virtual bool boolean(bool val)=0
a boolean value was read
virtual bool end_object()=0
the end of an object was read
typename BasicJsonType::number_float_t number_float_t
virtual bool null()=0
a null value was read
typename BasicJsonType::number_unsigned_t number_unsigned_t
json_sax(json_sax &&) noexcept=default
typename BasicJsonType::binary_t binary_t
virtual bool parse_error(std::size_t position, const std::string &last_token, const detail::exception &ex)=0
a parse error occurred
virtual bool start_array(std::size_t elements)=0
the beginning of an array was read
a minimal map-like container that preserves insertion order
typename std::enable_if< std::is_convertible< typename std::iterator_traits< InputIt >::iterator_category, std::input_iterator_tag >::value >::type require_input_iter
std::vector< std::pair< const Key, T >, Allocator > Container
std::pair< iterator, bool > insert(value_type &&value)
typename Container::value_type value_type
std::equal_to< Key > key_compare
iterator erase(iterator pos)
ordered_map(const Allocator &alloc) noexcept(noexcept(Container(alloc)))
T & operator[](KeyType &&key)
typename Container::iterator iterator
const T & at(KeyType &&key) const
const T & operator[](KeyType &&key) const
iterator find(const key_type &key)
iterator erase(iterator first, iterator last)
const T & at(const key_type &key) const
const_iterator find(const key_type &key) const
T & operator[](const key_type &key)
size_type erase(KeyType &&key)
typename Container::size_type size_type
ordered_map() noexcept(noexcept(Container()))
void insert(InputIt first, InputIt last)
size_type count(const key_type &key) const
std::pair< iterator, bool > emplace(KeyType &&key, T &&t)
size_type erase(const key_type &key)
ordered_map(std::initializer_list< value_type > init, const Allocator &alloc=Allocator())
std::pair< iterator, bool > insert(const value_type &value)
size_type count(KeyType &&key) const
ordered_map(It first, It last, const Allocator &alloc=Allocator())
const T & operator[](const key_type &key) const
JSON_NO_UNIQUE_ADDRESS key_compare m_compare
iterator find(KeyType &&key)
T & at(const key_type &key)
typename Container::const_iterator const_iterator
std::pair< iterator, bool > emplace(const key_type &key, T &&t)
std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL &j) const
bool operator()(::nlohmann::detail::value_t lhs, ::nlohmann::detail::value_t rhs) const noexcept
compare two value_t enum values