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
769 #if defined(__POCC__)
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
2402 #ifdef __has_include
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
2518 #define JSON_TRY try
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>
3006 static void unescape(StringType& s)
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
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>
3140 namespace utility_internal
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_
3395 template<
typename T =
void,
typename SFINAE =
void>
3400 template<
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>
3416 template<
typename RefStringType>
3427 template<
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>;
3547 const BasicJsonType&, T&>::value;
3552 template<
typename BasicJsonType,
typename T,
typename =
void>
3555 template<
typename BasicJsonType,
typename T>
3558 using serializer =
typename BasicJsonType::template json_serializer<T, void>;
3562 const BasicJsonType&>::value;
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;
3737 static constexpr
auto is_iterator_begin =
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,
3768 is_detected<key_type_t, CompatibleObjectType>::value >>
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,
3792 is_detected<key_type_t, ConstructibleObjectType>::value >>
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,
3849 is_iterator_traits<iterator_traits<detected_t<iterator_t, CompatibleArrayType>>>::value &&
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) &&
3882 is_detected<iterator_t, ConstructibleArrayType>::value&&
3883 is_iterator_traits<iterator_traits<detected_t<iterator_t, ConstructibleArrayType>>>::value&&
3884 is_detected<range_value_t, 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,
3996 ObjectKeyType>::value)
3997 && (!RequireTransparentComparator
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));
4046 enum {
value =
sizeof(test<T>(
nullptr)) ==
sizeof(
char) };
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,
4296 inline void concat_into(OutStringType& out, Arg&& arg, Args && ... rest);
4298 template <
typename OutStringType,
typename Arg,
typename... Args,
4302 inline void concat_into(OutStringType& out,
const Arg& arg, Args && ... rest);
4304 template <
typename OutStringType,
typename Arg,
typename... Args,
4309 inline void concat_into(OutStringType& out,
const Arg& arg, Args && ... rest);
4311 template<
typename OutStringType,
typename Arg,
typename... Args,
4313 inline void concat_into(OutStringType& out, Arg&& arg, Args && ... rest)
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
4330 && !detect_string_can_append_op<OutStringType, Arg>::value
4331 && detect_string_can_append_iter<OutStringType, Arg>::value,
int > >
4332 inline void concat_into(OutStringType& out,
const Arg& arg, Args&& ... rest)
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_)
4398 template<
typename BasicJsonType>
4401 #if JSON_DIAGNOSTICS
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)
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)
4496 return { id_, byte_, w.c_str() };
4511 parse_error(
int id_, std::size_t byte_,
const char* what_arg)
4514 static std::string position_string(
const position_t& pos)
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>()),
4845 j.template get<typename ConstructibleArrayType::value_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)
4857 return i.template get<typename ConstructibleArrayType::value_type>();
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)
4878 return i.template get<typename ConstructibleArrayType::value_type>();
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)
4893 j.template get<typename ConstructibleArrayType::value_type>(),
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>
5044 return from_json_tuple_impl(std::forward<BasicJsonType>(j), std::forward<TupleRelated>(t), priority_tag<3> {});
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)
5063 m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());
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)
5083 m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());
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
5138 #include <algorithm>
5142 #include <type_traits>
5179 template<
typename string_type>
5194 using string_type =
typename std::remove_cv< typename std::remove_reference<decltype(std::declval<IteratorType>().
key()) >::type >::type;
5198 IteratorType anchor{};
5200 std::size_t array_index = 0;
5202 mutable std::size_t array_index_last = 0;
5211 noexcept(
std::is_nothrow_move_constructible<IteratorType>::
value
5213 : anchor(
std::move(it))
5214 , array_index(array_index_)
5221 noexcept(
std::is_nothrow_move_constructible<IteratorType>::
value
5224 noexcept(
std::is_nothrow_move_assignable<IteratorType>::
value
5254 return anchor == o.anchor;
5260 return anchor != o.anchor;
5268 switch (anchor.m_object->type())
5273 if (array_index != array_index_last)
5276 array_index_last = array_index;
5278 return array_index_str;
5283 return anchor.key();
5300 typename IteratorType::reference
value()
const
5302 return anchor.value();
5311 typename IteratorType::pointer container =
nullptr;
5318 : container(&cont) {}
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
5390 template <
typename IteratorType>
5391 inline 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,
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,
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,
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>
5643 inline void to_json(BasicJsonType& j, T b) noexcept
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
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;
5705 template<
typename BasicJsonType>
5706 inline void to_json(BasicJsonType& j,
const std::vector<bool>& e)
5711 template <
typename BasicJsonType,
typename CompatibleArrayType,
5712 enable_if_t < is_compatible_array_type<BasicJsonType,
5713 CompatibleArrayType>::value &&
5714 !is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value &&
5716 !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value &&
5717 !is_basic_json<CompatibleArrayType>::value,
5719 inline void to_json(BasicJsonType& j,
const CompatibleArrayType& arr)
5724 template<
typename BasicJsonType>
5725 inline void to_json(BasicJsonType& j,
const typename BasicJsonType::binary_t& bin)
5730 template<
typename BasicJsonType,
typename T,
5731 enable_if_t<std::is_convertible<T, BasicJsonType>::value,
int> = 0>
5732 inline void to_json(BasicJsonType& j,
const std::valarray<T>& arr)
5737 template<
typename BasicJsonType>
5738 inline void to_json(BasicJsonType& j,
typename BasicJsonType::array_t&& arr)
5743 template <
typename BasicJsonType,
typename CompatibleObjectType,
5744 enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value && !is_basic_json<CompatibleObjectType>::value,
int > = 0 >
5745 inline void to_json(BasicJsonType& j,
const CompatibleObjectType& obj)
5750 template<
typename BasicJsonType>
5751 inline void to_json(BasicJsonType& j,
typename BasicJsonType::object_t&& obj)
5757 typename BasicJsonType,
typename T, std::size_t N,
5758 enable_if_t < !std::is_constructible<
typename BasicJsonType::string_t,
5759 const T(&)[N]>::value,
5761 inline void to_json(BasicJsonType& j,
const T(&arr)[N])
5766 template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value,
int > = 0 >
5767 inline void to_json(BasicJsonType& j,
const std::pair<T1, T2>& p)
5769 j = { p.first, p.second };
5773 template<
typename BasicJsonType,
typename T,
5774 enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value,
int> = 0>
5777 j = { {b.key(), b.value()} };
5780 template<
typename BasicJsonType,
typename Tuple, std::size_t... Idx>
5783 j = { std::get<Idx>(t)... };
5786 template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value,
int > = 0>
5787 inline void to_json(BasicJsonType& j,
const T& t)
5792 #if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
5793 template<
typename BasicJsonType>
5794 inline void to_json(BasicJsonType& j,
const std_fs::path& p)
5802 template<
typename BasicJsonType,
typename T>
5803 auto operator()(BasicJsonType& j, T&& val)
const noexcept(noexcept(
to_json(j, std::forward<T>(val))))
5804 -> decltype(
to_json(j, std::forward<T>(val)),
void())
5806 return to_json(j, std::forward<T>(val));
5811 #ifndef JSON_HAS_CPP_17
5820 #ifndef JSON_HAS_CPP_17
5832 template<
typename ValueType,
typename>
5837 template<
typename BasicJsonType,
typename TargetType = ValueType>
5838 static auto from_json(BasicJsonType&& j, TargetType& val) noexcept(
5847 template<
typename BasicJsonType,
typename TargetType = ValueType>
5857 template<
typename BasicJsonType,
typename TargetType = ValueType>
5858 static auto to_json(BasicJsonType& j, TargetType&& val) noexcept(
5890 template<
typename BinaryType>
5915 , m_subtype(subtype_)
5916 , m_has_subtype(true)
5922 , m_subtype(subtype_)
5923 , m_has_subtype(true)
5928 return std::tie(
static_cast<const BinaryType&
>(*
this), m_subtype, m_has_subtype) ==
5929 std::tie(
static_cast<const BinaryType&
>(rhs), rhs.m_subtype, rhs.m_has_subtype);
5934 return !(rhs == *
this);
5941 m_subtype = subtype_;
5942 m_has_subtype =
true;
5949 return m_has_subtype ? m_subtype :
static_cast<subtype_type>(-1);
5956 return m_has_subtype;
5964 m_has_subtype =
false;
5969 bool m_has_subtype =
false;
5993 #include <functional>
6005 inline std::size_t
combine(std::size_t seed, std::size_t h) noexcept
6007 seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U);
6022 template<
typename BasicJsonType>
6023 std::size_t
hash(
const BasicJsonType& j)
6025 using string_t =
typename BasicJsonType::string_t;
6026 using number_integer_t =
typename BasicJsonType::number_integer_t;
6027 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
6028 using number_float_t =
typename BasicJsonType::number_float_t;
6030 const auto type =
static_cast<std::size_t
>(j.type());
6033 case BasicJsonType::value_t::null:
6034 case BasicJsonType::value_t::discarded:
6039 case BasicJsonType::value_t::object:
6041 auto seed =
combine(type, j.size());
6042 for (
const auto& element : j.items())
6044 const auto h = std::hash<string_t>{}(element.key());
6051 case BasicJsonType::value_t::array:
6053 auto seed =
combine(type, j.size());
6054 for (
const auto& element : j)
6061 case BasicJsonType::value_t::string:
6063 const auto h = std::hash<string_t>{}(j.template get_ref<const string_t&>());
6067 case BasicJsonType::value_t::boolean:
6069 const auto h = std::hash<bool>{}(j.template get<bool>());
6073 case BasicJsonType::value_t::number_integer:
6075 const auto h = std::hash<number_integer_t>{}(j.template get<number_integer_t>());
6079 case BasicJsonType::value_t::number_unsigned:
6081 const auto h = std::hash<number_unsigned_t>{}(j.template get<number_unsigned_t>());
6085 case BasicJsonType::value_t::number_float:
6087 const auto h = std::hash<number_float_t>{}(j.template get<number_float_t>());
6091 case BasicJsonType::value_t::binary:
6093 auto seed =
combine(type, j.get_binary().size());
6094 const auto h = std::hash<bool>{}(j.get_binary().has_subtype());
6096 seed =
combine(seed,
static_cast<std::size_t
>(j.get_binary().subtype()));
6097 for (
const auto byte : j.get_binary())
6099 seed =
combine(seed, std::hash<std::uint8_t> {}(byte));
6124 #include <algorithm>
6157 #include <type_traits>
6209 return std::fgetc(m_file);
6237 is->clear(is->rdstate() & std::ios::eofbit);
6242 : is(&i), sb(i.rdbuf())
6251 : is(rhs.is), sb(rhs.sb)
6262 auto res = sb->sbumpc();
6266 is->clear(is->rdstate() | std::ios::eofbit);
6273 std::istream* is =
nullptr;
6274 std::streambuf* sb =
nullptr;
6280 template<
typename IteratorType>
6284 using char_type =
typename std::iterator_traits<IteratorType>::value_type;
6287 : current(
std::move(first)), end(
std::move(last))
6295 std::advance(current, 1);
6303 IteratorType current;
6306 template<
typename BaseInputAdapter,
size_t T>
6311 return current == end;
6315 template<
typename BaseInputAdapter,
size_t T>
6318 template<
typename BaseInputAdapter>
6323 std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
6324 size_t& utf8_bytes_index,
6325 size_t& utf8_bytes_filled)
6327 utf8_bytes_index = 0;
6331 utf8_bytes[0] = std::char_traits<char>::eof();
6332 utf8_bytes_filled = 1;
6337 const auto wc = input.get_character();
6342 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(wc);
6343 utf8_bytes_filled = 1;
6345 else if (wc <= 0x7FF)
6347 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xC0u | ((
static_cast<unsigned int>(wc) >> 6u) & 0x1Fu));
6348 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6349 utf8_bytes_filled = 2;
6351 else if (wc <= 0xFFFF)
6353 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xE0u | ((
static_cast<unsigned int>(wc) >> 12u) & 0x0Fu));
6354 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((
static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
6355 utf8_bytes[2] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6356 utf8_bytes_filled = 3;
6358 else if (wc <= 0x10FFFF)
6360 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xF0u | ((
static_cast<unsigned int>(wc) >> 18u) & 0x07u));
6361 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((
static_cast<unsigned int>(wc) >> 12u) & 0x3Fu));
6362 utf8_bytes[2] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((
static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
6363 utf8_bytes[3] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6364 utf8_bytes_filled = 4;
6369 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(wc);
6370 utf8_bytes_filled = 1;
6376 template<
typename BaseInputAdapter>
6381 std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
6382 size_t& utf8_bytes_index,
6383 size_t& utf8_bytes_filled)
6385 utf8_bytes_index = 0;
6389 utf8_bytes[0] = std::char_traits<char>::eof();
6390 utf8_bytes_filled = 1;
6395 const auto wc = input.get_character();
6400 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(wc);
6401 utf8_bytes_filled = 1;
6403 else if (wc <= 0x7FF)
6405 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xC0u | ((
static_cast<unsigned int>(wc) >> 6u)));
6406 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6407 utf8_bytes_filled = 2;
6409 else if (0xD800 > wc || wc >= 0xE000)
6411 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xE0u | ((
static_cast<unsigned int>(wc) >> 12u)));
6412 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((
static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
6413 utf8_bytes[2] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (
static_cast<unsigned int>(wc) & 0x3Fu));
6414 utf8_bytes_filled = 3;
6420 const auto wc2 =
static_cast<unsigned int>(input.get_character());
6421 const auto charcode = 0x10000u + (((
static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu));
6422 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(0xF0u | (charcode >> 18u));
6423 utf8_bytes[1] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((charcode >> 12u) & 0x3Fu));
6424 utf8_bytes[2] =
static_cast<std::char_traits<char>::int_type
>(0x80u | ((charcode >> 6u) & 0x3Fu));
6425 utf8_bytes[3] =
static_cast<std::char_traits<char>::int_type
>(0x80u | (charcode & 0x3Fu));
6426 utf8_bytes_filled = 4;
6430 utf8_bytes[0] =
static_cast<std::char_traits<char>::int_type
>(wc);
6431 utf8_bytes_filled = 1;
6439 template<
typename BaseInputAdapter,
typename W
ideCharType>
6446 : base_adapter(base) {}
6451 if (utf8_bytes_index == utf8_bytes_filled)
6453 fill_buffer<sizeof(WideCharType)>();
6461 JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled);
6462 return utf8_bytes[utf8_bytes_index++];
6466 BaseInputAdapter base_adapter;
6475 std::array<std::char_traits<char>::int_type, 4> utf8_bytes = { {0, 0, 0, 0} };
6478 std::size_t utf8_bytes_index = 0;
6480 std::size_t utf8_bytes_filled = 0;
6483 template<
typename IteratorType,
typename Enable =
void>
6487 using char_type =
typename std::iterator_traits<iterator_type>::value_type;
6492 return adapter_type(std::move(first), std::move(last));
6496 template<
typename T>
6506 template<
typename IteratorType>
6510 using char_type =
typename std::iterator_traits<iterator_type>::value_type;
6521 template<
typename IteratorType>
6525 return factory_type::create(first, last);
6532 namespace container_input_adapter_factory_impl
6538 template<
typename ContainerType,
typename Enable =
void>
6541 template<
typename ContainerType>
6543 void_t<decltype(begin(
std::declval<ContainerType>()), end(std::declval<ContainerType>()))>>
6555 template<
typename ContainerType>
6582 template <
typename CharT,
6583 typename std::enable_if <
6584 std::is_pointer<CharT>::value &&
6585 !std::is_array<CharT>::value&&
6586 std::is_integral<typename std::remove_pointer<CharT>::type>::value &&
6587 sizeof(
typename std::remove_pointer<CharT>::type) == 1,
6591 auto length = std::strlen(
reinterpret_cast<const char*
>(b));
6592 const auto* ptr =
reinterpret_cast<const char*
>(b);
6596 template<
typename T, std::
size_t N>
6608 template <
typename CharT,
6609 typename std::enable_if <
6610 std::is_pointer<CharT>::value&&
6611 std::is_integral<typename std::remove_pointer<CharT>::type>::value &&
6612 sizeof(
typename std::remove_pointer<CharT>::type) == 1,
6615 : ia(
reinterpret_cast<const char*
>(b),
reinterpret_cast<const char*
>(b) + l) {}
6617 template<
class IteratorType,
6618 typename std::enable_if<
6619 std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value,
6626 return std::move(ia);
6669 template<
typename BasicJsonType>
6682 virtual bool null() = 0;
6773 const std::string& last_token,
6799 template<
typename BasicJsonType>
6815 :
root(r), allow_exceptions(allow_exceptions_)
6827 handle_value(
nullptr);
6863 handle_value(std::move(val));
6869 ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
6871 if (
JSON_HEDLEY_UNLIKELY(len !=
static_cast<std::size_t
>(-1) && len > ref_stack.back()->max_size()))
6885 object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val));
6894 ref_stack.back()->set_parents();
6895 ref_stack.pop_back();
6901 ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
6903 if (
JSON_HEDLEY_UNLIKELY(len !=
static_cast<std::size_t
>(-1) && len > ref_stack.back()->max_size()))
6916 ref_stack.back()->set_parents();
6917 ref_stack.pop_back();
6921 template<
class Exception>
6923 const Exception& ex)
6926 static_cast<void>(ex);
6927 if (allow_exceptions)
6946 template<
typename Value>
6948 BasicJsonType* handle_value(Value&& v)
6950 if (ref_stack.empty())
6952 root = BasicJsonType(std::forward<Value>(v));
6956 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
6958 if (ref_stack.back()->is_array())
6960 ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v));
6961 return &(ref_stack.back()->m_data.m_value.array->back());
6966 *object_element = BasicJsonType(std::forward<Value>(v));
6967 return object_element;
6971 BasicJsonType&
root;
6973 std::vector<BasicJsonType*> ref_stack{};
6975 BasicJsonType* object_element =
nullptr;
6977 bool errored =
false;
6979 const bool allow_exceptions =
true;
6982 template<
typename BasicJsonType>
6996 const bool allow_exceptions_ =
true)
6997 :
root(r), callback(cb), allow_exceptions(allow_exceptions_)
6999 keep_stack.push_back(
true);
7011 handle_value(
nullptr);
7047 handle_value(std::move(val));
7054 const bool keep = callback(
static_cast<int>(ref_stack.size()), parse_event_t::object_start,
discarded);
7055 keep_stack.push_back(keep);
7057 auto val = handle_value(BasicJsonType::value_t::object,
true);
7058 ref_stack.push_back(val.second);
7061 if (ref_stack.back() &&
JSON_HEDLEY_UNLIKELY(len !=
static_cast<std::size_t
>(-1) && len > ref_stack.back()->max_size()))
7071 BasicJsonType k = BasicJsonType(val);
7074 const bool keep = callback(
static_cast<int>(ref_stack.size()), parse_event_t::key, k);
7075 key_keep_stack.push_back(keep);
7078 if (keep && ref_stack.back())
7080 object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val) =
discarded);
7088 if (ref_stack.back())
7090 if (!callback(
static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()))
7097 ref_stack.back()->set_parents();
7103 ref_stack.pop_back();
7104 keep_stack.pop_back();
7106 if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())
7109 for (
auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)
7111 if (it->is_discarded())
7113 ref_stack.back()->erase(it);
7124 const bool keep = callback(
static_cast<int>(ref_stack.size()), parse_event_t::array_start,
discarded);
7125 keep_stack.push_back(keep);
7127 auto val = handle_value(BasicJsonType::value_t::array,
true);
7128 ref_stack.push_back(val.second);
7131 if (ref_stack.back() &&
JSON_HEDLEY_UNLIKELY(len !=
static_cast<std::size_t
>(-1) && len > ref_stack.back()->max_size()))
7143 if (ref_stack.back())
7145 keep = callback(
static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());
7148 ref_stack.back()->set_parents();
7159 ref_stack.pop_back();
7160 keep_stack.pop_back();
7163 if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())
7165 ref_stack.back()->m_data.m_value.array->pop_back();
7171 template<
class Exception>
7173 const Exception& ex)
7176 static_cast<void>(ex);
7177 if (allow_exceptions)
7205 template<
typename Value>
7206 std::pair<bool, BasicJsonType*> handle_value(Value&& v,
const bool skip_callback =
false)
7212 if (!keep_stack.back())
7214 return {
false,
nullptr };
7218 auto value = BasicJsonType(std::forward<Value>(v));
7221 const bool keep = skip_callback || callback(
static_cast<int>(ref_stack.size()), parse_event_t::value, value);
7226 return {
false,
nullptr };
7229 if (ref_stack.empty())
7231 root = std::move(value);
7232 return {
true, &
root };
7237 if (!ref_stack.back())
7239 return {
false,
nullptr };
7243 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
7246 if (ref_stack.back()->is_array())
7248 ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));
7249 return {
true, &(ref_stack.back()->m_data.m_value.array->back()) };
7256 const bool store_element = key_keep_stack.back();
7257 key_keep_stack.pop_back();
7261 return {
false,
nullptr };
7265 *object_element = std::move(value);
7266 return {
true, object_element };
7270 BasicJsonType&
root;
7272 std::vector<BasicJsonType*> ref_stack{};
7274 std::vector<bool> keep_stack{};
7276 std::vector<bool> key_keep_stack{};
7278 BasicJsonType* object_element =
nullptr;
7280 bool errored =
false;
7284 const bool allow_exceptions =
true;
7286 BasicJsonType
discarded = BasicJsonType::value_t::discarded;
7289 template<
typename BasicJsonType>
7384 #include <initializer_list>
7406 template<
typename BasicJsonType>
7439 case token_type::uninitialized:
7440 return "<uninitialized>";
7441 case token_type::literal_true:
7442 return "true literal";
7443 case token_type::literal_false:
7444 return "false literal";
7445 case token_type::literal_null:
7446 return "null literal";
7447 case token_type::value_string:
7448 return "string literal";
7449 case token_type::value_unsigned:
7450 case token_type::value_integer:
7451 case token_type::value_float:
7452 return "number literal";
7453 case token_type::begin_array:
7455 case token_type::begin_object:
7457 case token_type::end_array:
7459 case token_type::end_object:
7461 case token_type::name_separator:
7463 case token_type::value_separator:
7465 case token_type::parse_error:
7466 return "<parse error>";
7467 case token_type::end_of_input:
7468 return "end of input";
7469 case token_type::literal_or_value:
7470 return "'[', '{', or a literal";
7473 return "unknown token";
7483 template<
typename BasicJsonType,
typename InputAdapterType>
7486 using number_integer_t =
typename BasicJsonType::number_integer_t;
7487 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
7488 using number_float_t =
typename BasicJsonType::number_float_t;
7489 using string_t =
typename BasicJsonType::string_t;
7490 using char_type =
typename InputAdapterType::char_type;
7496 explicit lexer(InputAdapterType&& adapter,
bool ignore_comments_ =
false) noexcept
7497 : ia(
std::move(adapter))
7498 , ignore_comments(ignore_comments_)
7499 , decimal_point_char(static_cast<char_int_type>(get_decimal_point()))
7516 static char get_decimal_point() noexcept
7518 const auto* loc = localeconv();
7520 return (loc->decimal_point ==
nullptr) ?
'.' : *(loc->decimal_point);
7548 const auto factors = { 12u, 8u, 4u, 0u };
7549 for (
const auto factor : factors)
7553 if (current >=
'0' && current <=
'9')
7555 codepoint +=
static_cast<int>((
static_cast<unsigned int>(current) - 0x30u) << factor);
7557 else if (current >=
'A' && current <=
'F')
7559 codepoint +=
static_cast<int>((
static_cast<unsigned int>(current) - 0x37u) << factor);
7561 else if (current >=
'a' && current <=
'f')
7563 codepoint +=
static_cast<int>((
static_cast<unsigned int>(current) - 0x57u) << factor);
7571 JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF);
7590 bool next_byte_in_range(std::initializer_list<char_int_type> ranges)
7592 JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6);
7595 for (
auto range = ranges.begin(); range != ranges.end(); ++range)
7604 error_message =
"invalid string: ill-formed UTF-8 byte";
7627 token_type scan_string()
7641 case char_traits<char_type>::eof():
7643 error_message =
"invalid string: missing closing quote";
7644 return token_type::parse_error;
7650 return token_type::value_string;
7694 const int codepoint1 = get_codepoint();
7695 int codepoint = codepoint1;
7699 error_message =
"invalid string: '\\u' must be followed by 4 hex digits";
7700 return token_type::parse_error;
7704 if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF)
7709 const int codepoint2 = get_codepoint();
7713 error_message =
"invalid string: '\\u' must be followed by 4 hex digits";
7714 return token_type::parse_error;
7721 codepoint =
static_cast<int>(
7723 (
static_cast<unsigned int>(codepoint1) << 10u)
7725 +
static_cast<unsigned int>(codepoint2)
7733 error_message =
"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
7734 return token_type::parse_error;
7739 error_message =
"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
7740 return token_type::parse_error;
7747 error_message =
"invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF";
7748 return token_type::parse_error;
7753 JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF);
7756 if (codepoint < 0x80)
7759 add(
static_cast<char_int_type
>(codepoint));
7761 else if (codepoint <= 0x7FF)
7764 add(
static_cast<char_int_type
>(0xC0u | (
static_cast<unsigned int>(codepoint) >> 6u)));
7765 add(
static_cast<char_int_type
>(0x80u | (
static_cast<unsigned int>(codepoint) & 0x3Fu)));
7767 else if (codepoint <= 0xFFFF)
7770 add(
static_cast<char_int_type
>(0xE0u | (
static_cast<unsigned int>(codepoint) >> 12u)));
7771 add(
static_cast<char_int_type
>(0x80u | ((
static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
7772 add(
static_cast<char_int_type
>(0x80u | (
static_cast<unsigned int>(codepoint) & 0x3Fu)));
7777 add(
static_cast<char_int_type
>(0xF0u | (
static_cast<unsigned int>(codepoint) >> 18u)));
7778 add(
static_cast<char_int_type
>(0x80u | ((
static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu)));
7779 add(
static_cast<char_int_type
>(0x80u | ((
static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
7780 add(
static_cast<char_int_type
>(0x80u | (
static_cast<unsigned int>(codepoint) & 0x3Fu)));
7788 error_message =
"invalid string: forbidden character after backslash";
7789 return token_type::parse_error;
7798 error_message =
"invalid string: control character U+0000 (NUL) must be escaped to \\u0000";
7799 return token_type::parse_error;
7804 error_message =
"invalid string: control character U+0001 (SOH) must be escaped to \\u0001";
7805 return token_type::parse_error;
7810 error_message =
"invalid string: control character U+0002 (STX) must be escaped to \\u0002";
7811 return token_type::parse_error;
7816 error_message =
"invalid string: control character U+0003 (ETX) must be escaped to \\u0003";
7817 return token_type::parse_error;
7822 error_message =
"invalid string: control character U+0004 (EOT) must be escaped to \\u0004";
7823 return token_type::parse_error;
7828 error_message =
"invalid string: control character U+0005 (ENQ) must be escaped to \\u0005";
7829 return token_type::parse_error;
7834 error_message =
"invalid string: control character U+0006 (ACK) must be escaped to \\u0006";
7835 return token_type::parse_error;
7840 error_message =
"invalid string: control character U+0007 (BEL) must be escaped to \\u0007";
7841 return token_type::parse_error;
7846 error_message =
"invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b";
7847 return token_type::parse_error;
7852 error_message =
"invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t";
7853 return token_type::parse_error;
7858 error_message =
"invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n";
7859 return token_type::parse_error;
7864 error_message =
"invalid string: control character U+000B (VT) must be escaped to \\u000B";
7865 return token_type::parse_error;
7870 error_message =
"invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f";
7871 return token_type::parse_error;
7876 error_message =
"invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r";
7877 return token_type::parse_error;
7882 error_message =
"invalid string: control character U+000E (SO) must be escaped to \\u000E";
7883 return token_type::parse_error;
7888 error_message =
"invalid string: control character U+000F (SI) must be escaped to \\u000F";
7889 return token_type::parse_error;
7894 error_message =
"invalid string: control character U+0010 (DLE) must be escaped to \\u0010";
7895 return token_type::parse_error;
7900 error_message =
"invalid string: control character U+0011 (DC1) must be escaped to \\u0011";
7901 return token_type::parse_error;
7906 error_message =
"invalid string: control character U+0012 (DC2) must be escaped to \\u0012";
7907 return token_type::parse_error;
7912 error_message =
"invalid string: control character U+0013 (DC3) must be escaped to \\u0013";
7913 return token_type::parse_error;
7918 error_message =
"invalid string: control character U+0014 (DC4) must be escaped to \\u0014";
7919 return token_type::parse_error;
7924 error_message =
"invalid string: control character U+0015 (NAK) must be escaped to \\u0015";
7925 return token_type::parse_error;
7930 error_message =
"invalid string: control character U+0016 (SYN) must be escaped to \\u0016";
7931 return token_type::parse_error;
7936 error_message =
"invalid string: control character U+0017 (ETB) must be escaped to \\u0017";
7937 return token_type::parse_error;
7942 error_message =
"invalid string: control character U+0018 (CAN) must be escaped to \\u0018";
7943 return token_type::parse_error;
7948 error_message =
"invalid string: control character U+0019 (EM) must be escaped to \\u0019";
7949 return token_type::parse_error;
7954 error_message =
"invalid string: control character U+001A (SUB) must be escaped to \\u001A";
7955 return token_type::parse_error;
7960 error_message =
"invalid string: control character U+001B (ESC) must be escaped to \\u001B";
7961 return token_type::parse_error;
7966 error_message =
"invalid string: control character U+001C (FS) must be escaped to \\u001C";
7967 return token_type::parse_error;
7972 error_message =
"invalid string: control character U+001D (GS) must be escaped to \\u001D";
7973 return token_type::parse_error;
7978 error_message =
"invalid string: control character U+001E (RS) must be escaped to \\u001E";
7979 return token_type::parse_error;
7984 error_message =
"invalid string: control character U+001F (US) must be escaped to \\u001F";
7985 return token_type::parse_error;
8122 return token_type::parse_error;
8132 return token_type::parse_error;
8156 return token_type::parse_error;
8166 return token_type::parse_error;
8176 return token_type::parse_error;
8188 return token_type::parse_error;
8198 return token_type::parse_error;
8206 error_message =
"invalid string: ill-formed UTF-8 byte";
8207 return token_type::parse_error;
8230 case char_traits<char_type>::eof():
8247 case char_traits<char_type>::eof():
8250 error_message =
"invalid comment; missing closing '*/'";
8278 error_message =
"invalid comment; expecting '/' or '*' after '/'";
8285 static
void strtof(
float& f, const
char* str,
char** endptr) noexcept
8287 f = std::strtof(str, endptr);
8291 static
void strtof(
double& f, const
char* str,
char** endptr) noexcept
8293 f = std::strtod(str, endptr);
8297 static
void strtof(
long double& f, const
char* str,
char** endptr) noexcept
8299 f = std::strtold(str, endptr);
8342 token_type scan_number()
8349 token_type number_type = token_type::value_unsigned;
8357 goto scan_number_minus;
8363 goto scan_number_zero;
8377 goto scan_number_any1;
8387 number_type = token_type::value_integer;
8393 goto scan_number_zero;
8407 goto scan_number_any1;
8412 error_message =
"invalid number; expected digit after '-'";
8413 return token_type::parse_error;
8423 add(decimal_point_char);
8424 goto scan_number_decimal1;
8431 goto scan_number_exponent;
8435 goto scan_number_done;
8454 goto scan_number_any1;
8459 add(decimal_point_char);
8460 goto scan_number_decimal1;
8467 goto scan_number_exponent;
8471 goto scan_number_done;
8474 scan_number_decimal1:
8476 number_type = token_type::value_float;
8491 goto scan_number_decimal2;
8496 error_message =
"invalid number; expected digit after '.'";
8497 return token_type::parse_error;
8501 scan_number_decimal2:
8517 goto scan_number_decimal2;
8524 goto scan_number_exponent;
8528 goto scan_number_done;
8531 scan_number_exponent:
8533 number_type = token_type::value_float;
8540 goto scan_number_sign;
8555 goto scan_number_any2;
8561 "invalid number; expected '+', '-', or digit after exponent";
8562 return token_type::parse_error;
8582 goto scan_number_any2;
8587 error_message =
"invalid number; expected digit after exponent sign";
8588 return token_type::parse_error;
8608 goto scan_number_any2;
8612 goto scan_number_done;
8620 char* endptr =
nullptr;
8624 if (number_type == token_type::value_unsigned)
8626 const auto x = std::strtoull(token_buffer.data(), &endptr, 10);
8629 JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());
8633 value_unsigned =
static_cast<number_unsigned_t
>(x);
8634 if (value_unsigned == x)
8636 return token_type::value_unsigned;
8640 else if (number_type == token_type::value_integer)
8642 const auto x = std::strtoll(token_buffer.data(), &endptr, 10);
8645 JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());
8649 value_integer =
static_cast<number_integer_t
>(x);
8650 if (value_integer == x)
8652 return token_type::value_integer;
8659 strtof(value_float, token_buffer.data(), &endptr);
8662 JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());
8664 return token_type::value_float;
8673 token_type scan_literal(const char_type* literal_text, const
std::
size_t length,
8674 token_type return_type)
8676 JSON_ASSERT(char_traits<char_type>::to_char_type(current) == literal_text[0]);
8677 for (std::size_t i = 1; i < length; ++i)
8681 error_message =
"invalid literal";
8682 return token_type::parse_error;
8693 void reset() noexcept
8695 token_buffer.clear();
8696 token_string.clear();
8697 token_string.push_back(char_traits<char_type>::to_char_type(current));
8712 ++position.chars_read_total;
8713 ++position.chars_read_current_line;
8722 current = ia.get_character();
8727 token_string.push_back(char_traits<char_type>::to_char_type(current));
8730 if (current ==
'\n')
8732 ++position.lines_read;
8733 position.chars_read_current_line = 0;
8751 --position.chars_read_total;
8754 if (position.chars_read_current_line == 0)
8756 if (position.lines_read > 0)
8758 --position.lines_read;
8763 --position.chars_read_current_line;
8769 token_string.pop_back();
8774 void add(char_int_type c)
8776 token_buffer.push_back(
static_cast<typename string_t::value_type
>(c));
8787 return value_integer;
8793 return value_unsigned;
8805 return token_buffer;
8825 for (
const auto c : token_string)
8827 if (
static_cast<unsigned char>(c) <=
'\x1F')
8830 std::array<char, 9> cs{ {} };
8831 static_cast<void>((std::snprintf)(cs.data(), cs.size(),
"<U+%.4X>",
static_cast<unsigned char>(c)));
8832 result += cs.data();
8837 result.push_back(
static_cast<std::string::value_type
>(c));
8848 return error_message;
8864 return get() == 0xBB &&
get() == 0xBF;
8878 }
while (current ==
' ' || current ==
'\t' || current ==
'\n' || current ==
'\r');
8884 if (position.chars_read_total == 0 && !skip_bom())
8886 error_message =
"invalid BOM; must be 0xEF 0xBB 0xBF if given";
8887 return token_type::parse_error;
8894 while (ignore_comments && current ==
'/')
8896 if (!scan_comment())
8898 return token_type::parse_error;
8909 return token_type::begin_array;
8911 return token_type::end_array;
8913 return token_type::begin_object;
8915 return token_type::end_object;
8917 return token_type::name_separator;
8919 return token_type::value_separator;
8924 std::array<char_type, 4> true_literal = { {
static_cast<char_type
>(
't'),
static_cast<char_type
>(
'r'),
static_cast<char_type
>(
'u'),
static_cast<char_type
>(
'e')} };
8925 return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true);
8929 std::array<char_type, 5> false_literal = { {
static_cast<char_type
>(
'f'),
static_cast<char_type
>(
'a'),
static_cast<char_type
>(
'l'),
static_cast<char_type
>(
's'),
static_cast<char_type
>(
'e')} };
8930 return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false);
8934 std::array<char_type, 4> null_literal = { {
static_cast<char_type
>(
'n'),
static_cast<char_type
>(
'u'),
static_cast<char_type
>(
'l'),
static_cast<char_type
>(
'l')} };
8935 return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null);
8940 return scan_string();
8954 return scan_number();
8960 return token_type::end_of_input;
8964 error_message =
"invalid literal";
8965 return token_type::parse_error;
8971 InputAdapterType ia;
8974 const bool ignore_comments =
false;
8980 bool next_unget =
false;
8986 std::vector<char_type> token_string{};
8989 string_t token_buffer{};
8992 const char* error_message =
"";
8995 number_integer_t value_integer = 0;
8996 number_unsigned_t value_unsigned = 0;
8997 number_float_t value_float = 0;
9000 const char_int_type decimal_point_char =
'.';
9034 template<
typename T>
9037 template<
typename T>
9039 decltype(std::declval<T&>().
boolean(std::declval<bool>()));
9041 template<
typename T,
typename Integer>
9043 decltype(std::declval<T&>().
number_integer(std::declval<Integer>()));
9045 template<
typename T,
typename Un
signed>
9047 decltype(std::declval<T&>().
number_unsigned(std::declval<Unsigned>()));
9049 template<
typename T,
typename Float,
typename String>
9051 std::declval<Float>(), std::declval<const String&>()));
9053 template<
typename T,
typename String>
9055 decltype(std::declval<T&>().
string(std::declval<String&>()));
9057 template<
typename T,
typename Binary>
9059 decltype(std::declval<T&>().
binary(std::declval<Binary&>()));
9061 template<
typename T>
9063 decltype(std::declval<T&>().start_object(std::declval<std::size_t>()));
9065 template<
typename T,
typename String>
9067 decltype(std::declval<T&>().
key(std::declval<String&>()));
9069 template<
typename T>
9072 template<
typename T>
9074 decltype(std::declval<T&>().start_array(std::declval<std::size_t>()));
9076 template<
typename T>
9079 template<
typename T,
typename Exception>
9081 std::declval<std::size_t>(), std::declval<const std::string&>(),
9082 std::declval<const Exception&>()));
9084 template<
typename SAX,
typename BasicJsonType>
9089 "BasicJsonType must be of type basic_json<...>");
9091 using number_integer_t =
typename BasicJsonType::number_integer_t;
9092 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
9093 using number_float_t =
typename BasicJsonType::number_float_t;
9094 using string_t =
typename BasicJsonType::string_t;
9095 using binary_t =
typename BasicJsonType::binary_t;
9096 using exception_t =
typename BasicJsonType::exception;
9115 template<
typename SAX,
typename BasicJsonType>
9120 "BasicJsonType must be of type basic_json<...>");
9122 using number_integer_t =
typename BasicJsonType::number_integer_t;
9123 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
9124 using number_float_t =
typename BasicJsonType::number_float_t;
9125 using string_t =
typename BasicJsonType::string_t;
9126 using binary_t =
typename BasicJsonType::binary_t;
9127 using exception_t =
typename BasicJsonType::exception;
9131 "Missing/invalid function: bool null()");
9133 "Missing/invalid function: bool boolean(bool)");
9135 "Missing/invalid function: bool boolean(bool)");
9138 number_integer_t>::
value,
9139 "Missing/invalid function: bool number_integer(number_integer_t)");
9142 number_unsigned_t>::
value,
9143 "Missing/invalid function: bool number_unsigned(number_unsigned_t)");
9145 number_float_t, string_t>::
value,
9146 "Missing/invalid function: bool number_float(number_float_t, const string_t&)");
9149 "Missing/invalid function: bool string(string_t&)");
9152 "Missing/invalid function: bool binary(binary_t&)");
9154 "Missing/invalid function: bool start_object(std::size_t)");
9156 "Missing/invalid function: bool key(string_t&)");
9158 "Missing/invalid function: bool end_object()");
9160 "Missing/invalid function: bool start_array(std::size_t)");
9162 "Missing/invalid function: bool end_array()");
9165 "Missing/invalid function: bool parse_error(std::size_t, const "
9166 "std::string&, const exception&)");
9198 static inline bool little_endianness(
int num = 1) noexcept
9200 return *
reinterpret_cast<char*
>(&num) == 1;
9210 template<
typename BasicJsonType,
typename InputAdapterType,
typename SAX = json_sax_dom_parser<BasicJsonType>>
9213 using number_integer_t =
typename BasicJsonType::number_integer_t;
9214 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
9215 using number_float_t =
typename BasicJsonType::number_float_t;
9216 using string_t =
typename BasicJsonType::string_t;
9217 using binary_t =
typename BasicJsonType::binary_t;
9218 using json_sax_t = SAX;
9219 using char_type =
typename InputAdapterType::char_type;
9251 const
bool strict = true,
9255 bool result =
false;
9260 result = parse_bson_internal();
9264 result = parse_cbor_internal(
true, tag_handler);
9268 result = parse_msgpack_internal();
9273 result = parse_ubjson_internal();
9295 return sax->parse_error(chars_read, get_token_string(),
parse_error::create(110, chars_read,
9296 exception_message(input_format,
concat(
"expected end of input; last byte: 0x", get_token_string()),
"value"),
nullptr));
9312 bool parse_bson_internal()
9314 std::int32_t document_size{};
9327 return sax->end_object();
9337 bool get_bson_cstr(string_t& result)
9339 auto out = std::back_inserter(result);
9347 if (current == 0x00)
9351 *out++ =
static_cast<typename string_t::value_type
>(current);
9366 template<
typename NumberType>
9367 bool get_bson_string(
const NumberType len, string_t& result)
9371 auto last_token = get_token_string();
9376 return get_string(
input_format_t::bson, len -
static_cast<NumberType
>(1), result) && get() != char_traits<char_type>::eof();
9388 template<
typename NumberType>
9389 bool get_bson_binary(
const NumberType len, binary_t& result)
9393 auto last_token = get_token_string();
9399 std::uint8_t subtype{};
9401 result.set_subtype(subtype);
9416 bool parse_bson_element_internal(
const char_int_type element_type,
9417 const std::size_t element_type_parse_position)
9419 switch (element_type)
9424 return get_number<double, true>(
input_format_t::bson, number) && sax->number_float(
static_cast<number_float_t
>(number),
"");
9431 return get_number<std::int32_t, true>(
input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value);
9436 return parse_bson_internal();
9441 return parse_bson_array();
9448 return get_number<std::int32_t, true>(
input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value);
9453 return sax->boolean(get() != 0);
9463 std::int32_t
value{};
9464 return get_number<std::int32_t, true>(
input_format_t::bson, value) && sax->number_integer(value);
9469 std::int64_t
value{};
9470 return get_number<std::int64_t, true>(
input_format_t::bson, value) && sax->number_integer(value);
9475 std::array<char, 3> cr{ {} };
9476 static_cast<void>((std::snprintf)(cr.data(), cr.size(),
"%.2hhX",
static_cast<unsigned char>(element_type)));
9477 const std::string cr_str{ cr.data() };
9478 return sax->parse_error(element_type_parse_position, cr_str,
9496 bool parse_bson_element_list(
const bool is_array)
9500 while (
auto element_type = get())
9507 const std::size_t element_type_parse_position = chars_read;
9513 if (!is_array && !sax->key(key))
9518 if (
JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position)))
9534 bool parse_bson_array()
9536 std::int32_t document_size{};
9549 return sax->end_array();
9564 bool parse_cbor_internal(
const bool get_char,
9567 switch (get_char ? get() : current)
9570 case char_traits<char_type>::eof():
9598 return sax->number_unsigned(
static_cast<number_unsigned_t
>(current));
9602 std::uint8_t number{};
9608 std::uint16_t number{};
9614 std::uint32_t number{};
9620 std::uint64_t number{};
9649 return sax->number_integer(
static_cast<std::int8_t
>(0x20 - 1 - current));
9653 std::uint8_t number{};
9654 return get_number(
input_format_t::cbor, number) && sax->number_integer(
static_cast<number_integer_t
>(-1) - number);
9659 std::uint16_t number{};
9660 return get_number(
input_format_t::cbor, number) && sax->number_integer(
static_cast<number_integer_t
>(-1) - number);
9665 std::uint32_t number{};
9666 return get_number(
input_format_t::cbor, number) && sax->number_integer(
static_cast<number_integer_t
>(-1) - number);
9671 std::uint64_t number{};
9672 return get_number(
input_format_t::cbor, number) && sax->number_integer(
static_cast<number_integer_t
>(-1)
9673 -
static_cast<number_integer_t
>(number));
9708 return get_cbor_binary(b) && sax->binary(b);
9743 return get_cbor_string(s) && sax->string(s);
9771 return get_cbor_array(
9772 conditional_static_cast<std::size_t>(
static_cast<unsigned int>(current) & 0x1Fu), tag_handler);
9777 return get_number(
input_format_t::cbor, len) && get_cbor_array(
static_cast<std::size_t
>(len), tag_handler);
9782 std::uint16_t len{};
9783 return get_number(
input_format_t::cbor, len) && get_cbor_array(
static_cast<std::size_t
>(len), tag_handler);
9788 std::uint32_t len{};
9789 return get_number(
input_format_t::cbor, len) && get_cbor_array(conditional_static_cast<std::size_t>(len), tag_handler);
9794 std::uint64_t len{};
9795 return get_number(
input_format_t::cbor, len) && get_cbor_array(conditional_static_cast<std::size_t>(len), tag_handler);
9799 return get_cbor_array(
static_cast<std::size_t
>(-1), tag_handler);
9826 return get_cbor_object(conditional_static_cast<std::size_t>(
static_cast<unsigned int>(current) & 0x1Fu), tag_handler);
9831 return get_number(
input_format_t::cbor, len) && get_cbor_object(
static_cast<std::size_t
>(len), tag_handler);
9836 std::uint16_t len{};
9837 return get_number(
input_format_t::cbor, len) && get_cbor_object(
static_cast<std::size_t
>(len), tag_handler);
9842 std::uint32_t len{};
9843 return get_number(
input_format_t::cbor, len) && get_cbor_object(conditional_static_cast<std::size_t>(len), tag_handler);
9848 std::uint64_t len{};
9849 return get_number(
input_format_t::cbor, len) && get_cbor_object(conditional_static_cast<std::size_t>(len), tag_handler);
9853 return get_cbor_object(
static_cast<std::size_t
>(-1), tag_handler);
9875 switch (tag_handler)
9879 auto last_token = get_token_string();
9891 std::uint8_t subtype_to_ignore{};
9897 std::uint16_t subtype_to_ignore{};
9903 std::uint32_t subtype_to_ignore{};
9909 std::uint64_t subtype_to_ignore{};
9916 return parse_cbor_internal(
true, tag_handler);
9927 std::uint8_t subtype{};
9929 b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));
9934 std::uint16_t subtype{};
9936 b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));
9941 std::uint32_t subtype{};
9943 b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));
9948 std::uint64_t subtype{};
9950 b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));
9954 return parse_cbor_internal(
true, tag_handler);
9957 return get_cbor_binary(b) && sax->binary(b);
9967 return sax->boolean(
false);
9970 return sax->boolean(
true);
9977 const auto byte1_raw = get();
9982 const auto byte2_raw = get();
9988 const auto byte1 =
static_cast<unsigned char>(byte1_raw);
9989 const auto byte2 =
static_cast<unsigned char>(byte2_raw);
9999 const auto half =
static_cast<unsigned int>((byte1 << 8u) + byte2);
10000 const double val = [&half]
10002 const int exp = (half >> 10u) & 0x1Fu;
10003 const unsigned int mant = half & 0x3FFu;
10009 return std::ldexp(mant, -24);
10012 ? std::numeric_limits<double>::infinity()
10013 :
std::numeric_limits<double>::quiet_NaN();
10015 return std::ldexp(mant + 1024, exp - 25);
10018 return sax->number_float((half & 0x8000u) != 0
10019 ?
static_cast<number_float_t
>(-val)
10020 :
static_cast<number_float_t
>(val),
"");
10026 return get_number(
input_format_t::cbor, number) && sax->number_float(
static_cast<number_float_t
>(number),
"");
10032 return get_number(
input_format_t::cbor, number) && sax->number_float(
static_cast<number_float_t
>(number),
"");
10037 auto last_token = get_token_string();
10055 bool get_cbor_string(string_t& result)
10095 std::uint8_t len{};
10101 std::uint16_t len{};
10107 std::uint32_t len{};
10113 std::uint64_t len{};
10119 while (get() != 0xFF)
10122 if (!get_cbor_string(chunk))
10126 result.append(chunk);
10133 auto last_token = get_token_string();
10135 exception_message(
input_format_t::cbor,
concat(
"expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x", last_token),
"string"),
nullptr));
10151 bool get_cbor_binary(binary_t& result)
10191 std::uint8_t len{};
10198 std::uint16_t len{};
10205 std::uint32_t len{};
10212 std::uint64_t len{};
10219 while (get() != 0xFF)
10222 if (!get_cbor_binary(chunk))
10226 result.insert(result.end(), chunk.begin(), chunk.end());
10233 auto last_token = get_token_string();
10235 exception_message(
input_format_t::cbor,
concat(
"expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x", last_token),
"binary"),
nullptr));
10246 bool get_cbor_array(
const std::size_t len,
10254 if (len !=
static_cast<std::size_t
>(-1))
10256 for (std::size_t i = 0; i < len; ++i)
10266 while (get() != 0xFF)
10275 return sax->end_array();
10284 bool get_cbor_object(
const std::size_t len,
10295 if (len !=
static_cast<std::size_t
>(-1))
10297 for (std::size_t i = 0; i < len; ++i)
10314 while (get() != 0xFF)
10330 return sax->end_object();
10340 bool parse_msgpack_internal()
10345 case char_traits<char_type>::eof():
10477 return sax->number_unsigned(
static_cast<number_unsigned_t
>(current));
10496 return get_msgpack_object(conditional_static_cast<std::size_t>(
static_cast<unsigned int>(current) & 0x0Fu));
10515 return get_msgpack_array(conditional_static_cast<std::size_t>(
static_cast<unsigned int>(current) & 0x0Fu));
10555 return get_msgpack_string(s) && sax->string(s);
10559 return sax->null();
10562 return sax->boolean(
false);
10565 return sax->boolean(
true);
10580 return get_msgpack_binary(b) && sax->binary(b);
10586 return get_number(
input_format_t::msgpack, number) && sax->number_float(
static_cast<number_float_t
>(number),
"");
10592 return get_number(
input_format_t::msgpack, number) && sax->number_float(
static_cast<number_float_t
>(number),
"");
10597 std::uint8_t number{};
10603 std::uint16_t number{};
10609 std::uint32_t number{};
10615 std::uint64_t number{};
10621 std::int8_t number{};
10627 std::int16_t number{};
10633 std::int32_t number{};
10639 std::int64_t number{};
10645 std::uint16_t len{};
10651 std::uint32_t len{};
10652 return get_number(
input_format_t::msgpack, len) && get_msgpack_array(conditional_static_cast<std::size_t>(len));
10657 std::uint16_t len{};
10663 std::uint32_t len{};
10664 return get_number(
input_format_t::msgpack, len) && get_msgpack_object(conditional_static_cast<std::size_t>(len));
10700 return sax->number_integer(
static_cast<std::int8_t
>(current));
10704 auto last_token = get_token_string();
10721 bool get_msgpack_string(string_t& result)
10769 std::uint8_t len{};
10775 std::uint16_t len{};
10781 std::uint32_t len{};
10787 auto last_token = get_token_string();
10789 exception_message(
input_format_t::msgpack,
concat(
"expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x", last_token),
"string"),
nullptr));
10804 bool get_msgpack_binary(binary_t& result)
10807 auto assign_and_return_true = [&result](std::int8_t subtype)
10809 result.set_subtype(
static_cast<std::uint8_t
>(subtype));
10817 std::uint8_t len{};
10824 std::uint16_t len{};
10831 std::uint32_t len{};
10838 std::uint8_t len{};
10839 std::int8_t subtype{};
10843 assign_and_return_true(subtype);
10848 std::uint16_t len{};
10849 std::int8_t subtype{};
10853 assign_and_return_true(subtype);
10858 std::uint32_t len{};
10859 std::int8_t subtype{};
10863 assign_and_return_true(subtype);
10868 std::int8_t subtype{};
10871 assign_and_return_true(subtype);
10876 std::int8_t subtype{};
10879 assign_and_return_true(subtype);
10884 std::int8_t subtype{};
10887 assign_and_return_true(subtype);
10892 std::int8_t subtype{};
10895 assign_and_return_true(subtype);
10900 std::int8_t subtype{};
10903 assign_and_return_true(subtype);
10915 bool get_msgpack_array(
const std::size_t len)
10922 for (std::size_t i = 0; i < len; ++i)
10930 return sax->end_array();
10937 bool get_msgpack_object(
const std::size_t len)
10945 for (std::size_t i = 0; i < len; ++i)
10960 return sax->end_object();
10974 bool parse_ubjson_internal(
const bool get_char =
true)
10976 return get_ubjson_value(get_char ? get_ignore_noop() : current);
10993 bool get_ubjson_string(string_t& result,
const bool get_char =
true)
11009 std::uint8_t len{};
11010 return get_number(input_format, len) && get_string(input_format, len, result);
11016 return get_number(input_format, len) && get_string(input_format, len, result);
11021 std::int16_t len{};
11022 return get_number(input_format, len) && get_string(input_format, len, result);
11027 std::int32_t len{};
11028 return get_number(input_format, len) && get_string(input_format, len, result);
11033 std::int64_t len{};
11034 return get_number(input_format, len) && get_string(input_format, len, result);
11043 std::uint16_t len{};
11044 return get_number(input_format, len) && get_string(input_format, len, result);
11053 std::uint32_t len{};
11054 return get_number(input_format, len) && get_string(input_format, len, result);
11063 std::uint64_t len{};
11064 return get_number(input_format, len) && get_string(input_format, len, result);
11070 auto last_token = get_token_string();
11071 std::string message;
11075 message =
"expected length type specification (U, i, I, l, L); last byte: 0x" + last_token;
11079 message =
"expected length type specification (U, i, u, I, m, l, M, L); last byte: 0x" + last_token;
11081 return sax->parse_error(chars_read, last_token,
parse_error::create(113, chars_read, exception_message(input_format, message,
"string"),
nullptr));
11088 bool get_ubjson_ndarray_size(std::vector<size_t>& dim)
11090 std::pair<std::size_t, char_int_type> size_and_type;
11092 bool no_ndarray =
true;
11099 if (size_and_type.first != npos)
11101 if (size_and_type.second != 0)
11103 if (size_and_type.second !=
'N')
11105 for (std::size_t i = 0; i < size_and_type.first; ++i)
11111 dim.push_back(dimlen);
11117 for (std::size_t i = 0; i < size_and_type.first; ++i)
11123 dim.push_back(dimlen);
11129 while (current !=
']')
11135 dim.push_back(dimlen);
11153 bool get_ubjson_size_value(std::size_t& result,
bool& is_ndarray, char_int_type prefix = 0)
11157 prefix = get_ignore_noop();
11164 std::uint8_t number{};
11169 result =
static_cast<std::size_t
>(number);
11175 std::int8_t number{};
11182 return sax->parse_error(chars_read, get_token_string(),
parse_error::create(113, chars_read,
11183 exception_message(input_format,
"count in an optimized container must be positive",
"size"),
nullptr));
11185 result =
static_cast<std::size_t
>(number);
11191 std::int16_t number{};
11198 return sax->parse_error(chars_read, get_token_string(),
parse_error::create(113, chars_read,
11199 exception_message(input_format,
"count in an optimized container must be positive",
"size"),
nullptr));
11201 result =
static_cast<std::size_t
>(number);
11207 std::int32_t number{};
11214 return sax->parse_error(chars_read, get_token_string(),
parse_error::create(113, chars_read,
11215 exception_message(input_format,
"count in an optimized container must be positive",
"size"),
nullptr));
11217 result =
static_cast<std::size_t
>(number);
11223 std::int64_t number{};
11230 return sax->parse_error(chars_read, get_token_string(),
parse_error::create(113, chars_read,
11231 exception_message(input_format,
"count in an optimized container must be positive",
"size"),
nullptr));
11233 if (!value_in_range_of<std::size_t>(number))
11236 exception_message(input_format,
"integer value overflow",
"size"),
nullptr));
11238 result =
static_cast<std::size_t
>(number);
11248 std::uint16_t number{};
11253 result =
static_cast<std::size_t
>(number);
11263 std::uint32_t number{};
11268 result = conditional_static_cast<std::size_t>(number);
11278 std::uint64_t number{};
11283 if (!value_in_range_of<std::size_t>(number))
11286 exception_message(input_format,
"integer value overflow",
"size"),
nullptr));
11288 result = detail::conditional_static_cast<std::size_t>(number);
11300 return sax->parse_error(chars_read, get_token_string(),
parse_error::create(113, chars_read, exception_message(input_format,
"ndarray dimensional vector is not allowed",
"size"),
nullptr));
11302 std::vector<size_t> dim;
11307 if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1))
11309 result = dim.at(dim.size() - 1);
11323 string_t
key =
"_ArraySize_";
11324 if (
JSON_HEDLEY_UNLIKELY(!sax->start_object(3) || !sax->key(key) || !sax->start_array(dim.size())))
11332 if (result == 0 || result == npos)
11334 return sax->parse_error(chars_read, get_token_string(),
out_of_range::create(408, exception_message(input_format,
"excessive ndarray size caused overflow",
"size"),
nullptr));
11342 return sax->end_array();
11351 auto last_token = get_token_string();
11352 std::string message;
11356 message =
"expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token;
11360 message =
"expected length type specification (U, i, u, I, m, l, M, L) after '#'; last byte: 0x" + last_token;
11362 return sax->parse_error(chars_read, last_token,
parse_error::create(113, chars_read, exception_message(input_format, message,
"size"),
nullptr));
11376 bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& result,
bool inside_ndarray =
false)
11378 result.first = npos;
11380 bool is_ndarray =
false;
11384 if (current ==
'$')
11386 result.second = get();
11388 &&
JSON_HEDLEY_UNLIKELY(std::binary_search(bjd_optimized_type_markers.begin(), bjd_optimized_type_markers.end(), result.second)))
11390 auto last_token = get_token_string();
11392 exception_message(input_format,
concat(
"marker 0x", last_token,
" is not a permitted optimized array type"),
"type"),
nullptr));
11407 auto last_token = get_token_string();
11409 exception_message(input_format,
concat(
"expected '#' after type information; last byte: 0x", last_token),
"size"),
nullptr));
11412 const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
11415 if (inside_ndarray)
11417 return sax->parse_error(chars_read, get_token_string(),
parse_error::create(112, chars_read,
11418 exception_message(input_format,
"ndarray can not be recursive",
"size"),
nullptr));
11420 result.second |= (1 << 8);
11425 if (current ==
'#')
11427 const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
11430 return sax->parse_error(chars_read, get_token_string(),
parse_error::create(112, chars_read,
11431 exception_message(input_format,
"ndarray requires both type and size",
"size"),
nullptr));
11443 bool get_ubjson_value(
const char_int_type prefix)
11447 case char_traits<char_type>::eof():
11448 return unexpect_eof(input_format,
"value");
11451 return sax->boolean(
true);
11453 return sax->boolean(
false);
11456 return sax->null();
11460 std::uint8_t number{};
11461 return get_number(input_format, number) && sax->number_unsigned(number);
11466 std::int8_t number{};
11467 return get_number(input_format, number) && sax->number_integer(number);
11472 std::int16_t number{};
11473 return get_number(input_format, number) && sax->number_integer(number);
11478 std::int32_t number{};
11479 return get_number(input_format, number) && sax->number_integer(number);
11484 std::int64_t number{};
11485 return get_number(input_format, number) && sax->number_integer(number);
11494 std::uint16_t number{};
11495 return get_number(input_format, number) && sax->number_unsigned(number);
11504 std::uint32_t number{};
11505 return get_number(input_format, number) && sax->number_unsigned(number);
11514 std::uint64_t number{};
11515 return get_number(input_format, number) && sax->number_unsigned(number);
11524 const auto byte1_raw = get();
11529 const auto byte2_raw = get();
11535 const auto byte1 =
static_cast<unsigned char>(byte1_raw);
11536 const auto byte2 =
static_cast<unsigned char>(byte2_raw);
11546 const auto half =
static_cast<unsigned int>((byte2 << 8u) + byte1);
11547 const double val = [&half]
11549 const int exp = (half >> 10u) & 0x1Fu;
11550 const unsigned int mant = half & 0x3FFu;
11556 return std::ldexp(mant, -24);
11559 ? std::numeric_limits<double>::infinity()
11560 :
std::numeric_limits<double>::quiet_NaN();
11562 return std::ldexp(mant + 1024, exp - 25);
11565 return sax->number_float((half & 0x8000u) != 0
11566 ?
static_cast<number_float_t
>(-val)
11567 :
static_cast<number_float_t
>(val),
"");
11573 return get_number(input_format, number) && sax->number_float(
static_cast<number_float_t
>(number),
"");
11579 return get_number(input_format, number) && sax->number_float(
static_cast<number_float_t
>(number),
"");
11584 return get_ubjson_high_precision_number();
11596 auto last_token = get_token_string();
11598 exception_message(input_format,
concat(
"byte after 'C' must be in range 0x00..0x7F; last byte: 0x", last_token),
"char"),
nullptr));
11600 string_t s(1,
static_cast<typename string_t::value_type
>(current));
11601 return sax->string(s);
11607 return get_ubjson_string(s) && sax->string(s);
11611 return get_ubjson_array();
11614 return get_ubjson_object();
11619 auto last_token = get_token_string();
11620 return sax->parse_error(chars_read, last_token,
parse_error::create(112, chars_read, exception_message(input_format,
"invalid byte: 0x" + last_token,
"value"),
nullptr));
11626 bool get_ubjson_array()
11628 std::pair<std::size_t, char_int_type> size_and_type;
11637 if (input_format ==
input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0)
11639 size_and_type.second &= ~(
static_cast<char_int_type
>(1) << 8);
11640 auto it = std::lower_bound(bjd_types_map.begin(), bjd_types_map.end(), size_and_type.second, [](
const bjd_type& p, char_int_type t)
11642 return p.first < t;
11644 string_t
key =
"_ArrayType_";
11647 auto last_token = get_token_string();
11649 exception_message(input_format,
"invalid byte: 0x" + last_token,
"type"),
nullptr));
11652 string_t type = it->second;
11658 if (size_and_type.second ==
'C')
11660 size_and_type.second =
'U';
11663 key =
"_ArrayData_";
11669 for (std::size_t i = 0; i < size_and_type.first; ++i)
11677 return (sax->end_array() && sax->end_object());
11680 if (size_and_type.first != npos)
11687 if (size_and_type.second != 0)
11689 if (size_and_type.second !=
'N')
11691 for (std::size_t i = 0; i < size_and_type.first; ++i)
11702 for (std::size_t i = 0; i < size_and_type.first; ++i)
11718 while (current !=
']')
11728 return sax->end_array();
11734 bool get_ubjson_object()
11736 std::pair<std::size_t, char_int_type> size_and_type;
11743 if (input_format ==
input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0)
11745 auto last_token = get_token_string();
11747 exception_message(input_format,
"BJData object does not support ND-array size in optimized format",
"object"),
nullptr));
11751 if (size_and_type.first != npos)
11758 if (size_and_type.second != 0)
11760 for (std::size_t i = 0; i < size_and_type.first; ++i)
11775 for (std::size_t i = 0; i < size_and_type.first; ++i)
11796 while (current !=
'}')
11811 return sax->end_object();
11817 bool get_ubjson_high_precision_number()
11820 std::size_t size{};
11821 bool no_ndarray =
true;
11822 auto res = get_ubjson_size_value(size, no_ndarray);
11829 std::vector<char> number_vector;
11830 for (std::size_t i = 0; i < size; ++i)
11837 number_vector.push_back(
static_cast<char>(current));
11843 const auto result_number = number_lexer.scan();
11844 const auto number_string = number_lexer.get_token_string();
11845 const auto result_remainder = number_lexer.scan();
11852 exception_message(input_format,
concat(
"invalid number text: ", number_lexer.get_token_string()),
"high-precision number"),
nullptr));
11855 switch (result_number)
11857 case token_type::value_integer:
11858 return sax->number_integer(number_lexer.get_number_integer());
11859 case token_type::value_unsigned:
11860 return sax->number_unsigned(number_lexer.get_number_unsigned());
11861 case token_type::value_float:
11862 return sax->number_float(number_lexer.get_number_float(), std::move(number_string));
11863 case token_type::uninitialized:
11864 case token_type::literal_true:
11865 case token_type::literal_false:
11866 case token_type::literal_null:
11867 case token_type::value_string:
11868 case token_type::begin_array:
11869 case token_type::begin_object:
11870 case token_type::end_array:
11871 case token_type::end_object:
11872 case token_type::name_separator:
11873 case token_type::value_separator:
11874 case token_type::parse_error:
11875 case token_type::end_of_input:
11876 case token_type::literal_or_value:
11879 exception_message(input_format,
concat(
"invalid number text: ", number_lexer.get_token_string()),
"high-precision number"),
nullptr));
11896 char_int_type get()
11899 return current = ia.get_character();
11905 char_int_type get_ignore_noop()
11910 }
while (current ==
'N');
11930 template<
typename NumberType,
bool InputIsLittleEndian = false>
11931 bool get_number(
const input_format_t format, NumberType& result)
11934 std::array<std::uint8_t,
sizeof(NumberType)> vec{};
11935 for (std::size_t i = 0; i <
sizeof(NumberType); ++i)
11946 vec[
sizeof(NumberType) - i - 1] =
static_cast<std::uint8_t
>(current);
11950 vec[i] =
static_cast<std::uint8_t
>(current);
11955 std::memcpy(&result, vec.data(),
sizeof(NumberType));
11973 template<
typename NumberType>
11975 const NumberType len,
11978 bool success =
true;
11979 for (NumberType i = 0; i < len; i++)
11987 result.push_back(
static_cast<typename string_t::value_type
>(current));
12006 template<
typename NumberType>
12008 const NumberType len,
12011 bool success =
true;
12012 for (NumberType i = 0; i < len; i++)
12020 result.push_back(
static_cast<std::uint8_t
>(current));
12031 bool unexpect_eof(const
input_format_t format, const
char* context)
const
12035 return sax->parse_error(chars_read,
"<end of file>",
12036 parse_error::create(110, chars_read, exception_message(format,
"unexpected end of input", context),
nullptr));
12044 std::string get_token_string()
const
12046 std::array<char, 3> cr{ {} };
12047 static_cast<void>((std::snprintf)(cr.data(), cr.size(),
"%.2hhX",
static_cast<unsigned char>(current)));
12048 return std::string{ cr.data() };
12058 const std::string&
detail,
12059 const std::string& context)
const
12061 std::string error_msg =
"syntax error while parsing ";
12066 error_msg +=
"CBOR";
12070 error_msg +=
"MessagePack";
12074 error_msg +=
"UBJSON";
12078 error_msg +=
"BSON";
12082 error_msg +=
"BJData";
12097 InputAdapterType ia;
12100 char_int_type current = char_traits<char_type>::eof();
12103 std::size_t chars_read = 0;
12106 const bool is_little_endian = little_endianness();
12112 json_sax_t* sax =
nullptr;
12115 #define JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ \
12116 make_array<char_int_type>('F', 'H', 'N', 'S', 'T', 'Z', '[', '{')
12118 #define JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ \
12119 make_array<bjd_type>( \
12120 bjd_type{'C', "char"}, \
12121 bjd_type{'D', "double"}, \
12122 bjd_type{'I', "int16"}, \
12123 bjd_type{'L', "int64"}, \
12124 bjd_type{'M', "uint64"}, \
12125 bjd_type{'U', "uint8"}, \
12126 bjd_type{'d', "single"}, \
12127 bjd_type{'i', "int8"}, \
12128 bjd_type{'l', "int32"}, \
12129 bjd_type{'m', "uint32"}, \
12130 bjd_type{'u', "uint16"})
12138 using bjd_type = std::pair<char_int_type, string_t>;
12143 #undef JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_
12144 #undef JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_
12147 #ifndef JSON_HAS_CPP_17
12148 template<
typename BasicJsonType,
typename InputAdapterType,
typename SAX>
12149 constexpr std::size_t binary_reader<BasicJsonType, InputAdapterType, SAX>::npos;
12172 #include <functional>
12217 template<
typename BasicJsonType>
12219 std::function<bool(
int ,
parse_event_t , BasicJsonType& )>;
12226 template<
typename BasicJsonType,
typename InputAdapterType>
12229 using number_integer_t =
typename BasicJsonType::number_integer_t;
12230 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
12231 using number_float_t =
typename BasicJsonType::number_float_t;
12232 using string_t =
typename BasicJsonType::string_t;
12240 const bool allow_exceptions_ =
true,
12241 const bool skip_comments =
false)
12243 , m_lexer(
std::move(adapter), skip_comments)
12244 , allow_exceptions(allow_exceptions_)
12260 void parse(
const bool strict, BasicJsonType& result)
12265 sax_parse_internal(&sdp);
12268 if (
strict && (get_token() != token_type::end_of_input))
12273 exception_message(token_type::end_of_input,
"value"),
nullptr));
12285 if (result.is_discarded())
12293 sax_parse_internal(&sdp);
12296 if (
strict && (get_token() != token_type::end_of_input))
12311 result.assert_invariant();
12326 template<
typename SAX>
12331 const bool result = sax_parse_internal(sax);
12334 if (result &&
strict && (get_token() != token_type::end_of_input))
12345 template<
typename SAX>
12347 bool sax_parse_internal(SAX* sax)
12351 std::vector<bool> states;
12353 bool skip_to_state_evaluation =
false;
12357 if (!skip_to_state_evaluation)
12360 switch (last_token)
12362 case token_type::begin_object:
12370 if (get_token() == token_type::end_object)
12400 states.push_back(
false);
12407 case token_type::begin_array:
12415 if (get_token() == token_type::end_array)
12425 states.push_back(
true);
12431 case token_type::value_float:
12450 case token_type::literal_false:
12459 case token_type::literal_null:
12468 case token_type::literal_true:
12477 case token_type::value_integer:
12486 case token_type::value_string:
12495 case token_type::value_unsigned:
12504 case token_type::parse_error:
12511 case token_type::end_of_input:
12518 "attempting to parse an empty input; check that your input string or stream contains the expected JSON",
nullptr));
12525 case token_type::uninitialized:
12526 case token_type::end_array:
12527 case token_type::end_object:
12528 case token_type::name_separator:
12529 case token_type::value_separator:
12530 case token_type::literal_or_value:
12541 skip_to_state_evaluation =
false;
12545 if (states.empty())
12554 if (get_token() == token_type::value_separator)
12575 skip_to_state_evaluation =
true;
12587 if (get_token() == token_type::value_separator)
12629 skip_to_state_evaluation =
true;
12640 token_type get_token()
12642 return last_token = m_lexer.
scan();
12645 std::string exception_message(
const token_type expected,
const std::string& context)
12647 std::string error_msg =
"syntax error ";
12649 if (!context.empty())
12651 error_msg +=
concat(
"while parsing ", context,
' ');
12656 if (last_token == token_type::parse_error)
12666 if (expected != token_type::uninitialized)
12676 const parser_callback_t<BasicJsonType> callback =
nullptr;
12678 token_type last_token = token_type::uninitialized;
12682 const bool allow_exceptions =
true;
12734 using difference_type = std::ptrdiff_t;
12735 static constexpr difference_type begin_value = 0;
12736 static constexpr difference_type end_value = begin_value + 1;
12740 difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
12751 m_it = begin_value;
12763 return m_it == begin_value;
12769 return m_it == end_value;
12774 return lhs.m_it == rhs.m_it;
12779 return lhs.m_it < rhs.m_it;
12784 auto result = *
this;
12791 return lhs.m_it - rhs.m_it;
12802 auto result = *
this;
12815 auto result = *
this;
12871 #include <iterator>
12872 #include <type_traits>
12894 template<
typename IteratorType>
class iteration_proxy;
12895 template<
typename IteratorType>
class iteration_proxy_value;
12913 template<
typename BasicJsonType>
12920 friend BasicJsonType;
12924 using object_t =
typename BasicJsonType::object_t;
12925 using array_t =
typename BasicJsonType::array_t;
12927 static_assert(
is_basic_json<
typename std::remove_const<BasicJsonType>::type>::
value,
12928 "iter_impl only accepts (const) basic_json");
12930 static_assert(std::is_base_of<std::bidirectional_iterator_tag, std::bidirectional_iterator_tag>::value
12931 && std::is_base_of<std::bidirectional_iterator_tag,
typename std::iterator_traits<typename array_t::iterator>::iterator_category>::
value,
12932 "basic_json iterator assumes array and object type iterators satisfy the LegacyBidirectionalIterator named requirement.");
12947 using pointer =
typename std::conditional<std::is_const<BasicJsonType>::value,
12948 typename BasicJsonType::const_pointer,
12949 typename BasicJsonType::pointer>::type;
12952 typename std::conditional<std::is_const<BasicJsonType>::value,
12953 typename BasicJsonType::const_reference,
12954 typename BasicJsonType::reference>::type;
12971 switch (m_object->m_data.m_type)
13018 : m_object(other.m_object),
m_it(other.m_it)
13029 if (&other !=
this)
13031 m_object = other.m_object;
13043 : m_object(other.m_object),
m_it(other.m_it)
13054 m_object = other.m_object;
13064 void set_begin() noexcept
13068 switch (m_object->m_data.m_type)
13112 switch (m_object->m_data.m_type)
13151 switch (m_object->m_data.m_type)
13195 switch (m_object->m_data.m_type)
13235 auto result = *
this;
13248 switch (m_object->m_data.m_type)
13286 auto result = *
this;
13299 switch (m_object->m_data.m_type)
13335 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 >
13346 switch (m_object->m_data.m_type)
13371 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 >
13391 switch (m_object->m_data.m_type)
13418 return !other.operator < (*this);
13447 switch (m_object->m_data.m_type)
13491 auto result = *
this;
13513 auto result = *
this;
13526 switch (m_object->m_data.m_type)
13555 switch (m_object->m_data.m_type)
13589 const typename object_t::key_type&
key()
const
13634 #include <iterator>
13666 template<
typename Base>
13740 auto it = --this->base();
13747 auto it = --this->base();
13748 return it.operator * ();
13768 #include <type_traits>
13791 std::is_same<T, void>::value,
13810 #include <algorithm>
13838 template<
typename RefStringType>
13848 template<
typename T>
13849 struct string_t_helper
13857 using type = StringType;
13862 using string_t =
typename string_t_helper<RefStringType>::type;
13867 : reference_tokens(split(s))
13874 return std::accumulate(reference_tokens.begin(), reference_tokens.end(),
13878 return detail::concat(a,
'/', detail::escape(b));
13904 reference_tokens.insert(reference_tokens.end(),
13905 ptr.reference_tokens.begin(),
13906 ptr.reference_tokens.end());
13970 reference_tokens.pop_back();
13982 return reference_tokens.back();
13989 reference_tokens.push_back(token);
13996 reference_tokens.push_back(std::move(token));
14003 return reference_tokens.empty();
14017 template<
typename BasicJsonType>
14018 static typename BasicJsonType::size_type array_index(
const string_t& s)
14020 using size_type =
typename BasicJsonType::size_type;
14034 const char* p = s.c_str();
14035 char* p_end =
nullptr;
14037 const unsigned long long res = std::strtoull(p, &p_end, 10);
14047 if (res >=
static_cast<unsigned long long>((std::numeric_limits<size_type>::max)()))
14052 return static_cast<size_type
>(res);
14064 result.reference_tokens = { reference_tokens[0] };
14077 template<
typename BasicJsonType>
14078 BasicJsonType& get_and_create(BasicJsonType& j)
const
14084 for (
const auto& reference_token : reference_tokens)
14086 switch (result->type())
14090 if (reference_token ==
"0")
14093 result = &result->operator[](0);
14098 result = &result->operator[](reference_token);
14106 result = &result->operator[](reference_token);
14113 result = &result->operator[](array_index<BasicJsonType>(reference_token));
14157 template<
typename BasicJsonType>
14158 BasicJsonType& get_unchecked(BasicJsonType* ptr)
const
14160 for (
const auto& reference_token : reference_tokens)
14163 if (ptr->is_null())
14167 std::all_of(reference_token.begin(), reference_token.end(),
14168 [](
const unsigned char x)
14170 return std::isdigit(x);
14174 *ptr = (nums || reference_token ==
"-")
14179 switch (ptr->type())
14184 ptr = &ptr->operator[](reference_token);
14190 if (reference_token ==
"-")
14193 ptr = &ptr->operator[](ptr->m_data.m_value.array->size());
14198 ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));
14225 template<
typename BasicJsonType>
14226 BasicJsonType& get_checked(BasicJsonType* ptr)
const
14228 for (
const auto& reference_token : reference_tokens)
14230 switch (ptr->type())
14235 ptr = &ptr->at(reference_token);
14245 "array index '-' (",
std::to_string(ptr->m_data.m_value.array->size()),
14246 ") is out of range"), ptr));
14250 ptr = &ptr->at(array_index<BasicJsonType>(reference_token));
14283 template<
typename BasicJsonType>
14284 const BasicJsonType& get_unchecked(
const BasicJsonType* ptr)
const
14286 for (
const auto& reference_token : reference_tokens)
14288 switch (ptr->type())
14293 ptr = &ptr->operator[](reference_token);
14306 ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));
14332 template<
typename BasicJsonType>
14333 const BasicJsonType& get_checked(
const BasicJsonType* ptr)
const
14335 for (
const auto& reference_token : reference_tokens)
14337 switch (ptr->type())
14342 ptr = &ptr->at(reference_token);
14352 "array index '-' (",
std::to_string(ptr->m_data.m_value.array->size()),
14353 ") is out of range"), ptr));
14357 ptr = &ptr->at(array_index<BasicJsonType>(reference_token));
14381 template<
typename BasicJsonType>
14382 bool contains(
const BasicJsonType* ptr)
const
14384 for (
const auto& reference_token : reference_tokens)
14386 switch (ptr->type())
14390 if (!ptr->contains(reference_token))
14396 ptr = &ptr->operator[](reference_token);
14407 if (
JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !(
"0" <= reference_token && reference_token <=
"9")))
14419 for (std::size_t i = 1; i < reference_token.size(); i++)
14429 const auto idx = array_index<BasicJsonType>(reference_token);
14430 if (idx >= ptr->size())
14436 ptr = &ptr->operator[](idx);
14470 static std::vector<string_t> split(
const string_t& reference_string)
14472 std::vector<string_t> result;
14475 if (reference_string.empty())
14491 std::size_t slash = reference_string.find_first_of(
'/', 1),
14498 start = (slash == string_t::npos) ? 0 : slash + 1,
14500 slash = reference_string.find_first_of(
'/', start))
14504 auto reference_token = reference_string.substr(start, slash - start);
14507 for (std::size_t pos = reference_token.find_first_of(
'~');
14508 pos != string_t::npos;
14509 pos = reference_token.find_first_of(
'~', pos + 1))
14515 (reference_token[pos + 1] !=
'0' &&
14516 reference_token[pos + 1] !=
'1')))
14523 detail::unescape(reference_token);
14524 result.push_back(reference_token);
14538 template<
typename BasicJsonType>
14539 static void flatten(
const string_t& reference_string,
14540 const BasicJsonType& value,
14541 BasicJsonType& result)
14543 switch (
value.type())
14547 if (
value.m_data.m_value.array->empty())
14550 result[reference_string] =
nullptr;
14555 for (std::size_t i = 0; i <
value.m_data.m_value.array->size(); ++i)
14558 value.m_data.m_value.array->operator[](i), result);
14566 if (
value.m_data.m_value.object->empty())
14569 result[reference_string] =
nullptr;
14574 for (
const auto& element : *
value.m_data.m_value.object)
14593 result[reference_string] =
value;
14609 template<
typename BasicJsonType>
14610 static BasicJsonType
14611 unflatten(
const BasicJsonType& value)
14618 BasicJsonType result;
14621 for (
const auto& element : *
value.m_data.m_value.object)
14632 json_pointer(element.first).get_and_create(result) = element.second;
14642 result.reference_tokens = reference_tokens;
14649 result.reference_tokens = std::move(reference_tokens);
14654 #if JSON_HAS_THREE_WAY_COMPARISON
14657 template<
typename RefStringTypeRhs>
14660 return reference_tokens == rhs.reference_tokens;
14672 template<
typename RefStringTypeRhs>
14675 return reference_tokens <=> rhs.reference_tokens;
14680 template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14687 template<
typename RefStringTypeLhs,
typename StringType>
14690 const StringType& rhs);
14694 template<
typename RefStringTypeRhs,
typename StringType>
14696 friend bool operator==(
const StringType& lhs,
14701 template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14708 template<
typename RefStringTypeLhs,
typename StringType>
14711 const StringType& rhs);
14715 template<
typename RefStringTypeRhs,
typename StringType>
14717 friend bool operator!=(
const StringType& lhs,
14721 template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14729 std::vector<string_t> reference_tokens;
14732 #if !JSON_HAS_THREE_WAY_COMPARISON
14734 template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14738 return lhs.reference_tokens == rhs.reference_tokens;
14741 template<
typename RefStringTypeLhs,
14745 const StringType& rhs)
14750 template<
typename RefStringTypeRhs,
14753 inline
bool operator==(const StringType& lhs,
14759 template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14763 return !(lhs == rhs);
14766 template<
typename RefStringTypeLhs,
14770 const StringType& rhs)
14772 return !(lhs == rhs);
14775 template<
typename RefStringTypeRhs,
14778 inline
bool operator!=(const StringType& lhs,
14781 return !(lhs == rhs);
14784 template<
typename RefStringTypeLhs,
typename RefStringTypeRhs>
14788 return lhs.reference_tokens < rhs.reference_tokens;
14805 #include <initializer_list>
14817 template<
typename BasicJsonType>
14828 : value_ref(&
value)
14832 : owned_value(init)
14839 : owned_value(
std::forward<Args>(args)...)
14851 if (value_ref ==
nullptr)
14853 return std::move(owned_value);
14860 return value_ref ? *value_ref : owned_value;
14897 #include <algorithm>
14923 #include <algorithm>
14925 #include <iterator>
14957 template<typename CharType>
14961 template<typename CharType, typename AllocatorType =
std::allocator<CharType>>
14975 void write_characters(const CharType* s,
std::
size_t length)
override
14977 v.insert(v.end(), s, s + length);
14981 std::vector<CharType, AllocatorType>& v;
14986 template<
typename CharType>
15000 void write_characters(const CharType* s,
std::
size_t length)
override
15002 stream.write(s,
static_cast<std::streamsize
>(length));
15006 std::basic_ostream<CharType>& stream;
15011 template<
typename CharType,
typename StringType = std::basic_
string<CharType>>
15025 void write_characters(const CharType* s,
std::
size_t length)
override
15027 str.append(s, length);
15034 template<
typename CharType,
typename StringType = std::basic_
string<CharType>>
15038 template<
typename AllocatorType = std::allocator<CharType>>
15076 template<
typename BasicJsonType,
typename CharType>
15079 using string_t =
typename BasicJsonType::string_t;
15080 using binary_t =
typename BasicJsonType::binary_t;
15081 using number_float_t =
typename BasicJsonType::number_float_t;
15102 case value_t::object:
15104 write_bson_object(*j.m_data.m_value.object);
15108 case value_t::null:
15109 case value_t::array:
15110 case value_t::string:
15111 case value_t::boolean:
15112 case value_t::number_integer:
15113 case value_t::number_unsigned:
15114 case value_t::number_float:
15115 case value_t::binary:
15116 case value_t::discarded:
15119 JSON_THROW(type_error::create(317,
concat(
"to serialize to BSON, top-level type must be object, but is ", j.type_name()), &j));
15131 case value_t::null:
15133 oa->write_character(to_char_type(0xF6));
15137 case value_t::boolean:
15139 oa->write_character(j.m_data.m_value.boolean
15140 ? to_char_type(0xF5)
15141 : to_char_type(0xF4));
15145 case value_t::number_integer:
15147 if (j.m_data.m_value.number_integer >= 0)
15152 if (j.m_data.m_value.number_integer <= 0x17)
15154 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15156 else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())
15158 oa->write_character(to_char_type(0x18));
15159 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15161 else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())
15163 oa->write_character(to_char_type(0x19));
15164 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.number_integer));
15166 else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())
15168 oa->write_character(to_char_type(0x1A));
15169 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.number_integer));
15173 oa->write_character(to_char_type(0x1B));
15174 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.number_integer));
15181 const auto positive_number = -1 - j.m_data.m_value.number_integer;
15182 if (j.m_data.m_value.number_integer >= -24)
15184 write_number(
static_cast<std::uint8_t
>(0x20 + positive_number));
15186 else if (positive_number <= (std::numeric_limits<std::uint8_t>::max)())
15188 oa->write_character(to_char_type(0x38));
15189 write_number(
static_cast<std::uint8_t
>(positive_number));
15191 else if (positive_number <= (std::numeric_limits<std::uint16_t>::max)())
15193 oa->write_character(to_char_type(0x39));
15194 write_number(
static_cast<std::uint16_t
>(positive_number));
15196 else if (positive_number <= (std::numeric_limits<std::uint32_t>::max)())
15198 oa->write_character(to_char_type(0x3A));
15199 write_number(
static_cast<std::uint32_t
>(positive_number));
15203 oa->write_character(to_char_type(0x3B));
15204 write_number(
static_cast<std::uint64_t
>(positive_number));
15210 case value_t::number_unsigned:
15212 if (j.m_data.m_value.number_unsigned <= 0x17)
15214 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_unsigned));
15216 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
15218 oa->write_character(to_char_type(0x18));
15219 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_unsigned));
15221 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
15223 oa->write_character(to_char_type(0x19));
15224 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.number_unsigned));
15226 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
15228 oa->write_character(to_char_type(0x1A));
15229 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.number_unsigned));
15233 oa->write_character(to_char_type(0x1B));
15234 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.number_unsigned));
15239 case value_t::number_float:
15241 if (std::isnan(j.m_data.m_value.number_float))
15244 oa->write_character(to_char_type(0xF9));
15245 oa->write_character(to_char_type(0x7E));
15246 oa->write_character(to_char_type(0x00));
15248 else if (std::isinf(j.m_data.m_value.number_float))
15251 oa->write_character(to_char_type(0xf9));
15252 oa->write_character(j.m_data.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC));
15253 oa->write_character(to_char_type(0x00));
15262 case value_t::string:
15265 const auto N = j.m_data.m_value.string->size();
15268 write_number(
static_cast<std::uint8_t
>(0x60 + N));
15270 else if (N <= (std::numeric_limits<std::uint8_t>::max)())
15272 oa->write_character(to_char_type(0x78));
15273 write_number(
static_cast<std::uint8_t
>(N));
15275 else if (N <= (std::numeric_limits<std::uint16_t>::max)())
15277 oa->write_character(to_char_type(0x79));
15278 write_number(
static_cast<std::uint16_t
>(N));
15280 else if (N <= (std::numeric_limits<std::uint32_t>::max)())
15282 oa->write_character(to_char_type(0x7A));
15283 write_number(
static_cast<std::uint32_t
>(N));
15286 else if (N <= (std::numeric_limits<std::uint64_t>::max)())
15288 oa->write_character(to_char_type(0x7B));
15289 write_number(
static_cast<std::uint64_t
>(N));
15294 oa->write_characters(
15295 reinterpret_cast<const CharType*
>(j.m_data.m_value.string->c_str()),
15296 j.m_data.m_value.string->size());
15300 case value_t::array:
15303 const auto N = j.m_data.m_value.array->size();
15306 write_number(
static_cast<std::uint8_t
>(0x80 + N));
15308 else if (N <= (std::numeric_limits<std::uint8_t>::max)())
15310 oa->write_character(to_char_type(0x98));
15311 write_number(
static_cast<std::uint8_t
>(N));
15313 else if (N <= (std::numeric_limits<std::uint16_t>::max)())
15315 oa->write_character(to_char_type(0x99));
15316 write_number(
static_cast<std::uint16_t
>(N));
15318 else if (N <= (std::numeric_limits<std::uint32_t>::max)())
15320 oa->write_character(to_char_type(0x9A));
15321 write_number(
static_cast<std::uint32_t
>(N));
15324 else if (N <= (std::numeric_limits<std::uint64_t>::max)())
15326 oa->write_character(to_char_type(0x9B));
15327 write_number(
static_cast<std::uint64_t
>(N));
15332 for (
const auto& el : *j.m_data.m_value.array)
15339 case value_t::binary:
15341 if (j.m_data.m_value.binary->has_subtype())
15343 if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint8_t>::max)())
15345 write_number(
static_cast<std::uint8_t
>(0xd8));
15346 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.binary->subtype()));
15348 else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint16_t>::max)())
15350 write_number(
static_cast<std::uint8_t
>(0xd9));
15351 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.binary->subtype()));
15353 else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint32_t>::max)())
15355 write_number(
static_cast<std::uint8_t
>(0xda));
15356 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.binary->subtype()));
15358 else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint64_t>::max)())
15360 write_number(
static_cast<std::uint8_t
>(0xdb));
15361 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.binary->subtype()));
15366 const auto N = j.m_data.m_value.binary->size();
15369 write_number(
static_cast<std::uint8_t
>(0x40 + N));
15371 else if (N <= (std::numeric_limits<std::uint8_t>::max)())
15373 oa->write_character(to_char_type(0x58));
15374 write_number(
static_cast<std::uint8_t
>(N));
15376 else if (N <= (std::numeric_limits<std::uint16_t>::max)())
15378 oa->write_character(to_char_type(0x59));
15379 write_number(
static_cast<std::uint16_t
>(N));
15381 else if (N <= (std::numeric_limits<std::uint32_t>::max)())
15383 oa->write_character(to_char_type(0x5A));
15384 write_number(
static_cast<std::uint32_t
>(N));
15387 else if (N <= (std::numeric_limits<std::uint64_t>::max)())
15389 oa->write_character(to_char_type(0x5B));
15390 write_number(
static_cast<std::uint64_t
>(N));
15395 oa->write_characters(
15396 reinterpret_cast<const CharType*
>(j.m_data.m_value.binary->data()),
15402 case value_t::object:
15405 const auto N = j.m_data.m_value.object->size();
15408 write_number(
static_cast<std::uint8_t
>(0xA0 + N));
15410 else if (N <= (std::numeric_limits<std::uint8_t>::max)())
15412 oa->write_character(to_char_type(0xB8));
15413 write_number(
static_cast<std::uint8_t
>(N));
15415 else if (N <= (std::numeric_limits<std::uint16_t>::max)())
15417 oa->write_character(to_char_type(0xB9));
15418 write_number(
static_cast<std::uint16_t
>(N));
15420 else if (N <= (std::numeric_limits<std::uint32_t>::max)())
15422 oa->write_character(to_char_type(0xBA));
15423 write_number(
static_cast<std::uint32_t
>(N));
15426 else if (N <= (std::numeric_limits<std::uint64_t>::max)())
15428 oa->write_character(to_char_type(0xBB));
15429 write_number(
static_cast<std::uint64_t
>(N));
15434 for (
const auto& el : *j.m_data.m_value.object)
15436 write_cbor(el.first);
15437 write_cbor(el.second);
15442 case value_t::discarded:
15455 case value_t::null:
15457 oa->write_character(to_char_type(0xC0));
15461 case value_t::boolean:
15463 oa->write_character(j.m_data.m_value.boolean
15464 ? to_char_type(0xC3)
15465 : to_char_type(0xC2));
15469 case value_t::number_integer:
15471 if (j.m_data.m_value.number_integer >= 0)
15476 if (j.m_data.m_value.number_unsigned < 128)
15479 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15481 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
15484 oa->write_character(to_char_type(0xCC));
15485 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15487 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
15490 oa->write_character(to_char_type(0xCD));
15491 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.number_integer));
15493 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
15496 oa->write_character(to_char_type(0xCE));
15497 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.number_integer));
15499 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
15502 oa->write_character(to_char_type(0xCF));
15503 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.number_integer));
15508 if (j.m_data.m_value.number_integer >= -32)
15511 write_number(
static_cast<std::int8_t
>(j.m_data.m_value.number_integer));
15513 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() &&
15514 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())
15517 oa->write_character(to_char_type(0xD0));
15518 write_number(
static_cast<std::int8_t
>(j.m_data.m_value.number_integer));
15520 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() &&
15521 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())
15524 oa->write_character(to_char_type(0xD1));
15525 write_number(
static_cast<std::int16_t
>(j.m_data.m_value.number_integer));
15527 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() &&
15528 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())
15531 oa->write_character(to_char_type(0xD2));
15532 write_number(
static_cast<std::int32_t
>(j.m_data.m_value.number_integer));
15534 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() &&
15535 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())
15538 oa->write_character(to_char_type(0xD3));
15539 write_number(
static_cast<std::int64_t
>(j.m_data.m_value.number_integer));
15545 case value_t::number_unsigned:
15547 if (j.m_data.m_value.number_unsigned < 128)
15550 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15552 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
15555 oa->write_character(to_char_type(0xCC));
15556 write_number(
static_cast<std::uint8_t
>(j.m_data.m_value.number_integer));
15558 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
15561 oa->write_character(to_char_type(0xCD));
15562 write_number(
static_cast<std::uint16_t
>(j.m_data.m_value.number_integer));
15564 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
15567 oa->write_character(to_char_type(0xCE));
15568 write_number(
static_cast<std::uint32_t
>(j.m_data.m_value.number_integer));
15570 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
15573 oa->write_character(to_char_type(0xCF));
15574 write_number(
static_cast<std::uint64_t
>(j.m_data.m_value.number_integer));
15579 case value_t::number_float:
15585 case value_t::string:
15588 const auto N = j.m_data.m_value.string->size();
15592 write_number(
static_cast<std::uint8_t
>(0xA0 | N));
15594 else if (N <= (std::numeric_limits<std::uint8_t>::max)())
15597 oa->write_character(to_char_type(0xD9));
15598 write_number(
static_cast<std::uint8_t
>(N));
15600 else if (N <= (std::numeric_limits<std::uint16_t>::max)())
15603 oa->write_character(to_char_type(0xDA));
15604 write_number(
static_cast<std::uint16_t
>(N));
15606 else if (N <= (std::numeric_limits<std::uint32_t>::max)())
15609 oa->write_character(to_char_type(0xDB));
15610 write_number(
static_cast<std::uint32_t
>(N));
15614 oa->write_characters(
15615 reinterpret_cast<const CharType*
>(j.m_data.m_value.string->c_str()),
15616 j.m_data.m_value.string->size());
15620 case value_t::array:
15623 const auto N = j.m_data.m_value.array->size();
15627 write_number(
static_cast<std::uint8_t
>(0x90 | N));
15629 else if (N <= (std::numeric_limits<std::uint16_t>::max)())
15632 oa->write_character(to_char_type(0xDC));
15633 write_number(
static_cast<std::uint16_t
>(N));
15635 else if (N <= (std::numeric_limits<std::uint32_t>::max)())
15638 oa->write_character(to_char_type(0xDD));
15639 write_number(
static_cast<std::uint32_t
>(N));
15643 for (
const auto& el : *j.m_data.m_value.array)
15650 case value_t::binary:
15654 const bool use_ext = j.m_data.m_value.binary->has_subtype();
15657 const auto N = j.m_data.m_value.binary->size();
15658 if (N <= (std::numeric_limits<std::uint8_t>::max)())
15660 std::uint8_t output_type{};
15667 output_type = 0xD4;
15670 output_type = 0xD5;
15673 output_type = 0xD6;
15676 output_type = 0xD7;
15679 output_type = 0xD8;
15682 output_type = 0xC7;
15690 output_type = 0xC4;
15694 oa->write_character(to_char_type(output_type));
15697 write_number(
static_cast<std::uint8_t
>(N));
15700 else if (N <= (std::numeric_limits<std::uint16_t>::max)())
15702 const std::uint8_t output_type = use_ext
15706 oa->write_character(to_char_type(output_type));
15707 write_number(
static_cast<std::uint16_t
>(N));
15709 else if (N <= (std::numeric_limits<std::uint32_t>::max)())
15711 const std::uint8_t output_type = use_ext
15715 oa->write_character(to_char_type(output_type));
15716 write_number(
static_cast<std::uint32_t
>(N));
15722 write_number(
static_cast<std::int8_t
>(j.m_data.m_value.binary->subtype()));
15726 oa->write_characters(
15727 reinterpret_cast<const CharType*
>(j.m_data.m_value.binary->data()),
15733 case value_t::object:
15736 const auto N = j.m_data.m_value.object->size();
15740 write_number(
static_cast<std::uint8_t
>(0x80 | (N & 0xF)));
15742 else if (N <= (std::numeric_limits<std::uint16_t>::max)())
15745 oa->write_character(to_char_type(0xDE));
15746 write_number(
static_cast<std::uint16_t
>(N));
15748 else if (N <= (std::numeric_limits<std::uint32_t>::max)())
15751 oa->write_character(to_char_type(0xDF));
15752 write_number(
static_cast<std::uint32_t
>(N));
15756 for (
const auto& el : *j.m_data.m_value.object)
15758 write_msgpack(el.first);
15759 write_msgpack(el.second);
15764 case value_t::discarded:
15778 const bool use_type,
const bool add_prefix =
true,
15779 const bool use_bjdata =
false)
15783 case value_t::null:
15787 oa->write_character(to_char_type(
'Z'));
15792 case value_t::boolean:
15796 oa->write_character(j.m_data.m_value.boolean
15797 ? to_char_type(
'T')
15798 : to_char_type(
'F'));
15803 case value_t::number_integer:
15805 write_number_with_ubjson_prefix(j.m_data.m_value.number_integer, add_prefix, use_bjdata);
15809 case value_t::number_unsigned:
15811 write_number_with_ubjson_prefix(j.m_data.m_value.number_unsigned, add_prefix, use_bjdata);
15815 case value_t::number_float:
15817 write_number_with_ubjson_prefix(j.m_data.m_value.number_float, add_prefix, use_bjdata);
15821 case value_t::string:
15825 oa->write_character(to_char_type(
'S'));
15827 write_number_with_ubjson_prefix(j.m_data.m_value.string->size(),
true, use_bjdata);
15828 oa->write_characters(
15829 reinterpret_cast<const CharType*
>(j.m_data.m_value.string->c_str()),
15830 j.m_data.m_value.string->size());
15834 case value_t::array:
15838 oa->write_character(to_char_type(
'['));
15841 bool prefix_required =
true;
15842 if (use_type && !j.m_data.m_value.array->empty())
15845 const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata);
15846 const bool same_prefix = std::all_of(j.begin() + 1, j.end(),
15847 [
this, first_prefix, use_bjdata](
const BasicJsonType& v)
15849 return ubjson_prefix(v, use_bjdata) == first_prefix;
15852 std::vector<CharType> bjdx = {
'[',
'{',
'S',
'H',
'T',
'F',
'N',
'Z' };
15854 if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end()))
15856 prefix_required =
false;
15857 oa->write_character(to_char_type(
'$'));
15858 oa->write_character(first_prefix);
15864 oa->write_character(to_char_type(
'#'));
15865 write_number_with_ubjson_prefix(j.m_data.m_value.array->size(),
true, use_bjdata);
15868 for (
const auto& el : *j.m_data.m_value.array)
15870 write_ubjson(el, use_count, use_type, prefix_required, use_bjdata);
15875 oa->write_character(to_char_type(
']'));
15881 case value_t::binary:
15885 oa->write_character(to_char_type(
'['));
15888 if (use_type && !j.m_data.m_value.binary->empty())
15891 oa->write_character(to_char_type(
'$'));
15892 oa->write_character(
'U');
15897 oa->write_character(to_char_type(
'#'));
15898 write_number_with_ubjson_prefix(j.m_data.m_value.binary->size(),
true, use_bjdata);
15903 oa->write_characters(
15904 reinterpret_cast<const CharType*
>(j.m_data.m_value.binary->data()),
15905 j.m_data.m_value.binary->size());
15909 for (
size_t i = 0; i < j.m_data.m_value.binary->size(); ++i)
15911 oa->write_character(to_char_type(
'U'));
15912 oa->write_character(j.m_data.m_value.binary->data()[i]);
15918 oa->write_character(to_char_type(
']'));
15924 case value_t::object:
15926 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())
15928 if (!write_bjdata_ndarray(*j.m_data.m_value.object, use_count, use_type))
15936 oa->write_character(to_char_type(
'{'));
15939 bool prefix_required =
true;
15940 if (use_type && !j.m_data.m_value.object->empty())
15943 const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata);
15944 const bool same_prefix = std::all_of(j.begin(), j.end(),
15945 [
this, first_prefix, use_bjdata](
const BasicJsonType& v)
15947 return ubjson_prefix(v, use_bjdata) == first_prefix;
15950 std::vector<CharType> bjdx = {
'[',
'{',
'S',
'H',
'T',
'F',
'N',
'Z' };
15952 if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end()))
15954 prefix_required =
false;
15955 oa->write_character(to_char_type(
'$'));
15956 oa->write_character(first_prefix);
15962 oa->write_character(to_char_type(
'#'));
15963 write_number_with_ubjson_prefix(j.m_data.m_value.object->size(),
true, use_bjdata);
15966 for (
const auto& el : *j.m_data.m_value.object)
15968 write_number_with_ubjson_prefix(el.first.size(),
true, use_bjdata);
15969 oa->write_characters(
15970 reinterpret_cast<const CharType*
>(el.first.c_str()),
15972 write_ubjson(el.second, use_count, use_type, prefix_required, use_bjdata);
15977 oa->write_character(to_char_type(
'}'));
15983 case value_t::discarded:
15998 static std::size_t calc_bson_entry_header_size(
const string_t& name,
const BasicJsonType& j)
16000 const auto it = name.find(
static_cast<typename string_t::value_type
>(0));
16004 static_cast<void>(j);
16007 return 1ul + name.size() + 1u;
16013 void write_bson_entry_header(
const string_t& name,
16014 const std::uint8_t element_type)
16016 oa->write_character(to_char_type(element_type));
16017 oa->write_characters(
16018 reinterpret_cast<const CharType*
>(name.c_str()),
16025 void write_bson_boolean(
const string_t& name,
16028 write_bson_entry_header(name, 0x08);
16029 oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00));
16035 void write_bson_double(
const string_t& name,
16036 const double value)
16038 write_bson_entry_header(name, 0x01);
16039 write_number<double>(value,
true);
16045 static std::size_t calc_bson_string_size(
const string_t& value)
16047 return sizeof(std::int32_t) +
value.size() + 1ul;
16053 void write_bson_string(
const string_t& name,
16054 const string_t& value)
16056 write_bson_entry_header(name, 0x02);
16058 write_number<std::int32_t>(
static_cast<std::int32_t
>(
value.size() + 1ul),
true);
16059 oa->write_characters(
16060 reinterpret_cast<const CharType*
>(
value.c_str()),
16067 void write_bson_null(
const string_t& name)
16069 write_bson_entry_header(name, 0x0A);
16075 static std::size_t calc_bson_integer_size(
const std::int64_t value)
16077 return (std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)()
16078 ?
sizeof(std::int32_t)
16079 :
sizeof(std::int64_t);
16085 void write_bson_integer(
const string_t& name,
16086 const std::int64_t value)
16088 if ((std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)())
16090 write_bson_entry_header(name, 0x10);
16091 write_number<std::int32_t>(
static_cast<std::int32_t
>(value),
true);
16095 write_bson_entry_header(name, 0x12);
16096 write_number<std::int64_t>(
static_cast<std::int64_t
>(value),
true);
16103 static constexpr std::size_t calc_bson_unsigned_size(
const std::uint64_t value) noexcept
16105 return (value <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int32_t>::max)()))
16106 ?
sizeof(std::int32_t)
16107 :
sizeof(std::int64_t);
16113 void write_bson_unsigned(
const string_t& name,
16114 const BasicJsonType& j)
16116 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int32_t>::max)()))
16118 write_bson_entry_header(name, 0x10 );
16119 write_number<std::int32_t>(
static_cast<std::int32_t
>(j.m_data.m_value.number_unsigned),
true);
16121 else if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int64_t>::max)()))
16123 write_bson_entry_header(name, 0x12 );
16124 write_number<std::int64_t>(
static_cast<std::int64_t
>(j.m_data.m_value.number_unsigned),
true);
16128 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));
16135 void write_bson_object_entry(
const string_t& name,
16136 const typename BasicJsonType::object_t& value)
16138 write_bson_entry_header(name, 0x03);
16139 write_bson_object(value);
16145 static std::size_t calc_bson_array_size(
const typename BasicJsonType::array_t& value)
16147 std::size_t array_index = 0ul;
16149 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)
16151 return result + calc_bson_element_size(
std::to_string(array_index++), el);
16154 return sizeof(std::int32_t) + embedded_document_size + 1ul;
16160 static std::size_t calc_bson_binary_size(
const typename BasicJsonType::binary_t& value)
16162 return sizeof(std::int32_t) +
value.size() + 1ul;
16168 void write_bson_array(
const string_t& name,
16169 const typename BasicJsonType::array_t& value)
16171 write_bson_entry_header(name, 0x04);
16172 write_number<std::int32_t>(
static_cast<std::int32_t
>(calc_bson_array_size(value)),
true);
16174 std::size_t array_index = 0ul;
16176 for (
const auto& el : value)
16181 oa->write_character(to_char_type(0x00));
16187 void write_bson_binary(
const string_t& name,
16188 const binary_t& value)
16190 write_bson_entry_header(name, 0x05);
16192 write_number<std::int32_t>(
static_cast<std::int32_t
>(
value.size()),
true);
16193 write_number(
value.has_subtype() ?
static_cast<std::uint8_t
>(
value.subtype()) :
static_cast<std::uint8_t
>(0x00));
16195 oa->write_characters(
reinterpret_cast<const CharType*
>(
value.data()),
value.size());
16202 static std::size_t calc_bson_element_size(
const string_t& name,
16203 const BasicJsonType& j)
16205 const auto header_size = calc_bson_entry_header_size(name, j);
16208 case value_t::object:
16209 return header_size + calc_bson_object_size(*j.m_data.m_value.object);
16211 case value_t::array:
16212 return header_size + calc_bson_array_size(*j.m_data.m_value.array);
16214 case value_t::binary:
16215 return header_size + calc_bson_binary_size(*j.m_data.m_value.binary);
16217 case value_t::boolean:
16218 return header_size + 1ul;
16220 case value_t::number_float:
16221 return header_size + 8ul;
16223 case value_t::number_integer:
16224 return header_size + calc_bson_integer_size(j.m_data.m_value.number_integer);
16226 case value_t::number_unsigned:
16227 return header_size + calc_bson_unsigned_size(j.m_data.m_value.number_unsigned);
16229 case value_t::string:
16230 return header_size + calc_bson_string_size(*j.m_data.m_value.string);
16232 case value_t::null:
16233 return header_size + 0ul;
16236 case value_t::discarded:
16250 void write_bson_element(
const string_t& name,
16251 const BasicJsonType& j)
16255 case value_t::object:
16256 return write_bson_object_entry(name, *j.m_data.m_value.object);
16258 case value_t::array:
16259 return write_bson_array(name, *j.m_data.m_value.array);
16261 case value_t::binary:
16262 return write_bson_binary(name, *j.m_data.m_value.binary);
16264 case value_t::boolean:
16265 return write_bson_boolean(name, j.m_data.m_value.boolean);
16267 case value_t::number_float:
16268 return write_bson_double(name, j.m_data.m_value.number_float);
16270 case value_t::number_integer:
16271 return write_bson_integer(name, j.m_data.m_value.number_integer);
16273 case value_t::number_unsigned:
16274 return write_bson_unsigned(name, j);
16276 case value_t::string:
16277 return write_bson_string(name, *j.m_data.m_value.string);
16279 case value_t::null:
16280 return write_bson_null(name);
16283 case value_t::discarded:
16297 static std::size_t calc_bson_object_size(
const typename BasicJsonType::object_t& value)
16299 const std::size_t document_size = std::accumulate(
value.begin(),
value.end(),
static_cast<std::size_t
>(0),
16300 [](
size_t result,
const typename BasicJsonType::object_t::value_type& el)
16302 return result += calc_bson_element_size(el.first, el.second);
16305 return sizeof(std::int32_t) + document_size + 1ul;
16312 void write_bson_object(
const typename BasicJsonType::object_t& value)
16314 write_number<std::int32_t>(
static_cast<std::int32_t
>(calc_bson_object_size(value)),
true);
16316 for (
const auto& el : value)
16318 write_bson_element(el.first, el.second);
16321 oa->write_character(to_char_type(0x00));
16328 static constexpr CharType get_cbor_float_prefix(
float )
16330 return to_char_type(0xFA);
16333 static constexpr CharType get_cbor_float_prefix(
double )
16335 return to_char_type(0xFB);
16342 static constexpr CharType get_msgpack_float_prefix(
float )
16344 return to_char_type(0xCA);
16347 static constexpr CharType get_msgpack_float_prefix(
double )
16349 return to_char_type(0xCB);
16357 template<
typename NumberType,
typename std::enable_if<
16358 std::is_floating_point<NumberType>::value,
int>::type = 0>
16359 void write_number_with_ubjson_prefix(
const NumberType n,
16360 const bool add_prefix,
16361 const bool use_bjdata)
16365 oa->write_character(get_ubjson_float_prefix(n));
16367 write_number(n, use_bjdata);
16371 template<
typename NumberType,
typename std::enable_if<
16372 std::is_unsigned<NumberType>::value,
int>::type = 0>
16373 void write_number_with_ubjson_prefix(
const NumberType n,
16374 const bool add_prefix,
16375 const bool use_bjdata)
16377 if (n <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int8_t>::max)()))
16381 oa->write_character(to_char_type(
'i'));
16383 write_number(
static_cast<std::uint8_t
>(n), use_bjdata);
16385 else if (n <= (std::numeric_limits<std::uint8_t>::max)())
16389 oa->write_character(to_char_type(
'U'));
16391 write_number(
static_cast<std::uint8_t
>(n), use_bjdata);
16393 else if (n <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int16_t>::max)()))
16397 oa->write_character(to_char_type(
'I'));
16399 write_number(
static_cast<std::int16_t
>(n), use_bjdata);
16401 else if (use_bjdata && n <=
static_cast<uint64_t
>((std::numeric_limits<uint16_t>::max)()))
16405 oa->write_character(to_char_type(
'u'));
16407 write_number(
static_cast<std::uint16_t
>(n), use_bjdata);
16409 else if (n <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int32_t>::max)()))
16413 oa->write_character(to_char_type(
'l'));
16415 write_number(
static_cast<std::int32_t
>(n), use_bjdata);
16417 else if (use_bjdata && n <=
static_cast<uint64_t
>((std::numeric_limits<uint32_t>::max)()))
16421 oa->write_character(to_char_type(
'm'));
16423 write_number(
static_cast<std::uint32_t
>(n), use_bjdata);
16425 else if (n <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int64_t>::max)()))
16429 oa->write_character(to_char_type(
'L'));
16431 write_number(
static_cast<std::int64_t
>(n), use_bjdata);
16433 else if (use_bjdata && n <= (std::numeric_limits<uint64_t>::max)())
16437 oa->write_character(to_char_type(
'M'));
16439 write_number(
static_cast<std::uint64_t
>(n), use_bjdata);
16445 oa->write_character(to_char_type(
'H'));
16448 const auto number = BasicJsonType(n).dump();
16449 write_number_with_ubjson_prefix(number.size(),
true, use_bjdata);
16450 for (std::size_t i = 0; i < number.size(); ++i)
16452 oa->write_character(to_char_type(
static_cast<std::uint8_t
>(number[i])));
16458 template <
typename NumberType,
typename std::enable_if <
16459 std::is_signed<NumberType>::value &&
16460 !std::is_floating_point<NumberType>::value,
int >::type = 0 >
16461 void write_number_with_ubjson_prefix(
const NumberType n,
16462 const bool add_prefix,
16463 const bool use_bjdata)
16465 if ((std::numeric_limits<std::int8_t>::min)() <= n && n <= (std::numeric_limits<std::int8_t>::max)())
16469 oa->write_character(to_char_type(
'i'));
16471 write_number(
static_cast<std::int8_t
>(n), use_bjdata);
16473 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)()))
16477 oa->write_character(to_char_type(
'U'));
16479 write_number(
static_cast<std::uint8_t
>(n), use_bjdata);
16481 else if ((std::numeric_limits<std::int16_t>::min)() <= n && n <= (std::numeric_limits<std::int16_t>::max)())
16485 oa->write_character(to_char_type(
'I'));
16487 write_number(
static_cast<std::int16_t
>(n), use_bjdata);
16489 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)())))
16493 oa->write_character(to_char_type(
'u'));
16495 write_number(
static_cast<uint16_t
>(n), use_bjdata);
16497 else if ((std::numeric_limits<std::int32_t>::min)() <= n && n <= (std::numeric_limits<std::int32_t>::max)())
16501 oa->write_character(to_char_type(
'l'));
16503 write_number(
static_cast<std::int32_t
>(n), use_bjdata);
16505 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)())))
16509 oa->write_character(to_char_type(
'm'));
16511 write_number(
static_cast<uint32_t
>(n), use_bjdata);
16513 else if ((std::numeric_limits<std::int64_t>::min)() <= n && n <= (std::numeric_limits<std::int64_t>::max)())
16517 oa->write_character(to_char_type(
'L'));
16519 write_number(
static_cast<std::int64_t
>(n), use_bjdata);
16526 oa->write_character(to_char_type(
'H'));
16529 const auto number = BasicJsonType(n).dump();
16530 write_number_with_ubjson_prefix(number.size(),
true, use_bjdata);
16531 for (std::size_t i = 0; i < number.size(); ++i)
16533 oa->write_character(to_char_type(
static_cast<std::uint8_t
>(number[i])));
16542 CharType ubjson_prefix(
const BasicJsonType& j,
const bool use_bjdata)
const noexcept
16546 case value_t::null:
16549 case value_t::boolean:
16550 return j.m_data.m_value.boolean ?
'T' :
'F';
16552 case value_t::number_integer:
16554 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)())
16558 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)())
16562 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)())
16566 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)()))
16570 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)())
16574 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)()))
16578 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)())
16586 case value_t::number_unsigned:
16588 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int8_t>::max)()))
16592 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::uint8_t>::max)()))
16596 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int16_t>::max)()))
16600 if (use_bjdata && j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::uint16_t>::max)()))
16604 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int32_t>::max)()))
16608 if (use_bjdata && j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::uint32_t>::max)()))
16612 if (j.m_data.m_value.number_unsigned <=
static_cast<std::uint64_t
>((std::numeric_limits<std::int64_t>::max)()))
16616 if (use_bjdata && j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
16624 case value_t::number_float:
16625 return get_ubjson_float_prefix(j.m_data.m_value.number_float);
16627 case value_t::string:
16630 case value_t::array:
16631 case value_t::binary:
16634 case value_t::object:
16637 case value_t::discarded:
16643 static constexpr CharType get_ubjson_float_prefix(
float )
16648 static constexpr CharType get_ubjson_float_prefix(
double )
16656 bool write_bjdata_ndarray(
const typename BasicJsonType::object_t& value,
const bool use_count,
const bool use_type)
16658 std::map<string_t, CharType> bjdtype = { {
"uint8",
'U'}, {
"int8",
'i'}, {
"uint16",
'u'}, {
"int16",
'I'},
16659 {
"uint32",
'm'}, {
"int32",
'l'}, {
"uint64",
'M'}, {
"int64",
'L'}, {
"single",
'd'}, {
"double",
'D'}, {
"char",
'C'}
16662 string_t
key =
"_ArrayType_";
16663 auto it = bjdtype.find(
static_cast<string_t
>(
value.at(key)));
16664 if (it == bjdtype.end())
16668 CharType dtype = it->second;
16670 key =
"_ArraySize_";
16671 std::size_t len = (
value.at(key).empty() ? 0 : 1);
16672 for (
const auto& el :
value.at(key))
16674 len *=
static_cast<std::size_t
>(el.m_data.m_value.number_unsigned);
16677 key =
"_ArrayData_";
16678 if (
value.at(key).size() != len)
16683 oa->write_character(
'[');
16684 oa->write_character(
'$');
16685 oa->write_character(dtype);
16686 oa->write_character(
'#');
16688 key =
"_ArraySize_";
16689 write_ubjson(
value.at(key), use_count, use_type,
true,
true);
16691 key =
"_ArrayData_";
16692 if (dtype ==
'U' || dtype ==
'C')
16694 for (
const auto& el :
value.at(key))
16696 write_number(
static_cast<std::uint8_t
>(el.m_data.m_value.number_unsigned),
true);
16699 else if (dtype ==
'i')
16701 for (
const auto& el :
value.at(key))
16703 write_number(
static_cast<std::int8_t
>(el.m_data.m_value.number_integer),
true);
16706 else if (dtype ==
'u')
16708 for (
const auto& el :
value.at(key))
16710 write_number(
static_cast<std::uint16_t
>(el.m_data.m_value.number_unsigned),
true);
16713 else if (dtype ==
'I')
16715 for (
const auto& el :
value.at(key))
16717 write_number(
static_cast<std::int16_t
>(el.m_data.m_value.number_integer),
true);
16720 else if (dtype ==
'm')
16722 for (
const auto& el :
value.at(key))
16724 write_number(
static_cast<std::uint32_t
>(el.m_data.m_value.number_unsigned),
true);
16727 else if (dtype ==
'l')
16729 for (
const auto& el :
value.at(key))
16731 write_number(
static_cast<std::int32_t
>(el.m_data.m_value.number_integer),
true);
16734 else if (dtype ==
'M')
16736 for (
const auto& el :
value.at(key))
16738 write_number(
static_cast<std::uint64_t
>(el.m_data.m_value.number_unsigned),
true);
16741 else if (dtype ==
'L')
16743 for (
const auto& el :
value.at(key))
16745 write_number(
static_cast<std::int64_t
>(el.m_data.m_value.number_integer),
true);
16748 else if (dtype ==
'd')
16750 for (
const auto& el :
value.at(key))
16752 write_number(
static_cast<float>(el.m_data.m_value.number_float),
true);
16755 else if (dtype ==
'D')
16757 for (
const auto& el :
value.at(key))
16759 write_number(
static_cast<double>(el.m_data.m_value.number_float),
true);
16782 template<
typename NumberType>
16783 void write_number(
const NumberType n,
const bool OutputIsLittleEndian =
false)
16786 std::array<CharType,
sizeof(NumberType)> vec{};
16787 std::memcpy(vec.data(), &n,
sizeof(NumberType));
16790 if (is_little_endian != OutputIsLittleEndian)
16793 std::reverse(vec.begin(), vec.end());
16796 oa->write_characters(vec.data(),
sizeof(NumberType));
16802 #pragma GCC diagnostic push
16803 #pragma GCC diagnostic ignored "-Wfloat-equal"
16805 if (
static_cast<double>(n) >=
static_cast<double>(std::numeric_limits<float>::lowest()) &&
16806 static_cast<double>(n) <=
static_cast<double>((std::numeric_limits<float>::max)()) &&
16807 static_cast<double>(
static_cast<float>(n)) ==
static_cast<double>(n))
16810 ? get_cbor_float_prefix(
static_cast<float>(n))
16811 : get_msgpack_float_prefix(
static_cast<float>(n)));
16812 write_number(
static_cast<float>(n));
16817 ? get_cbor_float_prefix(n)
16818 : get_msgpack_float_prefix(n));
16822 #pragma GCC diagnostic pop
16831 template <
typename C = CharType,
16832 enable_if_t < std::is_signed<C>::value&& std::is_signed<char>::value >* =
nullptr >
16835 return *
reinterpret_cast<char*
>(&x);
16838 template <
typename C = CharType,
16842 static_assert(
sizeof(std::uint8_t) ==
sizeof(CharType),
"size of CharType must be equal to std::uint8_t");
16843 static_assert(std::is_trivial<CharType>::value,
"CharType must be trivial");
16845 std::memcpy(&result, &x,
sizeof(x));
16849 template<
typename C = CharType,
16856 template <
typename InputCharType,
typename C = CharType,
16858 std::is_signed<C>::value&&
16859 std::is_signed<char>::value&&
16860 std::is_same<char, typename std::remove_cv<InputCharType>::type>::value
16869 const bool is_little_endian = little_endianness();
16892 #include <algorithm>
16902 #include <type_traits>
16922 #include <type_traits>
16950 namespace dtoa_impl
16953 template<
typename Target,
typename Source>
16956 static_assert(
sizeof(Target) ==
sizeof(Source),
"size mismatch");
16959 std::memcpy(&target, &source,
sizeof(Source));
16970 constexpr
diyfp(std::uint64_t f_,
int e_) noexcept :
f(f_),
e(e_) {}
16981 return { x.f - y.f, x.e };
16990 static_assert(
kPrecision == 64,
"internal error");
17015 const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;
17016 const std::uint64_t u_hi = x.f >> 32u;
17017 const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;
17018 const std::uint64_t v_hi = y.f >> 32u;
17020 const std::uint64_t p0 = u_lo * v_lo;
17021 const std::uint64_t p1 = u_lo * v_hi;
17022 const std::uint64_t p2 = u_hi * v_lo;
17023 const std::uint64_t p3 = u_hi * v_hi;
17025 const std::uint64_t p0_hi = p0 >> 32u;
17026 const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu;
17027 const std::uint64_t p1_hi = p1 >> 32u;
17028 const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu;
17029 const std::uint64_t p2_hi = p2 >> 32u;
17031 std::uint64_t Q = p0_hi + p1_lo + p2_lo;
17042 Q += std::uint64_t{ 1 } << (64u - 32u - 1u);
17044 const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u);
17046 return { h, x.e + y.e + 64 };
17057 while ((x.f >> 63u) == 0)
17072 const int delta = x.
e - target_exponent;
17077 return { x.f << delta, target_exponent };
17094 template<
typename FloatType>
17107 static_assert(std::numeric_limits<FloatType>::is_iec559,
17108 "internal error: dtoa_short requires an IEEE-754 floating-point implementation");
17110 constexpr
int kPrecision = std::numeric_limits<FloatType>::digits;
17111 constexpr
int kBias = std::numeric_limits<FloatType>::max_exponent - 1 + (kPrecision - 1);
17112 constexpr
int kMinExp = 1 - kBias;
17113 constexpr std::uint64_t kHiddenBit = std::uint64_t{ 1 } << (kPrecision - 1);
17115 using bits_type =
typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;
17117 const auto bits =
static_cast<std::uint64_t
>(reinterpret_bits<bits_type>(
value));
17118 const std::uint64_t E = bits >> (kPrecision - 1);
17119 const std::uint64_t F = bits & (kHiddenBit - 1);
17121 const bool is_denormal = E == 0;
17122 const diyfp v = is_denormal
17123 ?
diyfp(F, kMinExp)
17124 :
diyfp(F + kHiddenBit,
static_cast<int>(E) - kBias);
17147 const bool lower_boundary_is_closer = F == 0 && E > 1;
17149 const diyfp m_minus = lower_boundary_is_closer
17150 ?
diyfp(4 * v.
f - 1, v.
e - 2)
17151 :
diyfp(2 * v.
f - 1, v.
e - 1);
17286 constexpr
int kCachedPowersMinDecExp = -300;
17287 constexpr
int kCachedPowersDecStep = 8;
17289 static constexpr std::array<cached_power, 79> kCachedPowers =
17292 { 0xAB70FE17C79AC6CA, -1060, -300 },
17293 { 0xFF77B1FCBEBCDC4F, -1034, -292 },
17294 { 0xBE5691EF416BD60C, -1007, -284 },
17295 { 0x8DD01FAD907FFC3C, -980, -276 },
17296 { 0xD3515C2831559A83, -954, -268 },
17297 { 0x9D71AC8FADA6C9B5, -927, -260 },
17298 { 0xEA9C227723EE8BCB, -901, -252 },
17299 { 0xAECC49914078536D, -874, -244 },
17300 { 0x823C12795DB6CE57, -847, -236 },
17301 { 0xC21094364DFB5637, -821, -228 },
17302 { 0x9096EA6F3848984F, -794, -220 },
17303 { 0xD77485CB25823AC7, -768, -212 },
17304 { 0xA086CFCD97BF97F4, -741, -204 },
17305 { 0xEF340A98172AACE5, -715, -196 },
17306 { 0xB23867FB2A35B28E, -688, -188 },
17307 { 0x84C8D4DFD2C63F3B, -661, -180 },
17308 { 0xC5DD44271AD3CDBA, -635, -172 },
17309 { 0x936B9FCEBB25C996, -608, -164 },
17310 { 0xDBAC6C247D62A584, -582, -156 },
17311 { 0xA3AB66580D5FDAF6, -555, -148 },
17312 { 0xF3E2F893DEC3F126, -529, -140 },
17313 { 0xB5B5ADA8AAFF80B8, -502, -132 },
17314 { 0x87625F056C7C4A8B, -475, -124 },
17315 { 0xC9BCFF6034C13053, -449, -116 },
17316 { 0x964E858C91BA2655, -422, -108 },
17317 { 0xDFF9772470297EBD, -396, -100 },
17318 { 0xA6DFBD9FB8E5B88F, -369, -92 },
17319 { 0xF8A95FCF88747D94, -343, -84 },
17320 { 0xB94470938FA89BCF, -316, -76 },
17321 { 0x8A08F0F8BF0F156B, -289, -68 },
17322 { 0xCDB02555653131B6, -263, -60 },
17323 { 0x993FE2C6D07B7FAC, -236, -52 },
17324 { 0xE45C10C42A2B3B06, -210, -44 },
17325 { 0xAA242499697392D3, -183, -36 },
17326 { 0xFD87B5F28300CA0E, -157, -28 },
17327 { 0xBCE5086492111AEB, -130, -20 },
17328 { 0x8CBCCC096F5088CC, -103, -12 },
17329 { 0xD1B71758E219652C, -77, -4 },
17330 { 0x9C40000000000000, -50, 4 },
17331 { 0xE8D4A51000000000, -24, 12 },
17332 { 0xAD78EBC5AC620000, 3, 20 },
17333 { 0x813F3978F8940984, 30, 28 },
17334 { 0xC097CE7BC90715B3, 56, 36 },
17335 { 0x8F7E32CE7BEA5C70, 83, 44 },
17336 { 0xD5D238A4ABE98068, 109, 52 },
17337 { 0x9F4F2726179A2245, 136, 60 },
17338 { 0xED63A231D4C4FB27, 162, 68 },
17339 { 0xB0DE65388CC8ADA8, 189, 76 },
17340 { 0x83C7088E1AAB65DB, 216, 84 },
17341 { 0xC45D1DF942711D9A, 242, 92 },
17342 { 0x924D692CA61BE758, 269, 100 },
17343 { 0xDA01EE641A708DEA, 295, 108 },
17344 { 0xA26DA3999AEF774A, 322, 116 },
17345 { 0xF209787BB47D6B85, 348, 124 },
17346 { 0xB454E4A179DD1877, 375, 132 },
17347 { 0x865B86925B9BC5C2, 402, 140 },
17348 { 0xC83553C5C8965D3D, 428, 148 },
17349 { 0x952AB45CFA97A0B3, 455, 156 },
17350 { 0xDE469FBD99A05FE3, 481, 164 },
17351 { 0xA59BC234DB398C25, 508, 172 },
17352 { 0xF6C69A72A3989F5C, 534, 180 },
17353 { 0xB7DCBF5354E9BECE, 561, 188 },
17354 { 0x88FCF317F22241E2, 588, 196 },
17355 { 0xCC20CE9BD35C78A5, 614, 204 },
17356 { 0x98165AF37B2153DF, 641, 212 },
17357 { 0xE2A0B5DC971F303A, 667, 220 },
17358 { 0xA8D9D1535CE3B396, 694, 228 },
17359 { 0xFB9B7CD9A4A7443C, 720, 236 },
17360 { 0xBB764C4CA7A44410, 747, 244 },
17361 { 0x8BAB8EEFB6409C1A, 774, 252 },
17362 { 0xD01FEF10A657842C, 800, 260 },
17363 { 0x9B10A4E5E9913129, 827, 268 },
17364 { 0xE7109BFBA19C0C9D, 853, 276 },
17365 { 0xAC2820D9623BF429, 880, 284 },
17366 { 0x80444B5E7AA7CF85, 907, 292 },
17367 { 0xBF21E44003ACDD2D, 933, 300 },
17368 { 0x8E679C2F5E44FF8F, 960, 308 },
17369 { 0xD433179D9C8CB841, 986, 316 },
17370 { 0x9E19DB92B4E31BA9, 1013, 324 },
17380 const int f =
kAlpha - e - 1;
17381 const int k = (f * 78913) / (1 << 18) +
static_cast<int>(f > 0);
17383 const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep;
17385 JSON_ASSERT(
static_cast<std::size_t
>(index) < kCachedPowers.size());
17387 const cached_power cached = kCachedPowers[
static_cast<std::size_t
>(index)];
17401 if (n >= 1000000000)
17403 pow10 = 1000000000;
17407 if (n >= 100000000)
17452 inline void grisu2_round(
char* buf,
int len, std::uint64_t dist, std::uint64_t delta,
17453 std::uint64_t rest, std::uint64_t ten_k)
17480 && delta - rest >= ten_k
17481 && (rest + ten_k < dist || dist - rest > rest + ten_k - dist))
17496 static_assert(
kAlpha >= -60,
"internal error");
17497 static_assert(
kGamma <= -32,
"internal error");
17514 std::uint64_t delta =
diyfp::sub(M_plus, M_minus).
f;
17524 const diyfp one(std::uint64_t{ 1 } << -M_plus.
e, M_plus.
e);
17526 auto p1 =
static_cast<std::uint32_t
>(M_plus.
f >> -one.e);
17527 std::uint64_t p2 = M_plus.
f & (one.f - 1);
17535 std::uint32_t pow10{};
17563 const std::uint32_t d = p1 / pow10;
17564 const std::uint32_t r = p1 % pow10;
17570 buffer[length++] =
static_cast<char>(
'0' + d);
17589 const std::uint64_t rest = (std::uint64_t{ p1 } << -one.e) + p2;
17594 decimal_exponent += n;
17605 const std::uint64_t ten_n = std::uint64_t{ pow10 } << -one.e;
17606 grisu2_round(buffer, length, dist, delta, rest, ten_n);
17667 JSON_ASSERT(p2 <= (std::numeric_limits<std::uint64_t>::max)() / 10);
17669 const std::uint64_t d = p2 >> -one.e;
17670 const std::uint64_t r = p2 & (one.f - 1);
17677 buffer[length++] =
static_cast<char>(
'0' + d);
17702 decimal_exponent -= m;
17710 const std::uint64_t ten_m = one.f;
17734 inline
void grisu2(
char* buf,
int& len,
int& decimal_exponent,
17751 const diyfp c_minus_k(cached.
f, cached.
e);
17779 const diyfp M_minus(w_minus.
f + 1, w_minus.
e);
17780 const diyfp M_plus(w_plus.
f - 1, w_plus.
e);
17782 decimal_exponent = -cached.
k;
17792 template<
typename FloatType>
17794 void
grisu2(
char* buf,
int& len,
int& decimal_exponent, FloatType value)
17797 "internal error: not enough precision");
17849 auto k =
static_cast<std::uint32_t
>(e);
17855 *buf++ =
static_cast<char>(
'0' + k);
17859 *buf++ =
static_cast<char>(
'0' + k / 10);
17861 *buf++ =
static_cast<char>(
'0' + k);
17865 *buf++ =
static_cast<char>(
'0' + k / 100);
17867 *buf++ =
static_cast<char>(
'0' + k / 10);
17869 *buf++ =
static_cast<char>(
'0' + k);
17887 int min_exp,
int max_exp)
17893 const int n = len + decimal_exponent;
17899 if (k <= n && n <= max_exp)
17904 std::memset(buf + k,
'0',
static_cast<size_t>(n) -
static_cast<size_t>(k));
17908 return buf + (
static_cast<size_t>(n) + 2);
17911 if (0 < n && n <= max_exp)
17918 std::memmove(buf + (
static_cast<size_t>(n) + 1), buf + n,
static_cast<size_t>(k) -
static_cast<size_t>(n));
17920 return buf + (
static_cast<size_t>(k) + 1U);
17923 if (min_exp < n && n <= 0)
17928 std::memmove(buf + (2 +
static_cast<size_t>(-n)), buf,
static_cast<size_t>(k));
17931 std::memset(buf + 2,
'0',
static_cast<size_t>(-n));
17932 return buf + (2U +
static_cast<size_t>(-n) +
static_cast<size_t>(k));
17947 std::memmove(buf + 2, buf + 1,
static_cast<size_t>(k) - 1);
17949 buf += 1 +
static_cast<size_t>(k);
17968 template<
typename FloatType>
17971 char*
to_chars(
char* first, const
char* last, FloatType value)
17973 static_cast<void>(last);
17977 if (std::signbit(
value))
17984 #pragma GCC diagnostic push
17985 #pragma GCC diagnostic ignored "-Wfloat-equal"
17996 #pragma GCC diagnostic pop
17999 JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10);
18006 int decimal_exponent = 0;
18009 JSON_ASSERT(len <= std::numeric_limits<FloatType>::max_digits10);
18012 constexpr
int kMinExp = -4;
18014 constexpr
int kMaxExp = std::numeric_limits<FloatType>::digits10;
18017 JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits<FloatType>::max_digits10);
18018 JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10 + 6);
18057 template<
typename BasicJsonType>
18060 using string_t =
typename BasicJsonType::string_t;
18061 using number_float_t =
typename BasicJsonType::number_float_t;
18062 using number_integer_t =
typename BasicJsonType::number_integer_t;
18063 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
18064 using binary_char_t =
typename BasicJsonType::binary_t::value_type;
18065 static constexpr std::uint8_t UTF8_ACCEPT = 0;
18066 static constexpr std::uint8_t UTF8_REJECT = 1;
18077 ,
loc(
std::localeconv())
18115 const bool pretty_print,
18117 const unsigned int indent_step,
18118 const unsigned int current_indent = 0)
18120 switch (val.m_data.m_type)
18124 if (val.m_data.m_value.object->empty())
18126 o->write_characters(
"{}", 2);
18132 o->write_characters(
"{\n", 2);
18135 const auto new_indent = current_indent + indent_step;
18142 auto i = val.m_data.m_value.object->cbegin();
18143 for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i)
18146 o->write_character(
'\"');
18148 o->write_characters(
"\": ", 3);
18150 o->write_characters(
",\n", 2);
18154 JSON_ASSERT(i != val.m_data.m_value.object->cend());
18155 JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());
18157 o->write_character(
'\"');
18159 o->write_characters(
"\": ", 3);
18162 o->write_character(
'\n');
18163 o->write_characters(
indent_string.c_str(), current_indent);
18164 o->write_character(
'}');
18168 o->write_character(
'{');
18171 auto i = val.m_data.m_value.object->cbegin();
18172 for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i)
18174 o->write_character(
'\"');
18176 o->write_characters(
"\":", 2);
18178 o->write_character(
',');
18182 JSON_ASSERT(i != val.m_data.m_value.object->cend());
18183 JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());
18184 o->write_character(
'\"');
18186 o->write_characters(
"\":", 2);
18189 o->write_character(
'}');
18197 if (val.m_data.m_value.array->empty())
18199 o->write_characters(
"[]", 2);
18205 o->write_characters(
"[\n", 2);
18208 const auto new_indent = current_indent + indent_step;
18215 for (
auto i = val.m_data.m_value.array->cbegin();
18216 i != val.m_data.m_value.array->cend() - 1; ++i)
18220 o->write_characters(
",\n", 2);
18226 dump(val.m_data.m_value.array->back(),
true,
ensure_ascii, indent_step, new_indent);
18228 o->write_character(
'\n');
18229 o->write_characters(
indent_string.c_str(), current_indent);
18230 o->write_character(
']');
18234 o->write_character(
'[');
18237 for (
auto i = val.m_data.m_value.array->cbegin();
18238 i != val.m_data.m_value.array->cend() - 1; ++i)
18241 o->write_character(
',');
18246 dump(val.m_data.m_value.array->back(),
false,
ensure_ascii, indent_step, current_indent);
18248 o->write_character(
']');
18256 o->write_character(
'\"');
18257 dump_escaped(*val.m_data.m_value.string,
ensure_ascii);
18258 o->write_character(
'\"');
18266 o->write_characters(
"{\n", 2);
18269 const auto new_indent = current_indent + indent_step;
18277 o->write_characters(
"\"bytes\": [", 10);
18279 if (!val.m_data.m_value.binary->empty())
18281 for (
auto i = val.m_data.m_value.binary->cbegin();
18282 i != val.m_data.m_value.binary->cend() - 1; ++i)
18285 o->write_characters(
", ", 2);
18287 dump_integer(val.m_data.m_value.binary->back());
18290 o->write_characters(
"],\n", 3);
18293 o->write_characters(
"\"subtype\": ", 11);
18294 if (val.m_data.m_value.binary->has_subtype())
18296 dump_integer(val.m_data.m_value.binary->subtype());
18300 o->write_characters(
"null", 4);
18302 o->write_character(
'\n');
18303 o->write_characters(
indent_string.c_str(), current_indent);
18304 o->write_character(
'}');
18308 o->write_characters(
"{\"bytes\":[", 10);
18310 if (!val.m_data.m_value.binary->empty())
18312 for (
auto i = val.m_data.m_value.binary->cbegin();
18313 i != val.m_data.m_value.binary->cend() - 1; ++i)
18316 o->write_character(
',');
18318 dump_integer(val.m_data.m_value.binary->back());
18321 o->write_characters(
"],\"subtype\":", 12);
18322 if (val.m_data.m_value.binary->has_subtype())
18324 dump_integer(val.m_data.m_value.binary->subtype());
18325 o->write_character(
'}');
18329 o->write_characters(
"null}", 5);
18337 if (val.m_data.m_value.boolean)
18339 o->write_characters(
"true", 4);
18343 o->write_characters(
"false", 5);
18350 dump_integer(val.m_data.m_value.number_integer);
18356 dump_integer(val.m_data.m_value.number_unsigned);
18362 dump_float(val.m_data.m_value.number_float);
18368 o->write_characters(
"<discarded>", 11);
18374 o->write_characters(
"null", 4);
18400 std::uint32_t codepoint{};
18408 for (std::size_t i = 0; i < s.size(); ++i)
18410 const auto byte =
static_cast<std::uint8_t
>(s[i]);
18412 switch (decode(
state, codepoint,
byte))
18471 if ((codepoint <= 0x1F) || (
ensure_ascii && (codepoint >= 0x7F)))
18473 if (codepoint <= 0xFFFF)
18477 static_cast<std::uint16_t
>(codepoint)));
18483 static_cast<void>((std::snprintf)(
string_buffer.data() +
bytes, 13,
"\\u%04x\\u%04x",
18484 static_cast<std::uint16_t
>(0xD7C0u + (codepoint >> 10u)),
18485 static_cast<std::uint16_t
>(0xDC00u + (codepoint & 0x3FFu))));
18573 state = UTF8_ACCEPT;
18629 o->write_characters(
"\\ufffd", 6);
18633 o->write_characters(
"\xEF\xBF\xBD", 3);
18653 inline unsigned int count_digits(number_unsigned_t x) noexcept
18655 unsigned int n_digits = 1;
18664 return n_digits + 1;
18668 return n_digits + 2;
18672 return n_digits + 3;
18684 static std::string hex_bytes(std::uint8_t
byte)
18686 std::string result =
"FF";
18687 constexpr
const char* nibble_to_hex =
"0123456789ABCDEF";
18688 result[0] = nibble_to_hex[
byte / 16];
18689 result[1] = nibble_to_hex[
byte % 16];
18694 template <typename NumberType, enable_if_t<std::is_signed<NumberType>::value,
int> = 0>
18695 bool is_negative_number(NumberType x)
18700 template < typename NumberType, enable_if_t <std::is_unsigned<NumberType>::value,
int > = 0 >
18701 bool is_negative_number(NumberType )
18716 std::is_integral<NumberType>::value ||
18717 std::is_same<NumberType, number_unsigned_t>::value ||
18718 std::is_same<NumberType, number_integer_t>::value ||
18719 std::is_same<NumberType, binary_char_t>::value,
18721 void dump_integer(NumberType x)
18723 static constexpr std::array<std::array<char, 2>, 100> digits_to_99
18726 {{
'0',
'0'}}, {{
'0',
'1'}}, {{
'0',
'2'}}, {{
'0',
'3'}}, {{
'0',
'4'}}, {{
'0',
'5'}}, {{
'0',
'6'}}, {{
'0',
'7'}}, {{
'0',
'8'}}, {{
'0',
'9'}},
18727 {{
'1',
'0'}}, {{
'1',
'1'}}, {{
'1',
'2'}}, {{
'1',
'3'}}, {{
'1',
'4'}}, {{
'1',
'5'}}, {{
'1',
'6'}}, {{
'1',
'7'}}, {{
'1',
'8'}}, {{
'1',
'9'}},
18728 {{
'2',
'0'}}, {{
'2',
'1'}}, {{
'2',
'2'}}, {{
'2',
'3'}}, {{
'2',
'4'}}, {{
'2',
'5'}}, {{
'2',
'6'}}, {{
'2',
'7'}}, {{
'2',
'8'}}, {{
'2',
'9'}},
18729 {{
'3',
'0'}}, {{
'3',
'1'}}, {{
'3',
'2'}}, {{
'3',
'3'}}, {{
'3',
'4'}}, {{
'3',
'5'}}, {{
'3',
'6'}}, {{
'3',
'7'}}, {{
'3',
'8'}}, {{
'3',
'9'}},
18730 {{
'4',
'0'}}, {{
'4',
'1'}}, {{
'4',
'2'}}, {{
'4',
'3'}}, {{
'4',
'4'}}, {{
'4',
'5'}}, {{
'4',
'6'}}, {{
'4',
'7'}}, {{
'4',
'8'}}, {{
'4',
'9'}},
18731 {{
'5',
'0'}}, {{
'5',
'1'}}, {{
'5',
'2'}}, {{
'5',
'3'}}, {{
'5',
'4'}}, {{
'5',
'5'}}, {{
'5',
'6'}}, {{
'5',
'7'}}, {{
'5',
'8'}}, {{
'5',
'9'}},
18732 {{
'6',
'0'}}, {{
'6',
'1'}}, {{
'6',
'2'}}, {{
'6',
'3'}}, {{
'6',
'4'}}, {{
'6',
'5'}}, {{
'6',
'6'}}, {{
'6',
'7'}}, {{
'6',
'8'}}, {{
'6',
'9'}},
18733 {{
'7',
'0'}}, {{
'7',
'1'}}, {{
'7',
'2'}}, {{
'7',
'3'}}, {{
'7',
'4'}}, {{
'7',
'5'}}, {{
'7',
'6'}}, {{
'7',
'7'}}, {{
'7',
'8'}}, {{
'7',
'9'}},
18734 {{
'8',
'0'}}, {{
'8',
'1'}}, {{
'8',
'2'}}, {{
'8',
'3'}}, {{
'8',
'4'}}, {{
'8',
'5'}}, {{
'8',
'6'}}, {{
'8',
'7'}}, {{
'8',
'8'}}, {{
'8',
'9'}},
18735 {{
'9',
'0'}}, {{
'9',
'1'}}, {{
'9',
'2'}}, {{
'9',
'3'}}, {{
'9',
'4'}}, {{
'9',
'5'}}, {{
'9',
'6'}}, {{
'9',
'7'}}, {{
'9',
'8'}}, {{
'9',
'9'}},
18742 o->write_character(
'0');
18749 number_unsigned_t abs_value;
18751 unsigned int n_chars{};
18753 if (is_negative_number(x))
18756 abs_value = remove_sign(
static_cast<number_integer_t
>(x));
18759 n_chars = 1 + count_digits(abs_value);
18763 abs_value =
static_cast<number_unsigned_t
>(x);
18764 n_chars = count_digits(abs_value);
18772 buffer_ptr += n_chars;
18776 while (abs_value >= 100)
18778 const auto digits_index =
static_cast<unsigned>((abs_value % 100));
18780 *(--buffer_ptr) = digits_to_99[digits_index][1];
18781 *(--buffer_ptr) = digits_to_99[digits_index][0];
18784 if (abs_value >= 10)
18786 const auto digits_index =
static_cast<unsigned>(abs_value);
18787 *(--buffer_ptr) = digits_to_99[digits_index][1];
18788 *(--buffer_ptr) = digits_to_99[digits_index][0];
18792 *(--buffer_ptr) =
static_cast<char>(
'0' + abs_value);
18806 void dump_float(number_float_t x)
18809 if (!std::isfinite(x))
18811 o->write_characters(
"null", 4);
18820 static constexpr
bool is_ieee_single_or_double
18821 = (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) ||
18822 (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);
18824 dump_float(x, std::integral_constant<bool, is_ieee_single_or_double>());
18827 void dump_float(number_float_t x, std::true_type )
18832 o->write_characters(begin,
static_cast<size_t>(end - begin));
18835 void dump_float(number_float_t x, std::false_type )
18838 static constexpr
auto d = std::numeric_limits<number_float_t>::max_digits10;
18870 o->write_characters(
number_buffer.data(),
static_cast<std::size_t
>(len));
18873 const bool value_is_int_like =
18877 return c ==
'.' || c ==
'e';
18880 if (value_is_int_like)
18882 o->write_characters(
".0", 2);
18907 static std::uint8_t decode(std::uint8_t&
state, std::uint32_t& codep,
const std::uint8_t
byte) noexcept
18909 static const std::array<std::uint8_t, 400> utf8d =
18912 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,
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 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,
18917 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,
18918 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,
18919 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3,
18920 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8,
18921 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1,
18922 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,
18923 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,
18924 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,
18925 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
18930 const std::uint8_t type = utf8d[byte];
18932 codep = (
state != UTF8_ACCEPT)
18933 ? (
byte & 0x3fu) | (codep << 6u)
18934 : (0xFFu >> type) & (byte);
18936 const std::size_t index = 256u +
static_cast<size_t>(
state) * 16u +
static_cast<size_t>(type);
18938 state = utf8d[index];
18947 number_unsigned_t remove_sign(number_unsigned_t x)
18962 inline number_unsigned_t remove_sign(number_integer_t x) noexcept
18964 JSON_ASSERT(x < 0 && x < (std::numeric_limits<number_integer_t>::max)());
18965 return static_cast<number_unsigned_t
>(-(x + 1)) + 1;
18970 output_adapter_t<char> o =
nullptr;
19012 #include <functional>
19013 #include <initializer_list>
19014 #include <iterator>
19016 #include <stdexcept>
19017 #include <type_traits>
19030 template <
class Key,
class T,
class IgnoredLess = std::less<Key>,
19031 class Allocator = std::allocator<std::pair<const Key, T>>>
19036 using Container = std::vector<std::pair<const Key, T>, Allocator>;
19041 #ifdef JSON_HAS_CPP_14
19051 template <
class It>
19054 ordered_map(std::initializer_list<value_type> init,
const Allocator& alloc = Allocator())
19059 for (
auto it = this->begin(); it != this->end(); ++it)
19061 if (m_compare(it->first, key))
19063 return { it,
false };
19066 Container::emplace_back(key, std::forward<T>(t));
19067 return { std::prev(this->end()),
true };
19072 std::pair<iterator, bool>
emplace(KeyType&& key, T&& t)
19074 for (
auto it = this->begin(); it != this->end(); ++it)
19076 if (m_compare(it->first, key))
19078 return { it,
false };
19081 Container::emplace_back(std::forward<KeyType>(key), std::forward<T>(t));
19082 return { std::prev(this->end()),
true };
19087 return emplace(key, T{}).first->second;
19094 return emplace(std::forward<KeyType>(key), T{}).first->second;
19106 return at(std::forward<KeyType>(key));
19111 for (
auto it = this->begin(); it != this->end(); ++it)
19113 if (m_compare(it->first, key))
19119 JSON_THROW(std::out_of_range(
"key not found"));
19126 for (
auto it = this->begin(); it != this->end(); ++it)
19128 if (m_compare(it->first, key))
19134 JSON_THROW(std::out_of_range(
"key not found"));
19139 for (
auto it = this->begin(); it != this->end(); ++it)
19141 if (m_compare(it->first, key))
19147 JSON_THROW(std::out_of_range(
"key not found"));
19152 const T&
at(KeyType&& key)
const
19154 for (
auto it = this->begin(); it != this->end(); ++it)
19156 if (m_compare(it->first, key))
19162 JSON_THROW(std::out_of_range(
"key not found"));
19167 for (
auto it = this->begin(); it != this->end(); ++it)
19169 if (m_compare(it->first, key))
19172 for (
auto next = it; ++next != this->end(); ++it)
19177 Container::pop_back();
19188 for (
auto it = this->begin(); it != this->end(); ++it)
19190 if (m_compare(it->first, key))
19193 for (
auto next = it; ++next != this->end(); ++it)
19198 Container::pop_back();
19207 return erase(pos, std::next(pos));
19217 const auto elements_affected = std::distance(first, last);
19218 const auto offset = std::distance(Container::begin(), first);
19240 for (
auto it = first; std::next(it, elements_affected) != Container::end(); ++it)
19243 new (&*it)
value_type{ std::move(*std::next(it, elements_affected)) };
19251 Container::resize(this->size() -
static_cast<size_type>(elements_affected));
19260 return Container::begin() + offset;
19265 for (
auto it = this->begin(); it != this->end(); ++it)
19267 if (m_compare(it->first, key))
19279 for (
auto it = this->begin(); it != this->end(); ++it)
19281 if (m_compare(it->first, key))
19291 for (
auto it = this->begin(); it != this->end(); ++it)
19293 if (m_compare(it->first, key))
19298 return Container::end();
19305 for (
auto it = this->begin(); it != this->end(); ++it)
19307 if (m_compare(it->first, key))
19312 return Container::end();
19317 for (
auto it = this->begin(); it != this->end(); ++it)
19319 if (m_compare(it->first, key))
19324 return Container::end();
19329 return emplace(value.first, std::move(value.second));
19334 for (
auto it = this->begin(); it != this->end(); ++it)
19336 if (m_compare(it->first, value.first))
19338 return { it,
false };
19341 Container::push_back(value);
19342 return { --this->end(),
true };
19345 template<
typename InputIt>
19346 using require_input_iter =
typename std::enable_if<std::is_convertible<typename std::iterator_traits<InputIt>::iterator_category,
19347 std::input_iterator_tag>::value>::type;
19349 template<
typename InputIt,
typename = require_input_iter<InputIt>>
19352 for (
auto it = first; it != last; ++it)
19365 #if defined(JSON_HAS_CPP_17)
19366 #if JSON_HAS_STATIC_RTTI
19369 #include <string_view>
19405 friend class ::nlohmann::json_pointer;
19409 template<
typename BasicJsonType,
typename InputType>
19410 friend class ::nlohmann::detail::parser;
19411 friend ::nlohmann::detail::serializer<basic_json>;
19412 template<
typename BasicJsonType>
19413 friend class ::nlohmann::detail::iter_impl;
19414 template<
typename BasicJsonType,
typename CharType>
19415 friend class ::nlohmann::detail::binary_writer;
19416 template<
typename BasicJsonType,
typename InputType,
typename SAX>
19417 friend class ::nlohmann::detail::binary_reader;
19418 template<
typename BasicJsonType>
19419 friend class ::nlohmann::detail::json_sax_dom_parser;
19420 template<
typename BasicJsonType>
19421 friend class ::nlohmann::detail::json_sax_dom_callback_parser;
19422 friend class ::nlohmann::detail::exception;
19426 using json_base_class_t = ::nlohmann::detail::json_base_class<CustomBaseClass>;
19430 using lexer = ::nlohmann::detail::lexer_base<basic_json>;
19432 template<
typename InputAdapterType>
19433 static ::nlohmann::detail::parser<basic_json, InputAdapterType> parser(
19434 InputAdapterType adapter,
19436 const bool allow_exceptions =
true,
19437 const bool ignore_comments =
false
19440 return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter),
19441 std::move(cb), allow_exceptions, ignore_comments);
19445 using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t;
19446 template<
typename BasicJsonType>
19447 using internal_iterator = ::nlohmann::detail::internal_iterator<BasicJsonType>;
19448 template<
typename BasicJsonType>
19449 using iter_impl = ::nlohmann::detail::iter_impl<BasicJsonType>;
19450 template<
typename Iterator>
19451 using iteration_proxy = ::nlohmann::detail::iteration_proxy<Iterator>;
19452 template<
typename Base>
using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator<Base>;
19454 template<
typename CharType>
19457 template<
typename InputType>
19458 using binary_reader = ::nlohmann::detail::binary_reader<basic_json, InputType>;
19459 template<
typename CharType>
using binary_writer = ::nlohmann::detail::binary_writer<basic_json, CharType>;
19462 using serializer = ::nlohmann::detail::serializer<basic_json>;
19468 template<
typename T,
typename SFINAE>
19524 using pointer =
typename std::allocator_traits<allocator_type>::pointer;
19526 using const_pointer =
typename std::allocator_traits<allocator_type>::const_pointer;
19553 result[
"copyright"] =
"(C) 2013-2023 Niels Lohmann";
19554 result[
"name"] =
"JSON for Modern C++";
19555 result[
"url"] =
"https://github.com/nlohmann/json";
19556 result[
"version"][
"string"] =
19565 result[
"platform"] =
"win32";
19566 #elif defined __linux__
19567 result[
"platform"] =
"linux";
19568 #elif defined __APPLE__
19569 result[
"platform"] =
"apple";
19570 #elif defined __unix__
19571 result[
"platform"] =
"unix";
19573 result[
"platform"] =
"unknown";
19576 #if defined(__ICC) || defined(__INTEL_COMPILER)
19577 result[
"compiler"] = { {
"family",
"icc"}, {
"version", __INTEL_COMPILER} };
19578 #elif defined(__clang__)
19579 result[
"compiler"] = { {
"family",
"clang"}, {
"version", __clang_version__} };
19580 #elif defined(__GNUC__) || defined(__GNUG__)
19581 result[
"compiler"] = { {
"family",
"gcc"}, {
"version",
detail::concat(
19587 #elif defined(__HP_cc) || defined(__HP_aCC)
19588 result[
"compiler"] =
"hp"
19589 #elif defined(__IBMCPP__)
19590 result[
"compiler"] = { {
"family",
"ilecpp"}, {
"version", __IBMCPP__} };
19591 #elif defined(_MSC_VER)
19592 result[
"compiler"] = { {
"family",
"msvc"}, {
"version", _MSC_VER} };
19593 #elif defined(__PGI)
19594 result[
"compiler"] = { {
"family",
"pgcpp"}, {
"version", __PGI} };
19595 #elif defined(__SUNPRO_CC)
19596 result[
"compiler"] = { {
"family",
"sunpro"}, {
"version", __SUNPRO_CC} };
19598 result[
"compiler"] = { {
"family",
"unknown"}, {
"version",
"unknown"} };
19601 #if defined(_MSVC_LANG)
19603 #elif defined(__cplusplus)
19606 result[
"compiler"][
"c++"] =
"unknown";
19624 #if defined(JSON_HAS_CPP_14)
19637 AllocatorType<std::pair<
const StringType,
19642 using array_t = ArrayType<basic_json, AllocatorType<basic_json>>;
19666 using binary_t = nlohmann::byte_container_with_subtype<BinaryType>;
19677 template<
typename T,
typename... Args>
19679 static T* create(Args&& ... args)
19681 AllocatorType<T> alloc;
19682 using AllocatorTraits = std::allocator_traits<AllocatorType<T>>;
19684 auto deleter = [&](T* obj)
19686 AllocatorTraits::deallocate(alloc, obj, 1);
19688 std::unique_ptr<T, decltype(deleter)> obj(AllocatorTraits::allocate(alloc, 1), deleter);
19689 AllocatorTraits::construct(alloc, obj.get(), std::forward<Args>(args)...);
19691 return obj.release();
19744 json_value() =
default;
19746 json_value(
boolean_t v) noexcept : boolean(v) {}
19760 object = create<object_t>();
19766 array = create<array_t>();
19772 string = create<string_t>(
"");
19778 binary = create<binary_t>();
19784 boolean =
static_cast<boolean_t>(
false);
19870 std::vector<basic_json> stack;
19875 stack.reserve(
array->size());
19876 std::move(
array->begin(),
array->end(), std::back_inserter(stack));
19880 stack.reserve(
object->size());
19881 for (
auto&& it : *
object)
19883 stack.push_back(std::move(it.second));
19887 while (!stack.empty())
19890 basic_json current_item(std::move(stack.back()));
19895 if (current_item.is_array())
19897 std::move(current_item.m_data.m_value.array->begin(), current_item.m_data.m_value.array->end(), std::back_inserter(stack));
19899 current_item.m_data.m_value.array->clear();
19901 else if (current_item.is_object())
19903 for (
auto&& it : *current_item.m_data.m_value.object)
19905 stack.push_back(std::move(it.second));
19908 current_item.m_data.m_value.object->clear();
19920 AllocatorType<object_t> alloc;
19921 std::allocator_traits<decltype(alloc)>::destroy(alloc,
object);
19922 std::allocator_traits<decltype(alloc)>::deallocate(alloc,
object, 1);
19928 AllocatorType<array_t> alloc;
19929 std::allocator_traits<decltype(alloc)>::destroy(alloc, array);
19930 std::allocator_traits<decltype(alloc)>::deallocate(alloc, array, 1);
19936 AllocatorType<string_t> alloc;
19937 std::allocator_traits<decltype(alloc)>::destroy(alloc,
string);
19938 std::allocator_traits<decltype(alloc)>::deallocate(alloc,
string, 1);
19944 AllocatorType<binary_t> alloc;
19945 std::allocator_traits<decltype(alloc)>::destroy(alloc, binary);
19946 std::allocator_traits<decltype(alloc)>::deallocate(alloc, binary, 1);
19983 void assert_invariant(
bool check_parents =
true) const noexcept
19990 #if JSON_DIAGNOSTICS
19996 return j.m_parent ==
this;
20001 static_cast<void>(check_parents);
20006 #if JSON_DIAGNOSTICS
20011 for (
auto& element : *
m_data.m_value.array)
20013 element.m_parent =
this;
20020 for (
auto& element : *
m_data.m_value.object)
20022 element.second.m_parent =
this;
20041 iterator set_parents(
iterator it,
typename iterator::difference_type count_set_parents)
20043 #if JSON_DIAGNOSTICS
20044 for (
typename iterator::difference_type i = 0; i < count_set_parents; ++i)
20046 (it + i)->m_parent =
this;
20049 static_cast<void>(count_set_parents);
20054 reference set_parent(
reference j, std::size_t old_capacity =
static_cast<std::size_t
>(-1))
20056 #if JSON_DIAGNOSTICS
20057 if (old_capacity !=
static_cast<std::size_t
>(-1))
20071 #ifdef JSON_HEDLEY_MSVC_VERSION
20072 #pragma warning(push )
20073 #pragma warning(disable : 4127)
20080 #ifdef JSON_HEDLEY_MSVC_VERSION
20081 #pragma warning( pop )
20086 static_cast<void>(j);
20087 static_cast<void>(old_capacity);
20119 assert_invariant();
20127 assert_invariant();
20132 template <
typename CompatibleType,
20138 std::forward<CompatibleType>(val))))
20142 assert_invariant();
20147 template <
typename BasicJsonType,
20152 using other_boolean_t =
typename BasicJsonType::boolean_t;
20153 using other_number_float_t =
typename BasicJsonType::number_float_t;
20154 using other_number_integer_t =
typename BasicJsonType::number_integer_t;
20155 using other_number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
20156 using other_string_t =
typename BasicJsonType::string_t;
20157 using other_object_t =
typename BasicJsonType::object_t;
20158 using other_array_t =
typename BasicJsonType::array_t;
20159 using other_binary_t =
typename BasicJsonType::binary_t;
20161 switch (val.type())
20198 assert_invariant();
20204 bool type_deduction =
true,
20209 bool is_an_object = std::all_of(init.begin(), init.end(),
20215 return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[static_cast<size_type>(0)].is_string();
20219 if (!type_deduction)
20224 is_an_object =
false;
20240 for (
auto& element_ref : init)
20243 m_data.m_value.object->emplace(
20244 std::move(*((*element.m_data.m_value.array)[0].m_data.m_value.string)),
20245 std::move((*element.m_data.m_value.array)[1]));
20252 m_data.m_value.array = create<array_t>(init.begin(), init.end());
20256 assert_invariant();
20266 res.m_data.m_value = init;
20273 static basic_json binary(
const typename binary_t::container_type& init,
typename binary_t::subtype_type subtype)
20277 res.m_data.m_value =
binary_t(init, subtype);
20288 res.m_data.m_value = std::move(init);
20295 static basic_json binary(
typename binary_t::container_type&& init,
typename binary_t::subtype_type subtype)
20299 res.m_data.m_value =
binary_t(std::move(init), subtype);
20325 assert_invariant();
20330 template <
class InputIT,
typename std::enable_if <
20331 std::is_same<InputIT, typename basic_json_t::iterator>::value ||
20332 std::is_same<InputIT, typename basic_json_t::const_iterator>::value,
int >
::type = 0 >
20345 m_data.m_type = first.m_object->m_data.m_type;
20357 || !last.m_it.primitive_iterator.is_end()))
20377 m_data.m_value.number_integer = first.m_object->m_data.m_value.number_integer;
20383 m_data.m_value.number_unsigned = first.m_object->m_data.m_value.number_unsigned;
20389 m_data.m_value.number_float = first.m_object->m_data.m_value.number_float;
20395 m_data.m_value.boolean = first.m_object->m_data.m_value.boolean;
20401 m_data.m_value = *first.m_object->m_data.m_value.string;
20407 m_data.m_value.object = create<object_t>(first.m_it.object_iterator,
20408 last.m_it.object_iterator);
20414 m_data.m_value.array = create<array_t>(first.m_it.array_iterator,
20415 last.m_it.array_iterator);
20421 m_data.m_value = *first.m_object->m_data.m_value.binary;
20432 assert_invariant();
20439 template<
typename JsonRef,
20441 std::is_same<typename JsonRef::value_type, basic_json>>
::value,
int> = 0 >
20447 : json_base_class_t(other)
20451 other.assert_invariant();
20487 m_data.m_value = other.
m_data.m_value.number_unsigned;
20510 assert_invariant();
20516 : json_base_class_t(std::forward<json_base_class_t>(other)),
20517 m_data(std::move(other.m_data))
20520 other.assert_invariant(
false);
20524 other.m_data.m_value = {};
20527 assert_invariant();
20533 std::is_nothrow_move_constructible<value_t>::value&&
20534 std::is_nothrow_move_assignable<value_t>::value&&
20535 std::is_nothrow_move_constructible<json_value>::value&&
20536 std::is_nothrow_move_assignable<json_value>::value&&
20537 std::is_nothrow_move_assignable<json_base_class_t>::value
20541 other.assert_invariant();
20546 json_base_class_t::operator=(std::move(other));
20549 assert_invariant();
20557 assert_invariant(
false);
20574 const char indent_char =
' ',
20575 const bool ensure_ascii =
false,
20583 s.dump(*
this,
true, ensure_ascii,
static_cast<unsigned int>(indent));
20587 s.dump(*
this,
false, ensure_ascii, 0);
20710 return m_data.m_value.boolean;
20735 constexpr
const array_t* get_impl_ptr(
const array_t* )
const noexcept
20823 template<
typename ReferenceType,
typename ThisType>
20824 static ReferenceType get_ref_impl(ThisType& obj)
20827 auto* ptr = obj.template get_ptr<typename std::add_pointer<ReferenceType>::type>();
20844 template<
typename PointerType,
typename std::enable_if<
20845 std::is_pointer<PointerType>::value,
int>
::type = 0>
20846 auto get_ptr() noexcept -> decltype(
std::declval<basic_json_t&>().get_impl_ptr(
std::declval<PointerType>()))
20849 return get_impl_ptr(
static_cast<PointerType
>(
nullptr));
20854 template <
typename PointerType,
typename std::enable_if <
20855 std::is_pointer<PointerType>::value&&
20856 std::is_const<typename std::remove_pointer<PointerType>::type>
::value,
int >
::type = 0 >
20857 constexpr
auto get_ptr() const noexcept -> decltype(
std::declval<const basic_json_t&>().get_impl_ptr(
std::declval<PointerType>()))
20860 return get_impl_ptr(
static_cast<PointerType
>(
nullptr));
20902 template <
typename ValueType,
20910 auto ret = ValueType();
20945 template <
typename ValueType,
20970 template <
typename BasicJsonType,
20993 template<
typename BasicJsonType,
20995 std::is_same<BasicJsonType, basic_json_t>::value,
21006 template<
typename PointerType,
21008 std::is_pointer<PointerType>::value,
21011 -> decltype(std::declval<const basic_json_t&>().
template get_ptr<PointerType>())
21014 return get_ptr<PointerType>();
21041 template <
typename ValueTypeCV,
typename ValueType = detail::uncvref_t<ValueTypeCV>>
21042 #if defined(JSON_HAS_CPP_14)
21046 noexcept(
std::declval<const basic_json_t&>().template get_impl<ValueType>(
detail::priority_tag<4> {})))
21052 static_assert(!std::is_reference<ValueTypeCV>::value,
21053 "get() cannot be used with reference types, you might want to use get_ref()");
21084 template<
typename PointerType,
typename std::enable_if<
21085 std::is_pointer<PointerType>::value,
int>
::type = 0>
21086 auto get() noexcept -> decltype(
std::declval<basic_json_t&>().template
get_ptr<PointerType>())
21089 return get_ptr<PointerType>();
21094 template <
typename ValueType,
21099 ValueType&
get_to(ValueType& v)
const noexcept(noexcept(
21108 template<
typename ValueType,
21119 typename T, std::size_t N,
21120 typename Array = T(&)[N],
21125 std::declval<const basic_json_t&>(), v)))
21133 template<
typename ReferenceType,
typename std::enable_if<
21134 std::is_reference<ReferenceType>::value,
int>
::type = 0>
21138 return get_ref_impl<ReferenceType>(*
this);
21143 template <
typename ReferenceType,
typename std::enable_if <
21144 std::is_reference<ReferenceType>::value&&
21145 std::is_const<typename std::remove_reference<ReferenceType>::type>
::value,
int >
::type = 0 >
21149 return get_ref_impl<ReferenceType>(*
this);
21181 template <
typename ValueType,
typename std::enable_if <
21189 #if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))
21192 #if defined(JSON_HAS_CPP_17) && JSON_HAS_STATIC_RTTI
21200 return get<ValueType>();
21212 return *get_ptr<binary_t*>();
21224 return *get_ptr<const binary_t*>();
21246 return set_parent(
m_data.m_value.array->at(idx));
21269 return m_data.m_value.array->at(idx);
21293 auto it =
m_data.m_value.object->find(key);
21294 if (it ==
m_data.m_value.object->end())
21298 return set_parent(it->second);
21313 auto it =
m_data.m_value.object->find(std::forward<KeyType>(key));
21314 if (it ==
m_data.m_value.object->end())
21318 return set_parent(it->second);
21331 auto it =
m_data.m_value.object->find(key);
21332 if (it ==
m_data.m_value.object->end())
21351 auto it =
m_data.m_value.object->find(std::forward<KeyType>(key));
21352 if (it ==
m_data.m_value.object->end())
21367 m_data.m_value.array = create<array_t>();
21368 assert_invariant();
21375 if (idx >=
m_data.m_value.array->size())
21377 #if JSON_DIAGNOSTICS
21379 const auto old_size =
m_data.m_value.array->size();
21380 const auto old_capacity =
m_data.m_value.array->capacity();
21382 m_data.m_value.array->resize(idx + 1);
21384 #if JSON_DIAGNOSTICS
21393 set_parents(begin() +
static_cast<typename iterator::difference_type
>(old_size),
static_cast<typename iterator::difference_type
>(idx + 1 - old_size));
21396 assert_invariant();
21399 return m_data.m_value.array->operator[](idx);
21412 return m_data.m_value.array->operator[](idx);
21426 m_data.m_value.object = create<object_t>();
21427 assert_invariant();
21433 auto result =
m_data.m_value.object->emplace(std::move(key),
nullptr);
21434 return set_parent(result.first->second);
21447 auto it =
m_data.m_value.object->find(key);
21457 template<
typename T>
21460 return operator[](
typename object_t::key_type(key));
21463 template<
typename T>
21466 return operator[](
typename object_t::key_type(key));
21479 m_data.m_value.object = create<object_t>();
21480 assert_invariant();
21486 auto result =
m_data.m_value.object->emplace(std::forward<KeyType>(key),
nullptr);
21487 return set_parent(result.first->second);
21502 auto it =
m_data.m_value.object->find(std::forward<KeyType>(key));
21511 template<
typename KeyType>
21515 template<
typename ValueType>
21516 using value_return_type = std::conditional <
21518 string_t,
typename std::decay<ValueType>::type >;
21526 && !std::is_same<value_t, detail::uncvref_t<ValueType>>
::value,
int > = 0 >
21527 ValueType
value(
const typename object_t::key_type& key,
const ValueType& default_value)
const
21533 const auto it =
find(key);
21536 return it->template get<ValueType>();
21539 return default_value;
21547 template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type,
21551 && !std::is_same<value_t, detail::uncvref_t<ValueType>>
::value,
int > = 0 >
21552 ReturnType
value(
const typename object_t::key_type& key, ValueType&& default_value)
const
21558 const auto it =
find(key);
21561 return it->template get<ReturnType>();
21564 return std::forward<ValueType>(default_value);
21575 && is_comparable_with_object_key<KeyType>::value
21577 && !std::is_same<value_t, detail::uncvref_t<ValueType>>
::value,
int > = 0 >
21578 ValueType
value(KeyType&& key,
const ValueType& default_value)
const
21584 const auto it =
find(std::forward<KeyType>(key));
21587 return it->template get<ValueType>();
21590 return default_value;
21598 template < class ValueType, class KeyType, class ReturnType = typename value_return_type<ValueType>::type,
21602 && is_comparable_with_object_key<KeyType>::value
21604 && !std::is_same<value_t, detail::uncvref_t<ValueType>>
::value,
int > = 0 >
21605 ReturnType
value(KeyType&& key, ValueType&& default_value)
const
21611 const auto it =
find(std::forward<KeyType>(key));
21614 return it->template get<ReturnType>();
21617 return std::forward<ValueType>(default_value);
21627 && !std::is_same<value_t, detail::uncvref_t<ValueType>>
::value,
int > = 0 >
21636 return ptr.get_checked(
this).template get<ValueType>();
21640 return default_value;
21649 template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type,
21652 && !std::is_same<value_t, detail::uncvref_t<ValueType>>
::value,
int > = 0 >
21661 return ptr.get_checked(
this).template get<ReturnType>();
21665 return std::forward<ValueType>(default_value);
21675 && !std::is_same<value_t, detail::uncvref_t<ValueType>>
::value,
int > = 0 >
21677 ValueType
value(const ::nlohmann::json_pointer<BasicJsonType>& ptr,
const ValueType& default_value)
const
21679 return value(ptr.convert(), default_value);
21682 template < class ValueType, class BasicJsonType, class ReturnType = typename value_return_type<ValueType>::type,
21686 && !std::is_same<value_t, detail::uncvref_t<ValueType>>
::value,
int > = 0 >
21688 ReturnType
value(const ::nlohmann::json_pointer<BasicJsonType>& ptr, ValueType&& default_value)
const
21690 return value(ptr.convert(), std::forward<ValueType>(default_value));
21728 std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
21729 std::is_same<IteratorType, typename basic_json_t::const_iterator>::value,
int > = 0 >
21738 IteratorType result = end();
21756 AllocatorType<string_t> alloc;
21757 std::allocator_traits<decltype(alloc)>::destroy(alloc,
m_data.m_value.string);
21758 std::allocator_traits<decltype(alloc)>::deallocate(alloc,
m_data.m_value.string, 1);
21759 m_data.m_value.string =
nullptr;
21763 AllocatorType<binary_t> alloc;
21764 std::allocator_traits<decltype(alloc)>::destroy(alloc,
m_data.m_value.binary);
21765 std::allocator_traits<decltype(alloc)>::deallocate(alloc,
m_data.m_value.binary, 1);
21766 m_data.m_value.binary =
nullptr;
21770 assert_invariant();
21776 result.m_it.object_iterator =
m_data.m_value.object->erase(pos.m_it.object_iterator);
21782 result.m_it.array_iterator =
m_data.m_value.array->erase(pos.m_it.array_iterator);
21798 std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
21799 std::is_same<IteratorType, typename basic_json_t::const_iterator>::value,
int > = 0 >
21800 IteratorType
erase(IteratorType first, IteratorType last)
21808 IteratorType result = end();
21820 || !last.m_it.primitive_iterator.is_end()))
21827 AllocatorType<string_t> alloc;
21828 std::allocator_traits<decltype(alloc)>::destroy(alloc,
m_data.m_value.string);
21829 std::allocator_traits<decltype(alloc)>::deallocate(alloc,
m_data.m_value.string, 1);
21830 m_data.m_value.string =
nullptr;
21834 AllocatorType<binary_t> alloc;
21835 std::allocator_traits<decltype(alloc)>::destroy(alloc,
m_data.m_value.binary);
21836 std::allocator_traits<decltype(alloc)>::deallocate(alloc,
m_data.m_value.binary, 1);
21837 m_data.m_value.binary =
nullptr;
21841 assert_invariant();
21847 result.m_it.object_iterator =
m_data.m_value.object->erase(first.m_it.object_iterator,
21848 last.m_it.object_iterator);
21854 result.m_it.array_iterator =
m_data.m_value.array->erase(first.m_it.array_iterator,
21855 last.m_it.array_iterator);
21871 size_type erase_internal(KeyType&& key)
21879 return m_data.m_value.object->erase(std::forward<KeyType>(key));
21884 size_type erase_internal(KeyType&& key)
21892 const auto it =
m_data.m_value.object->find(std::forward<KeyType>(key));
21893 if (it !=
m_data.m_value.object->end())
21895 m_data.m_value.object->erase(it);
21909 return erase_internal(key);
21918 return erase_internal(std::forward<KeyType>(key));
21954 auto result = end();
21958 result.m_it.object_iterator =
m_data.m_value.object->find(key);
21968 auto result = cend();
21972 result.m_it.object_iterator =
m_data.m_value.object->find(key);
21984 auto result = end();
21988 result.m_it.object_iterator =
m_data.m_value.object->find(std::forward<KeyType>(key));
22000 auto result = cend();
22004 result.m_it.object_iterator =
m_data.m_value.object->find(std::forward<KeyType>(key));
22025 return is_object() ?
m_data.m_value.object->count(std::forward<KeyType>(key)) : 0;
22030 bool contains(
const typename object_t::key_type& key)
const
22041 return is_object() &&
m_data.m_value.object->find(std::forward<KeyType>(key)) !=
m_data.m_value.object->end();
22048 return ptr.contains(
this);
22051 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
22053 bool contains(
const typename ::nlohmann::json_pointer<BasicJsonType>& ptr)
const
22055 return ptr.contains(
this);
22072 result.set_begin();
22088 result.set_begin();
22168 return ref.items();
22179 return ref.items();
22184 iteration_proxy<iterator> items() noexcept
22186 return iteration_proxy<iterator>(*
this);
22191 iteration_proxy<const_iterator> items() const noexcept
22193 return iteration_proxy<const_iterator>(*
this);
22207 bool empty() const noexcept
22220 return m_data.m_value.array->empty();
22226 return m_data.m_value.object->empty();
22259 return m_data.m_value.array->size();
22265 return m_data.m_value.object->size();
22292 return m_data.m_value.array->max_size();
22298 return m_data.m_value.object->max_size();
22328 void clear() noexcept
22334 m_data.m_value.number_integer = 0;
22340 m_data.m_value.number_unsigned = 0;
22346 m_data.m_value.number_float = 0.0;
22352 m_data.m_value.boolean =
false;
22358 m_data.m_value.string->clear();
22364 m_data.m_value.binary->clear();
22370 m_data.m_value.array->clear();
22376 m_data.m_value.object->clear();
22402 assert_invariant();
22406 const auto old_capacity =
m_data.m_value.array->capacity();
22407 m_data.m_value.array->push_back(std::move(val));
22408 set_parent(
m_data.m_value.array->back(), old_capacity);
22435 assert_invariant();
22439 const auto old_capacity =
m_data.m_value.array->capacity();
22440 m_data.m_value.array->push_back(val);
22441 set_parent(
m_data.m_value.array->back(), old_capacity);
22467 assert_invariant();
22471 auto res =
m_data.m_value.object->insert(val);
22472 set_parent(res.first->second);
22487 if (
is_object() && init.size() == 2 && (*init.begin())->is_string())
22489 basic_json&& key = init.begin()->moved_or_copied();
22490 push_back(
typename object_t::value_type(
22491 std::move(key.get_ref<
string_t&>()), (init.begin() + 1)->moved_or_copied()));
22509 template<
class... Args>
22523 assert_invariant();
22527 const auto old_capacity =
m_data.m_value.array->capacity();
22528 m_data.m_value.array->emplace_back(std::forward<Args>(args)...);
22529 return set_parent(
m_data.m_value.array->back(), old_capacity);
22534 template<
class... Args>
22548 assert_invariant();
22552 auto res =
m_data.m_value.object->emplace(std::forward<Args>(args)...);
22553 set_parent(res.first->second);
22557 it.m_it.object_iterator = res.first;
22560 return { it, res.second };
22566 template<
typename... Args>
22572 auto insert_pos = std::distance(
m_data.m_value.array->begin(), pos.m_it.array_iterator);
22573 m_data.m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);
22574 result.m_it.array_iterator =
m_data.m_value.array->begin() + insert_pos;
22608 return insert(pos, val);
22659 return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator);
22704 m_data.m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);
22711 update(j.begin(), j.end(), merge_objects);
22722 m_data.m_value.object = create<object_t>();
22723 assert_invariant();
22743 for (
auto it = first; it != last; ++it)
22745 if (merge_objects && it.value().is_object())
22747 auto it2 =
m_data.m_value.object->find(it.key());
22748 if (it2 !=
m_data.m_value.object->end())
22750 it2->second.update(it.value(),
true);
22754 m_data.m_value.object->operator[](it.key()) = it.value();
22755 #if JSON_DIAGNOSTICS
22756 m_data.m_value.object->operator[](it.key()).m_parent =
this;
22764 std::is_nothrow_move_constructible<value_t>::value&&
22765 std::is_nothrow_move_assignable<value_t>::value&&
22766 std::is_nothrow_move_constructible<json_value>::value&&
22767 std::is_nothrow_move_assignable<json_value>::value
22774 other.set_parents();
22775 assert_invariant();
22781 std::is_nothrow_move_constructible<value_t>::value&&
22782 std::is_nothrow_move_assignable<value_t>::value&&
22783 std::is_nothrow_move_constructible<json_value>::value&&
22784 std::is_nothrow_move_assignable<json_value>::value
22856 void swap(
typename binary_t::container_type& other)
22881 #define JSON_IMPLEMENT_OPERATOR(op, null_result, unordered_result, default_result) \
22882 const auto lhs_type = lhs.type(); \
22883 const auto rhs_type = rhs.type(); \
22885 if (lhs_type == rhs_type) \
22887 switch (lhs_type) \
22889 case value_t::array: \
22890 return (*lhs.m_data.m_value.array) op (*rhs.m_data.m_value.array); \
22892 case value_t::object: \
22893 return (*lhs.m_data.m_value.object) op (*rhs.m_data.m_value.object); \
22895 case value_t::null: \
22896 return (null_result); \
22898 case value_t::string: \
22899 return (*lhs.m_data.m_value.string) op (*rhs.m_data.m_value.string); \
22901 case value_t::boolean: \
22902 return (lhs.m_data.m_value.boolean) op (rhs.m_data.m_value.boolean); \
22904 case value_t::number_integer: \
22905 return (lhs.m_data.m_value.number_integer) op (rhs.m_data.m_value.number_integer); \
22907 case value_t::number_unsigned: \
22908 return (lhs.m_data.m_value.number_unsigned) op (rhs.m_data.m_value.number_unsigned); \
22910 case value_t::number_float: \
22911 return (lhs.m_data.m_value.number_float) op (rhs.m_data.m_value.number_float); \
22913 case value_t::binary: \
22914 return (*lhs.m_data.m_value.binary) op (*rhs.m_data.m_value.binary); \
22916 case value_t::discarded: \
22918 return (unordered_result); \
22921 else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) \
22923 return static_cast<number_float_t>(lhs.m_data.m_value.number_integer) op rhs.m_data.m_value.number_float; \
22925 else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) \
22927 return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_integer); \
22929 else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) \
22931 return static_cast<number_float_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_float; \
22933 else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) \
22935 return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_unsigned); \
22937 else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) \
22939 return static_cast<number_integer_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_integer; \
22941 else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) \
22943 return lhs.m_data.m_value.number_integer op static_cast<number_integer_t>(rhs.m_data.m_value.number_unsigned); \
22945 else if(compares_unordered(lhs, rhs))\
22947 return (unordered_result);\
22950 return (default_result);
22965 #if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
22976 return compares_unordered(*
this,
rhs,
inverse);
22980 #if JSON_HAS_THREE_WAY_COMPARISON
22986 #pragma GCC diagnostic push
22987 #pragma GCC diagnostic ignored "-Wfloat-equal"
22992 #pragma GCC diagnostic pop
22998 template<
typename ScalarType>
22999 requires std::is_scalar_v<ScalarType>
23009 if (compares_unordered(
rhs,
true))
23024 std::partial_ordering::equivalent,
23025 std::partial_ordering::unordered,
23026 lhs_type <=> rhs_type)
23031 template<
typename ScalarType>
23032 requires std::is_scalar_v<ScalarType>
23033 std::partial_ordering operator<=>(ScalarType
rhs)
const noexcept
23038 #if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
23047 if (compares_unordered(
rhs,
true))
23051 return !(
rhs < *
this);
23056 template<
typename ScalarType>
23057 requires std::is_scalar_v<ScalarType>
23058 bool operator<=(ScalarType
rhs)
const noexcept
23068 if (compares_unordered(
rhs,
true))
23072 return !(*
this <
rhs);
23077 template<
typename ScalarType>
23078 requires std::is_scalar_v<ScalarType>
23079 bool operator>=(ScalarType
rhs)
const noexcept
23090 #pragma GCC diagnostic push
23091 #pragma GCC diagnostic ignored "-Wfloat-equal"
23095 #pragma GCC diagnostic pop
23101 template<
typename ScalarType,
typename std::enable_if<
23102 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23110 template<
typename ScalarType,
typename std::enable_if<
23111 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23121 if (compares_unordered(lhs,
rhs,
true))
23125 return !(lhs ==
rhs);
23130 template<
typename ScalarType,
typename std::enable_if<
23131 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23139 template<
typename ScalarType,
typename std::enable_if<
23140 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23158 template<
typename ScalarType,
typename std::enable_if<
23159 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23167 template<
typename ScalarType,
typename std::enable_if<
23168 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23178 if (compares_unordered(lhs,
rhs,
true))
23182 return !(
rhs < lhs);
23187 template<
typename ScalarType,
typename std::enable_if<
23188 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23196 template<
typename ScalarType,
typename std::enable_if<
23197 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23208 if (compares_unordered(lhs,
rhs))
23212 return !(lhs <=
rhs);
23217 template<
typename ScalarType,
typename std::enable_if<
23218 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23226 template<
typename ScalarType,
typename std::enable_if<
23227 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23237 if (compares_unordered(lhs,
rhs,
true))
23241 return !(lhs <
rhs);
23246 template<
typename ScalarType,
typename std::enable_if<
23247 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23255 template<
typename ScalarType,
typename std::enable_if<
23256 std::is_scalar<ScalarType>::value,
int>
::type = 0>
23263 #undef JSON_IMPLEMENT_OPERATOR
23279 const bool pretty_print = o.width() > 0;
23280 const auto indentation = pretty_print ? o.width() : 0;
23287 s.dump(j, pretty_print,
false,
static_cast<unsigned int>(indentation));
23314 template<
typename InputType>
23318 const bool allow_exceptions =
true,
23319 const bool ignore_comments =
false)
23322 parser(
detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions, ignore_comments).parse(
true, result);
23328 template<
typename IteratorType>
23333 const bool allow_exceptions =
true,
23334 const bool ignore_comments =
false)
23337 parser(
detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(
true, result);
23345 const bool allow_exceptions =
true,
23346 const bool ignore_comments =
false)
23349 parser(i.get(), cb, allow_exceptions, ignore_comments).parse(
true, result);
23355 template<
typename InputType>
23356 static bool accept(InputType&& i,
23357 const bool ignore_comments =
false)
23359 return parser(
detail::input_adapter(std::forward<InputType>(i)),
nullptr,
false, ignore_comments).accept(
true);
23364 template<
typename IteratorType>
23365 static bool accept(IteratorType first, IteratorType last,
23366 const bool ignore_comments =
false)
23368 return parser(
detail::input_adapter(std::move(first), std::move(last)),
nullptr,
false, ignore_comments).accept(
true);
23374 const bool ignore_comments =
false)
23376 return parser(i.get(),
nullptr,
false, ignore_comments).accept(
true);
23381 template <
typename InputType,
typename SAX>
23385 const
bool strict = true,
23386 const
bool ignore_comments = false)
23390 ? parser(std::move(ia),
nullptr,
true, ignore_comments).sax_parse(sax, strict)
23396 template<
class IteratorType,
class SAX>
23398 static
bool sax_parse(IteratorType first, IteratorType last, SAX* sax,
23400 const
bool strict = true,
23401 const
bool ignore_comments = false)
23405 ? parser(std::move(ia),
nullptr,
true, ignore_comments).sax_parse(sax, strict)
23414 template <
typename SAX>
23419 const
bool strict = true,
23420 const
bool ignore_comments = false)
23425 ? parser(std::move(ia),
nullptr,
true, ignore_comments).sax_parse(sax, strict)
23476 return "discarded";
23506 m_value.array = create<array_t>(cnt, val);
23523 #if JSON_DIAGNOSTICS
23540 std::vector<std::uint8_t> result;
23549 binary_writer<std::uint8_t>(o).write_cbor(j);
23556 binary_writer<char>(o).write_cbor(j);
23563 std::vector<std::uint8_t> result;
23572 binary_writer<std::uint8_t>(o).write_msgpack(j);
23579 binary_writer<char>(o).write_msgpack(j);
23585 const bool use_size =
false,
23586 const bool use_type =
false)
23588 std::vector<std::uint8_t> result;
23589 to_ubjson(j, result, use_size, use_type);
23596 const bool use_size =
false,
const bool use_type =
false)
23598 binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type);
23604 const bool use_size =
false,
const bool use_type =
false)
23606 binary_writer<char>(o).write_ubjson(j, use_size, use_type);
23612 const bool use_size =
false,
23613 const bool use_type =
false)
23615 std::vector<std::uint8_t> result;
23616 to_bjdata(j, result, use_size, use_type);
23623 const bool use_size =
false,
const bool use_type =
false)
23625 binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type,
true,
true);
23631 const bool use_size =
false,
const bool use_type =
false)
23633 binary_writer<char>(o).write_ubjson(j, use_size, use_type,
true,
true);
23640 std::vector<std::uint8_t> result;
23649 binary_writer<std::uint8_t>(o).write_bson(j);
23656 binary_writer<char>(o).write_bson(j);
23661 template<
typename InputType>
23664 const bool strict =
true,
23665 const bool allow_exceptions =
true,
23671 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
23677 template<
typename IteratorType>
23680 const bool strict =
true,
23681 const bool allow_exceptions =
true,
23687 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
23691 template<
typename T>
23695 const
bool strict = true,
23696 const
bool allow_exceptions = true,
23699 return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);
23705 const
bool strict = true,
23706 const
bool allow_exceptions = true,
23713 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
23719 template<
typename InputType>
23722 const bool strict =
true,
23723 const bool allow_exceptions =
true)
23728 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict);
23734 template<
typename IteratorType>
23737 const bool strict =
true,
23738 const bool allow_exceptions =
true)
23743 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict);
23747 template<
typename T>
23751 const
bool strict = true,
23752 const
bool allow_exceptions = true)
23754 return from_msgpack(ptr, ptr + len, strict, allow_exceptions);
23760 const
bool strict = true,
23761 const
bool allow_exceptions = true)
23767 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict);
23773 template<
typename InputType>
23776 const bool strict =
true,
23777 const bool allow_exceptions =
true)
23782 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict);
23788 template<
typename IteratorType>
23791 const bool strict =
true,
23792 const bool allow_exceptions =
true)
23797 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict);
23801 template<
typename T>
23805 const
bool strict = true,
23806 const
bool allow_exceptions = true)
23808 return from_ubjson(ptr, ptr + len, strict, allow_exceptions);
23814 const
bool strict = true,
23815 const
bool allow_exceptions = true)
23821 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict);
23827 template<
typename InputType>
23830 const bool strict =
true,
23831 const bool allow_exceptions =
true)
23836 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict);
23842 template<
typename IteratorType>
23845 const bool strict =
true,
23846 const bool allow_exceptions =
true)
23851 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict);
23857 template<
typename InputType>
23860 const bool strict =
true,
23861 const bool allow_exceptions =
true)
23866 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict);
23872 template<
typename IteratorType>
23875 const bool strict =
true,
23876 const bool allow_exceptions =
true)
23881 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict);
23885 template<
typename T>
23889 const
bool strict = true,
23890 const
bool allow_exceptions = true)
23892 return from_bson(ptr, ptr + len, strict, allow_exceptions);
23898 const
bool strict = true,
23899 const
bool allow_exceptions = true)
23905 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict);
23921 return ptr.get_unchecked(
this);
23924 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
23928 return ptr.get_unchecked(
this);
23935 return ptr.get_unchecked(
this);
23938 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
23942 return ptr.get_unchecked(
this);
23949 return ptr.get_checked(
this);
23952 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
23954 reference at(const ::nlohmann::json_pointer<BasicJsonType>& ptr)
23956 return ptr.get_checked(
this);
23963 return ptr.get_checked(
this);
23966 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value,
int> = 0>
23970 return ptr.get_checked(
this);
23978 json_pointer::flatten(
"", *
this, result);
23986 return json_pointer::unflatten(*
this);
24000 void patch_inplace(
const basic_json& json_patch)
24004 enum class patch_operations { add, remove,
replace, move, copy, test, invalid };
24006 const auto get_op = [](
const std::string& op)
24010 return patch_operations::add;
24012 if (op ==
"remove")
24014 return patch_operations::remove;
24016 if (op ==
"replace")
24018 return patch_operations::replace;
24022 return patch_operations::move;
24026 return patch_operations::copy;
24030 return patch_operations::test;
24033 return patch_operations::invalid;
24048 if (top_pointer != ptr)
24050 result.
at(top_pointer);
24054 const auto last_path = ptr.
back();
24059 switch (parent.
m_data.m_type)
24065 parent[last_path] = val;
24071 if (last_path ==
"-")
24078 const auto idx = json_pointer::template array_index<basic_json_t>(last_path);
24105 const auto operation_remove = [
this, &result](
json_pointer& ptr)
24108 const auto last_path = ptr.
back();
24116 auto it = parent.
find(last_path);
24129 parent.
erase(json_pointer::template array_index<basic_json_t>(last_path));
24140 for (
const auto& val : json_patch)
24143 const auto get_value = [&val](
const std::string& op,
24144 const std::string& member,
24148 auto it = val.
m_data.m_value.object->find(member);
24151 const auto error_msg = (op ==
"op") ?
"operation" :
detail::concat(
"operation '", op,
'\'');
24178 const auto op = get_value(
"op",
"op",
true).template get<std::string>();
24179 const auto path = get_value(op,
"path",
true).template get<std::string>();
24182 switch (get_op(op))
24184 case patch_operations::add:
24186 operation_add(ptr, get_value(
"add",
"value",
false));
24190 case patch_operations::remove:
24192 operation_remove(ptr);
24196 case patch_operations::replace:
24199 result.
at(ptr) = get_value(
"replace",
"value",
false);
24203 case patch_operations::move:
24205 const auto from_path = get_value(
"move",
"from",
true).template get<std::string>();
24215 operation_remove(from_ptr);
24216 operation_add(ptr, v);
24220 case patch_operations::copy:
24222 const auto from_path = get_value(
"copy",
"from",
true).template get<std::string>();
24231 operation_add(ptr, v);
24235 case patch_operations::test:
24237 bool success =
false;
24242 success = (result.
at(ptr) == get_value(
"test",
"value",
false));
24258 case patch_operations::invalid:
24274 result.patch_inplace(json_patch);
24282 const std::string& path =
"")
24288 if (source == target)
24293 if (source.
type() != target.
type())
24298 {
"op",
"replace"}, {
"path", path}, {
"value", target}
24303 switch (source.
type())
24309 while (i < source.size() && i < target.size())
24313 result.
insert(result.end(), temp_diff.begin(), temp_diff.end());
24322 while (i < source.size())
24335 while (i < target.size())
24341 {
"value", target[i]}
24352 for (
auto it = source.cbegin(); it != source.cend(); ++it)
24357 if (target.
find(it.key()) != target.end())
24360 auto temp_diff =
diff(it.value(), target[it.key()], path_key);
24361 result.
insert(result.end(), temp_diff.begin(), temp_diff.end());
24368 {
"op",
"remove"}, {
"path", path_key}
24374 for (
auto it = target.cbegin(); it != target.cend(); ++it)
24376 if (source.
find(it.key()) == source.end())
24382 {
"op",
"add"}, {
"path", path_key},
24383 {
"value", it.value()}
24404 {
"op",
"replace"}, {
"path", path}, {
"value", target}
24431 for (
auto it = apply_patch.begin(); it != apply_patch.end(); ++it)
24433 if (it.value().is_null())
24445 *
this = apply_patch;
24462 inline namespace json_literals
24468 #if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
24471 inline nlohmann::json operator "" _json(
const char* s, std::size_t n)
24474 return nlohmann::json::parse(s, s + n);
24480 #if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
24522 #if JSON_HAS_THREE_WAY_COMPARISON
24523 return std::is_lt(lhs <=> rhs);
24531 #ifndef JSON_HAS_CPP_20
24537 is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&&
24538 is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value)
24547 #if JSON_USE_GLOBAL_UDLS
24548 #if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
24549 using nlohmann::literals::json_literals::operator
""_json;
24550 using nlohmann::literals::json_literals::operator
""_json_pointer;
24552 using nlohmann::literals::json_literals::operator
"" _json;
24553 using nlohmann::literals::json_literals::operator
"" _json_pointer;
24569 #if defined(__clang__)
24570 #pragma clang diagnostic pop
24575 #undef JSON_INTERNAL_CATCH
24577 #undef JSON_PRIVATE_UNLESS_TESTED
24578 #undef NLOHMANN_BASIC_JSON_TPL_DECLARATION
24579 #undef NLOHMANN_BASIC_JSON_TPL
24580 #undef JSON_EXPLICIT
24581 #undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL
24582 #undef JSON_INLINE_VARIABLE
24583 #undef JSON_NO_UNIQUE_ADDRESS
24584 #undef JSON_DISABLE_ENUM_SERIALIZATION
24585 #undef JSON_USE_GLOBAL_UDLS
24587 #ifndef JSON_TEST_KEEP_MACROS
24590 #undef JSON_HAS_CPP_11
24591 #undef JSON_HAS_CPP_14
24592 #undef JSON_HAS_CPP_17
24593 #undef JSON_HAS_CPP_20
24594 #undef JSON_HAS_FILESYSTEM
24595 #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
24596 #undef JSON_HAS_THREE_WAY_COMPARISON
24597 #undef JSON_HAS_RANGES
24598 #undef JSON_HAS_STATIC_RTTI
24599 #undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
24613 #undef JSON_HEDLEY_ALWAYS_INLINE
24614 #undef JSON_HEDLEY_ARM_VERSION
24615 #undef JSON_HEDLEY_ARM_VERSION_CHECK
24616 #undef JSON_HEDLEY_ARRAY_PARAM
24617 #undef JSON_HEDLEY_ASSUME
24618 #undef JSON_HEDLEY_BEGIN_C_DECLS
24619 #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE
24620 #undef JSON_HEDLEY_CLANG_HAS_BUILTIN
24621 #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
24622 #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
24623 #undef JSON_HEDLEY_CLANG_HAS_EXTENSION
24624 #undef JSON_HEDLEY_CLANG_HAS_FEATURE
24625 #undef JSON_HEDLEY_CLANG_HAS_WARNING
24626 #undef JSON_HEDLEY_COMPCERT_VERSION
24627 #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK
24628 #undef JSON_HEDLEY_CONCAT
24629 #undef JSON_HEDLEY_CONCAT3
24630 #undef JSON_HEDLEY_CONCAT3_EX
24631 #undef JSON_HEDLEY_CONCAT_EX
24632 #undef JSON_HEDLEY_CONST
24633 #undef JSON_HEDLEY_CONSTEXPR
24634 #undef JSON_HEDLEY_CONST_CAST
24635 #undef JSON_HEDLEY_CPP_CAST
24636 #undef JSON_HEDLEY_CRAY_VERSION
24637 #undef JSON_HEDLEY_CRAY_VERSION_CHECK
24638 #undef JSON_HEDLEY_C_DECL
24639 #undef JSON_HEDLEY_DEPRECATED
24640 #undef JSON_HEDLEY_DEPRECATED_FOR
24641 #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
24642 #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
24643 #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
24644 #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
24645 #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
24646 #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION
24647 #undef JSON_HEDLEY_DIAGNOSTIC_POP
24648 #undef JSON_HEDLEY_DIAGNOSTIC_PUSH
24649 #undef JSON_HEDLEY_DMC_VERSION
24650 #undef JSON_HEDLEY_DMC_VERSION_CHECK
24651 #undef JSON_HEDLEY_EMPTY_BASES
24652 #undef JSON_HEDLEY_EMSCRIPTEN_VERSION
24653 #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK
24654 #undef JSON_HEDLEY_END_C_DECLS
24655 #undef JSON_HEDLEY_FLAGS
24656 #undef JSON_HEDLEY_FLAGS_CAST
24657 #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE
24658 #undef JSON_HEDLEY_GCC_HAS_BUILTIN
24659 #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE
24660 #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
24661 #undef JSON_HEDLEY_GCC_HAS_EXTENSION
24662 #undef JSON_HEDLEY_GCC_HAS_FEATURE
24663 #undef JSON_HEDLEY_GCC_HAS_WARNING
24664 #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
24665 #undef JSON_HEDLEY_GCC_VERSION
24666 #undef JSON_HEDLEY_GCC_VERSION_CHECK
24667 #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE
24668 #undef JSON_HEDLEY_GNUC_HAS_BUILTIN
24669 #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
24670 #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
24671 #undef JSON_HEDLEY_GNUC_HAS_EXTENSION
24672 #undef JSON_HEDLEY_GNUC_HAS_FEATURE
24673 #undef JSON_HEDLEY_GNUC_HAS_WARNING
24674 #undef JSON_HEDLEY_GNUC_VERSION
24675 #undef JSON_HEDLEY_GNUC_VERSION_CHECK
24676 #undef JSON_HEDLEY_HAS_ATTRIBUTE
24677 #undef JSON_HEDLEY_HAS_BUILTIN
24678 #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE
24679 #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS
24680 #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE
24681 #undef JSON_HEDLEY_HAS_EXTENSION
24682 #undef JSON_HEDLEY_HAS_FEATURE
24683 #undef JSON_HEDLEY_HAS_WARNING
24684 #undef JSON_HEDLEY_IAR_VERSION
24685 #undef JSON_HEDLEY_IAR_VERSION_CHECK
24686 #undef JSON_HEDLEY_IBM_VERSION
24687 #undef JSON_HEDLEY_IBM_VERSION_CHECK
24688 #undef JSON_HEDLEY_IMPORT
24689 #undef JSON_HEDLEY_INLINE
24690 #undef JSON_HEDLEY_INTEL_CL_VERSION
24691 #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK
24692 #undef JSON_HEDLEY_INTEL_VERSION
24693 #undef JSON_HEDLEY_INTEL_VERSION_CHECK
24694 #undef JSON_HEDLEY_IS_CONSTANT
24695 #undef JSON_HEDLEY_IS_CONSTEXPR_
24696 #undef JSON_HEDLEY_LIKELY
24697 #undef JSON_HEDLEY_MALLOC
24698 #undef JSON_HEDLEY_MCST_LCC_VERSION
24699 #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK
24700 #undef JSON_HEDLEY_MESSAGE
24701 #undef JSON_HEDLEY_MSVC_VERSION
24702 #undef JSON_HEDLEY_MSVC_VERSION_CHECK
24703 #undef JSON_HEDLEY_NEVER_INLINE
24704 #undef JSON_HEDLEY_NON_NULL
24705 #undef JSON_HEDLEY_NO_ESCAPE
24706 #undef JSON_HEDLEY_NO_RETURN
24707 #undef JSON_HEDLEY_NO_THROW
24708 #undef JSON_HEDLEY_NULL
24709 #undef JSON_HEDLEY_PELLES_VERSION
24710 #undef JSON_HEDLEY_PELLES_VERSION_CHECK
24711 #undef JSON_HEDLEY_PGI_VERSION
24712 #undef JSON_HEDLEY_PGI_VERSION_CHECK
24713 #undef JSON_HEDLEY_PREDICT
24714 #undef JSON_HEDLEY_PRINTF_FORMAT
24715 #undef JSON_HEDLEY_PRIVATE
24716 #undef JSON_HEDLEY_PUBLIC
24717 #undef JSON_HEDLEY_PURE
24718 #undef JSON_HEDLEY_REINTERPRET_CAST
24719 #undef JSON_HEDLEY_REQUIRE
24720 #undef JSON_HEDLEY_REQUIRE_CONSTEXPR
24721 #undef JSON_HEDLEY_REQUIRE_MSG
24722 #undef JSON_HEDLEY_RESTRICT
24723 #undef JSON_HEDLEY_RETURNS_NON_NULL
24724 #undef JSON_HEDLEY_SENTINEL
24725 #undef JSON_HEDLEY_STATIC_ASSERT
24726 #undef JSON_HEDLEY_STATIC_CAST
24727 #undef JSON_HEDLEY_STRINGIFY
24728 #undef JSON_HEDLEY_STRINGIFY_EX
24729 #undef JSON_HEDLEY_SUNPRO_VERSION
24730 #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK
24731 #undef JSON_HEDLEY_TINYC_VERSION
24732 #undef JSON_HEDLEY_TINYC_VERSION_CHECK
24733 #undef JSON_HEDLEY_TI_ARMCL_VERSION
24734 #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK
24735 #undef JSON_HEDLEY_TI_CL2000_VERSION
24736 #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK
24737 #undef JSON_HEDLEY_TI_CL430_VERSION
24738 #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK
24739 #undef JSON_HEDLEY_TI_CL6X_VERSION
24740 #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK
24741 #undef JSON_HEDLEY_TI_CL7X_VERSION
24742 #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK
24743 #undef JSON_HEDLEY_TI_CLPRU_VERSION
24744 #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK
24745 #undef JSON_HEDLEY_TI_VERSION
24746 #undef JSON_HEDLEY_TI_VERSION_CHECK
24747 #undef JSON_HEDLEY_UNAVAILABLE
24748 #undef JSON_HEDLEY_UNLIKELY
24749 #undef JSON_HEDLEY_UNPREDICTABLE
24750 #undef JSON_HEDLEY_UNREACHABLE
24751 #undef JSON_HEDLEY_UNREACHABLE_RETURN
24752 #undef JSON_HEDLEY_VERSION
24753 #undef JSON_HEDLEY_VERSION_DECODE_MAJOR
24754 #undef JSON_HEDLEY_VERSION_DECODE_MINOR
24755 #undef JSON_HEDLEY_VERSION_DECODE_REVISION
24756 #undef JSON_HEDLEY_VERSION_ENCODE
24757 #undef JSON_HEDLEY_WARNING
24758 #undef JSON_HEDLEY_WARN_UNUSED_RESULT
24759 #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG
24760 #undef JSON_HEDLEY_FALL_THROUGH
namespace for Niels Lohmann
Definition: json.hpp:19400
constexpr bool is_string() const noexcept
return whether value is a string
Definition: json.hpp:20672
ValueType & get_to(ValueType &v) const noexcept(noexcept(JSONSerializer< ValueType >::from_json(std::declval< const basic_json_t & >(), v)))
get a value (explicit)
Definition: json.hpp:21099
size_type erase(const typename object_t::key_type &key)
remove element from a JSON object given a key
Definition: json.hpp:21905
reference operator[](KeyType &&key)
access specified object element
Definition: json.hpp:21473
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
Definition: json.hpp:23679
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 > {}))
get a (pointer) value (explicit)
Definition: json.hpp:21045
reference back()
access the last element
Definition: json.hpp:21709
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
Definition: json.hpp:20136
basic_json patch(const basic_json &json_patch) const
applies a JSON patch to a copy of the current object
Definition: json.hpp:24271
const_reference front() const
access the first element
Definition: json.hpp:21702
JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer< basic_json::string_t >) const _reference operator[](const
access specified element via JSON Pointer
Definition: json.hpp:23939
constexpr bool is_array() const noexcept
return whether value is an array
Definition: json.hpp:20665
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)
exchanges the values
Definition: json.hpp:22763
ReturnType value(const json_pointer &ptr, ValueType &&default_value) const
access specified object element via JSON Pointer with default value
Definition: json.hpp:21653
size_type count(KeyType &&key) const
returns the number of occurrences of a key in a JSON object
Definition: json.hpp:22022
iter_impl< const basic_json > const_iterator
a const iterator for a basic_json container
Definition: json.hpp:19531
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
Definition: json.hpp:23630
std::initializer_list< detail::json_ref< basic_json > > initializer_list_t
helper type for initializer lists of basic_json values
Definition: json.hpp:19475
constexpr bool is_number_integer() const noexcept
return whether value is an integer number
Definition: json.hpp:20637
json_reverse_iterator< typename basic_json::const_iterator > const_reverse_iterator
a const reverse iterator for a basic_json container
Definition: json.hpp:19535
data(size_type cnt, const basic_json &val)
Definition: json.hpp:23503
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
Definition: json.hpp:23874
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
Definition: json.hpp:23622
reference operator[](const json_pointer &ptr)
access specified element via JSON Pointer
Definition: json.hpp:23919
typename std::allocator_traits< allocator_type >::const_pointer const_pointer
the type of an element const pointer
Definition: json.hpp:19526
JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer< basic_json::string_t >) reference at(const
Definition: json.hpp:23953
std::size_t size_type
a type to represent container sizes
Definition: json.hpp:19518
constexpr bool is_structured() const noexcept
return whether type is structured
Definition: json.hpp:20609
const_reference operator[](KeyType &&key) const
access specified object element
Definition: json.hpp:21497
const value_type & const_reference
the type of an element const reference
Definition: json.hpp:19513
void swap(binary_t &other)
exchanges the values
Definition: json.hpp:22840
ReferenceType get_ref()
get a reference value (implicit)
Definition: json.hpp:21135
void update(const_reference j, bool merge_objects=false)
updates a JSON object from another object, overwriting existing keys
Definition: json.hpp:22709
ReferenceType get_ref() const
get a reference value (implicit)
Definition: json.hpp:21146
constexpr bool is_discarded() const noexcept
return whether value is discarded
Definition: json.hpp:20686
JSON_PRIVATE_UNLESS_TESTED const_reference rhs
Definition: json.hpp:22958
reference operator+=(initializer_list_t init)
add an object to an object
Definition: json.hpp:22501
JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer< basic_json::string_t >) ValueType value(const
access the first element
Definition: json.hpp:21676
const_reference operator[](const typename object_t::key_type &key) const
access specified object element
Definition: json.hpp:21442
const_reference back() const
access the last element
Definition: json.hpp:21718
IteratorType erase(IteratorType first, IteratorType last)
remove elements given an iterator range
Definition: json.hpp:21800
reference operator+=(const basic_json &val)
add an object to an array
Definition: json.hpp:22446
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
Definition: json.hpp:22780
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
Definition: json.hpp:23775
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)
Definition: json.hpp:20273
iterator insert(const_iterator pos, size_type cnt, const basic_json &val)
inserts copies of element into array
Definition: json.hpp:22613
const binary_t & get_binary() const
get a binary value
Definition: json.hpp:21217
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
Definition: json.hpp:23859
static allocator_type get_allocator()
returns the allocator associated with the container
Definition: json.hpp:19541
nlohmann::byte_container_with_subtype< BinaryType > binary_t
a type for a packed binary type
Definition: json.hpp:19666
reference at(KeyType &&key)
access specified object element with bounds checking
Definition: json.hpp:21305
constexpr bool is_number_unsigned() const noexcept
return whether value is an unsigned integer number
Definition: json.hpp:20644
void update(const_iterator first, const_iterator last, bool merge_objects=false)
updates a JSON object from another object, overwriting existing keys
Definition: json.hpp:22716
data m_data
Definition: json.hpp:23521
void push_back(initializer_list_t init)
add an object to an object
Definition: json.hpp:22485
detail::parser_callback_t< basic_json > parser_callback_t
per-element parser callback type
Definition: json.hpp:20103
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json object(initializer_list_t init={})
explicitly create an object from an initializer list
Definition: json.hpp:20314
static void to_msgpack(const basic_json &j, detail::output_adapter< char > o)
create a MessagePack serialization of a given JSON value
Definition: json.hpp:23577
JSON_PRIVATE_UNLESS_TESTED const_reference bool inverse
Definition: json.hpp:22958
ReturnType value(const typename object_t::key_type &key, ValueType &&default_value) const
access specified object element with default value
Definition: json.hpp:21552
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
Definition: json.hpp:23829
const_reference at(const json_pointer &ptr) const
access specified element via JSON Pointer
Definition: json.hpp:23961
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json binary(typename binary_t::container_type &&init)
explicitly create a binary array
Definition: json.hpp:20284
basic_json(std::nullptr_t=nullptr) noexcept
create a null object
Definition: json.hpp:20124
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
Definition: json.hpp:23663
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
Definition: json.hpp:23790
size_type erase(KeyType &&key)
remove element from a JSON object given a key
Definition: json.hpp:21916
friend std::istream & operator<<(basic_json &j, std::istream &i)
deserialize from stream
Definition: json.hpp:23437
iterator insert(const_iterator pos, const_iterator first, const_iterator last)
inserts range of elements into array
Definition: json.hpp:22633
ReturnType value(KeyType &&key, ValueType &&default_value) const
access specified object element via JSON Pointer with default value
Definition: json.hpp:21605
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
Definition: json.hpp:24281
const_reference operator[](const json_pointer &ptr) const
access specified element via JSON Pointer
Definition: json.hpp:23933
ArrayType< basic_json, AllocatorType< basic_json > > array_t
a type for an array
Definition: json.hpp:19642
value_type & reference
the type of an element reference
Definition: json.hpp:19511
bool contains(KeyType &&key) const
check the existence of an element in a JSON object
Definition: json.hpp:22039
static void to_cbor(const basic_json &j, detail::output_adapter< std::uint8_t > o)
create a CBOR serialization of a given JSON value
Definition: json.hpp:23547
static void to_bson(const basic_json &j, detail::output_adapter< char > o)
create a BSON serialization of a given JSON value
Definition: json.hpp:23654
iterator find(const typename object_t::key_type &key)
find an element in a JSON object
Definition: json.hpp:21952
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json binary(const typename binary_t::container_type &init)
explicitly create a binary array (without subtype)
Definition: json.hpp:20262
const_reference at(KeyType &&key) const
access specified object element with bounds checking
Definition: json.hpp:21343
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json meta()
returns version information on the library
Definition: json.hpp:19549
basic_json(size_type cnt, const basic_json &val)
construct an array with count copies of given value
Definition: json.hpp:20321
const_iterator find(const typename object_t::key_type &key) const
find an element in a JSON object
Definition: json.hpp:21966
IteratorType erase(IteratorType pos)
remove element given an iterator
Definition: json.hpp:21730
iterator insert(const_iterator pos, const basic_json &val)
inserts element into array
Definition: json.hpp:22586
NumberFloatType number_float_t
a type for a number (floating-point)
Definition: json.hpp:19662
ValueType value(const typename object_t::key_type &key, const ValueType &default_value) const
access specified object element with default value
Definition: json.hpp:21527
ValueType & get_to(ValueType &v) const
Definition: json.hpp:21112
AllocatorType< basic_json > allocator_type
the allocator type
Definition: json.hpp:19521
typename std::allocator_traits< allocator_type >::pointer pointer
the type of an element pointer
Definition: json.hpp:19524
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
Definition: json.hpp:20573
void merge_patch(const basic_json &apply_patch)
applies a JSON Merge Patch
Definition: json.hpp:24423
reference operator[](T *key)
Definition: json.hpp:21458
reference at(size_type idx)
access specified array element with bounds checking
Definition: json.hpp:21239
iterator find(KeyType &&key)
find an element in a JSON object
Definition: json.hpp:21982
constexpr bool is_number_float() const noexcept
return whether value is a floating-point number
Definition: json.hpp:20651
BooleanType boolean_t
a type for a boolean
Definition: json.hpp:19650
detail::value_t value_t
Definition: json.hpp:19465
std::less< StringType > default_object_comparator_t
default object key comparator type The actual object key comparator type (object_comparator_t) may be...
Definition: json.hpp:19629
reference operator+=(const typename object_t::value_type &val)
add an object to an object
Definition: json.hpp:22477
static std::vector< std::uint8_t > to_cbor(const basic_json &j)
create a CBOR serialization of a given JSON value
Definition: json.hpp:23538
reference operator[](typename object_t::key_type key)
access specified object element
Definition: json.hpp:21420
constexpr auto get_ptr() const noexcept -> decltype(std::declval< const basic_json_t & >().get_impl_ptr(std::declval< PointerType >()))
get a pointer value (implicit)
Definition: json.hpp:20857
~basic_json() noexcept
destructor
Definition: json.hpp:20555
detail::out_of_range out_of_range
Definition: json.hpp:19493
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
Definition: json.hpp:20203
void swap(typename binary_t::container_type &other)
exchanges the values
Definition: json.hpp:22856
constexpr bool is_number() const noexcept
return whether value is a number
Definition: json.hpp:20630
friend std::istream & operator>>(std::istream &i, basic_json &j)
deserialize from stream
Definition: json.hpp:23444
void insert(const_iterator first, const_iterator last)
inserts range of elements into object
Definition: json.hpp:22684
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
Definition: json.hpp:20532
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
Definition: json.hpp:23721
auto get() noexcept -> decltype(std::declval< basic_json_t & >().template get_ptr< PointerType >())
get a pointer value (explicit)
Definition: json.hpp:21086
const_reference operator[](T *key) const
Definition: json.hpp:21464
data(const value_t v)
Definition: json.hpp:23498
reference operator[](size_type idx)
access specified array element
Definition: json.hpp:21361
basic_json(const JsonRef &ref)
Definition: json.hpp:20442
JSONSerializer< T, SFINAE > json_serializer
Definition: json.hpp:19469
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
Definition: json.hpp:23603
Array get_to(T(&v)[N]) const noexcept(noexcept(JSONSerializer< Array >::from_json(std::declval< const basic_json_t & >(), v)))
Definition: json.hpp:21123
NumberIntegerType number_integer_t
a type for a number (integer)
Definition: json.hpp:19654
auto get_ptr() noexcept -> decltype(std::declval< basic_json_t & >().get_impl_ptr(std::declval< PointerType >()))
get a pointer value (implicit)
Definition: json.hpp:20846
const_reference at(const typename object_t::key_type &key) const
access specified object element with bounds checking
Definition: json.hpp:21323
constexpr bool is_binary() const noexcept
return whether value is a binary array
Definition: json.hpp:20679
void swap(object_t &other)
exchanges the values
Definition: json.hpp:22808
iterator insert(const_iterator pos, initializer_list_t ilist)
inserts elements from initializer list into array
Definition: json.hpp:22664
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)
Definition: json.hpp:20295
void swap(array_t &other)
exchanges the values
Definition: json.hpp:22792
void erase(const size_type idx)
remove element from a JSON array given an index
Definition: json.hpp:21923
std::pair< iterator, bool > emplace(Args &&... args)
add an object to an object if key does not exist
Definition: json.hpp:22535
reference operator+=(basic_json &&val)
add an object to an array
Definition: json.hpp:22414
bool contains(const json_pointer &ptr) const
check the existence of an element in a JSON object given a JSON pointer
Definition: json.hpp:22046
binary_t & get_binary()
get a binary value
Definition: json.hpp:21205
constexpr value_t type() const noexcept
return the type of the JSON value (explicit)
Definition: json.hpp:20595
reference emplace_back(Args &&... args)
add an object to an array
Definition: json.hpp:22510
ValueType value(const json_pointer &ptr, const ValueType &default_value) const
access specified object element via JSON Pointer with default value
Definition: json.hpp:21628
static JSON_HEDLEY_WARN_UNUSED_RESULT basic_json array(initializer_list_t init={})
explicitly create an array from an initializer list
Definition: json.hpp:20306
StringType string_t
a type for a string
Definition: json.hpp:19646
ObjectType< StringType, basic_json, default_object_comparator_t, AllocatorType< std::pair< const StringType, basic_json > >> object_t
a type for an object
Definition: json.hpp:19638
void push_back(const basic_json &val)
add an object to an array
Definition: json.hpp:22422
ValueType value(KeyType &&key, const ValueType &default_value) const
access specified object element with default value
Definition: json.hpp:21578
reference at(const typename object_t::key_type &key)
access specified object element with bounds checking
Definition: json.hpp:21285
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
Definition: json.hpp:23844
json_value m_value
the value of the current element
Definition: json.hpp:23496
constexpr bool is_boolean() const noexcept
return whether value is a boolean
Definition: json.hpp:20623
size_type count(const typename object_t::key_type &key) const
returns the number of occurrences of a key in a JSON object
Definition: json.hpp:22012
static std::vector< std::uint8_t > to_msgpack(const basic_json &j)
create a MessagePack serialization of a given JSON value
Definition: json.hpp:23561
constexpr bool is_primitive() const noexcept
return whether type is primitive
Definition: json.hpp:20602
constexpr bool is_null() const noexcept
return whether value is null
Definition: json.hpp:20616
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
Definition: json.hpp:23595
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)
Definition: json.hpp:23383
static std::vector< std::uint8_t > to_bson(const basic_json &j)
create a BSON serialization of a given JSON value
Definition: json.hpp:23638
basic_json(basic_json &&other) noexcept
move constructor
Definition: json.hpp:20515
iter_impl< basic_json > iterator
an iterator for a basic_json container
Definition: json.hpp:19529
basic_json(const value_t v)
create an empty value with a given type
Definition: json.hpp:20116
const_reference operator[](size_type idx) const
access specified array element
Definition: json.hpp:21407
std::ptrdiff_t difference_type
a type to represent differences between iterators
Definition: json.hpp:19516
iterator insert(const_iterator pos, basic_json &&val)
inserts element into array
Definition: json.hpp:22606
NumberUnsignedType number_unsigned_t
a type for a number (unsigned)
Definition: json.hpp:19658
void swap(string_t &other)
exchanges the values
Definition: json.hpp:22824
basic_json(const BasicJsonType &val)
create a JSON value from an existing one
Definition: json.hpp:20150
json_reverse_iterator< typename basic_json::iterator > reverse_iterator
a reverse iterator for a basic_json container
Definition: json.hpp:19533
const_reference at(size_type idx) const
access specified array element with bounds checking
Definition: json.hpp:21262
detail::actual_object_comparator_t< basic_json > object_comparator_t
object key comparator type
Definition: json.hpp:19670
basic_json(const basic_json &other)
copy constructor
Definition: json.hpp:20446
void push_back(const typename object_t::value_type &val)
add an object to an object
Definition: json.hpp:22454
static void to_cbor(const basic_json &j, detail::output_adapter< char > o)
create a CBOR serialization of a given JSON value
Definition: json.hpp:23554
constexpr bool is_object() const noexcept
return whether value is an object
Definition: json.hpp:20658
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
Definition: json.hpp:23611
static void to_msgpack(const basic_json &j, detail::output_adapter< std::uint8_t > o)
create a MessagePack serialization of a given JSON value
Definition: json.hpp:23570
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
Definition: json.hpp:23736
iterator insert_iterator(const_iterator pos, Args &&... args)
Definition: json.hpp:22567
basic_json(InputIT first, InputIT last)
construct a JSON container given an iterator range
Definition: json.hpp:20333
JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer< basic_json::string_t >) reference operator[](const
Definition: json.hpp:23925
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
Definition: json.hpp:23584
JSON_HEDLEY_RETURNS_NON_NULL const char * type_name() const noexcept
return the type as string
Definition: json.hpp:23459
bool contains(const typename object_t::key_type &key) const
check the existence of an element in a JSON object
Definition: json.hpp:22030
static void to_bson(const basic_json &j, detail::output_adapter< std::uint8_t > o)
create a BSON serialization of a given JSON value
Definition: json.hpp:23647
const_iterator find(KeyType &&key) const
find an element in a JSON object
Definition: json.hpp:21998
::nlohmann::json_pointer< StringType > json_pointer
JSON Pointer, see nlohmann::json_pointer.
Definition: json.hpp:19467
an internal type for a backed binary type
Definition: json.hpp:5892
bool operator!=(const byte_container_with_subtype &rhs) const
Definition: json.hpp:5932
byte_container_with_subtype() noexcept(noexcept(container_type()))
Definition: json.hpp:5898
std::uint64_t subtype_type
Definition: json.hpp:5895
bool operator==(const byte_container_with_subtype &rhs) const
Definition: json.hpp:5926
BinaryType container_type
Definition: json.hpp:5894
byte_container_with_subtype(container_type &&b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b))))
Definition: json.hpp:5920
byte_container_with_subtype(container_type &&b) noexcept(noexcept(container_type(std::move(b))))
Definition: json.hpp:5908
constexpr subtype_type subtype() const noexcept
return the binary subtype
Definition: json.hpp:5947
byte_container_with_subtype(const container_type &b, subtype_type subtype_) noexcept(noexcept(container_type(b)))
Definition: json.hpp:5913
constexpr bool has_subtype() const noexcept
return whether the value has a subtype
Definition: json.hpp:5954
byte_container_with_subtype(const container_type &b) noexcept(noexcept(container_type(b)))
Definition: json.hpp:5903
void set_subtype(subtype_type subtype_) noexcept
sets the binary subtype
Definition: json.hpp:5939
void clear_subtype() noexcept
clears the binary subtype
Definition: json.hpp:5961
deserialization of CBOR, MessagePack, and UBJSON values
Definition: json.hpp:9212
binary_reader(const binary_reader &)=delete
binary_reader(binary_reader &&)=default
binary_reader(InputAdapterType &&adapter, const input_format_t format=input_format_t::json) noexcept
create a binary reader
Definition: json.hpp:9228
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)
Definition: json.hpp:9249
binary_reader & operator=(binary_reader &&)=default
binary_reader & operator=(const binary_reader &)=delete
serialization to CBOR and MessagePack values
Definition: json.hpp:15078
void write_bson(const BasicJsonType &j)
Definition: json.hpp:15098
static constexpr CharType to_char_type(std::uint8_t x) noexcept
Definition: json.hpp:16833
static CharType to_char_type(std::uint8_t x) noexcept
Definition: json.hpp:16840
binary_writer(output_adapter_t< CharType > adapter)
create a binary writer
Definition: json.hpp:15089
static constexpr CharType to_char_type(InputCharType x) noexcept
Definition: json.hpp:16862
void write_ubjson(const BasicJsonType &j, const bool use_count, const bool use_type, const bool add_prefix=true, const bool use_bjdata=false)
Definition: json.hpp:15777
void write_msgpack(const BasicJsonType &j)
Definition: json.hpp:15451
void write_cbor(const BasicJsonType &j)
Definition: json.hpp:15127
general exception of the basic_json class
Definition: json.hpp:4373
const int id
the id of the exception
Definition: json.hpp:4382
static std::string diagnostics(std::nullptr_t)
Definition: json.hpp:4393
const char * what() const noexcept override
returns the explanatory string
Definition: json.hpp:4376
static std::string name(const std::string &ename, int id_)
Definition: json.hpp:4388
static std::string diagnostics(const BasicJsonType *leaf_element)
Definition: json.hpp:4399
exception indicating errors with iterators
Definition: json.hpp:4524
static invalid_iterator create(int id_, const std::string &what_arg, BasicJsonContext context)
Definition: json.hpp:4527
a template for a bidirectional iterator for the basic_json class This class implements a both iterato...
Definition: json.hpp:12915
iter_impl & operator=(const iter_impl< const BasicJsonType > &other) noexcept
converting assignment
Definition: json.hpp:13027
iter_impl operator+(difference_type i) const
add to iterator
Definition: json.hpp:13489
iter_impl & operator-=(difference_type i)
subtract from iterator
Definition: json.hpp:13480
iter_impl & operator+=(difference_type i)
add to iterator
Definition: json.hpp:13443
bool operator>=(const iter_impl &other) const
comparison: greater than or equal
Definition: json.hpp:13434
iter_impl(const iter_impl< typename std::remove_const< BasicJsonType >::type > &other) noexcept
converting constructor
Definition: json.hpp:13042
bool operator<(const iter_impl &other) const
comparison: smaller
Definition: json.hpp:13381
bool operator<=(const iter_impl &other) const
comparison: less than or equal
Definition: json.hpp:13416
iter_impl & operator++()
pre-increment (++it)
Definition: json.hpp:13244
bool operator==(const IterImpl &other) const
comparison: equal
Definition: json.hpp:13336
iter_impl operator++(int) &
post-increment (it++)
Definition: json.hpp:13233
iter_impl & operator--()
pre-decrement (–it)
Definition: json.hpp:13295
reference operator[](difference_type n) const
access to successor
Definition: json.hpp:13551
const object_t::key_type & key() const
return the key of an object iterator
Definition: json.hpp:13589
typename BasicJsonType::difference_type difference_type
a type to represent differences between iterators
Definition: json.hpp:12945
pointer operator->() const
dereference the iterator
Definition: json.hpp:13191
iter_impl & operator=(const iter_impl< typename std::remove_const< BasicJsonType >::type > &other) noexcept
converting assignment
Definition: json.hpp:13052
internal_iterator< typename std::remove_const< BasicJsonType >::type > m_it
the actual iterator of the associated instance
Definition: json.hpp:13614
difference_type operator-(const iter_impl &other) const
return difference
Definition: json.hpp:13522
iter_impl(iter_impl &&) noexcept=default
std::bidirectional_iterator_tag iterator_category
Definition: json.hpp:12940
friend iter_impl operator+(difference_type i, const iter_impl &it)
addition of distance and iterator
Definition: json.hpp:13500
reference value() const
return the value of an iterator
Definition: json.hpp:13605
bool operator>(const iter_impl &other) const
comparison: greater than
Definition: json.hpp:13425
typename std::conditional< std::is_const< BasicJsonType >::value, typename BasicJsonType::const_pointer, typename BasicJsonType::pointer >::type pointer
defines a pointer to the type iterated over (value_type)
Definition: json.hpp:12949
typename BasicJsonType::value_type value_type
the type of the values when the iterator is dereferenced
Definition: json.hpp:12943
reference operator*() const
return a reference to the value pointed to by the iterator
Definition: json.hpp:13147
iter_impl operator-(difference_type i) const
subtract from iterator
Definition: json.hpp:13511
bool operator!=(const IterImpl &other) const
comparison: not equal
Definition: json.hpp:13372
iter_impl operator--(int) &
post-decrement (it–)
Definition: json.hpp:13284
typename std::conditional< std::is_const< BasicJsonType >::value, typename BasicJsonType::const_reference, typename BasicJsonType::reference >::type reference
defines a reference to the type iterated over (value_type)
Definition: json.hpp:12954
iter_impl(const iter_impl< const BasicJsonType > &other) noexcept
const copy constructor
Definition: json.hpp:13017
void set_end() noexcept
set the iterator past the last value
Definition: json.hpp:13108
Definition: json.hpp:5187
iteration_proxy_value operator++(int) &
Definition: json.hpp:5243
iteration_proxy_value(iteration_proxy_value const &)=default
bool operator==(const iteration_proxy_value &o) const
equality operator (needed for InputIterator)
Definition: json.hpp:5252
bool operator!=(const iteration_proxy_value &o) const
inequality operator (needed for range-based for)
Definition: json.hpp:5258
std::ptrdiff_t difference_type
Definition: json.hpp:5189
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)
Definition: json.hpp:5210
iteration_proxy_value()=default
const string_type & key() const
return key of the iterator
Definition: json.hpp:5264
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
Definition: json.hpp:5194
IteratorType::reference value() const
return value of the iterator
Definition: json.hpp:5300
iteration_proxy_value & operator++()
increment operator (needed for range-based for)
Definition: json.hpp:5235
iteration_proxy_value & operator=(iteration_proxy_value const &)=default
std::input_iterator_tag iterator_category
Definition: json.hpp:5193
proxy class for the items() function
Definition: json.hpp:5308
iteration_proxy_value< IteratorType > end() const noexcept
return iterator end (needed for range-based for)
Definition: json.hpp:5333
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)
Definition: json.hpp:5327
iteration_proxy(typename IteratorType::reference cont) noexcept
construct iteration proxy from a container
Definition: json.hpp:5317
iteration_proxy & operator=(iteration_proxy const &)=default
Definition: json.hpp:14819
json_ref(json_ref &&) noexcept=default
json_ref(const value_type &value)
Definition: json.hpp:14827
json_ref(value_type &&value)
Definition: json.hpp:14823
value_type const & operator*() const
Definition: json.hpp:14858
json_ref(std::initializer_list< json_ref > init)
Definition: json.hpp:14831
json_ref(Args &&... args)
Definition: json.hpp:14838
value_type moved_or_copied() const
Definition: json.hpp:14849
BasicJsonType value_type
Definition: json.hpp:14821
value_type const * operator->() const
Definition: json.hpp:14863
a template for a reverse iterator class
Definition: json.hpp:13668
json_reverse_iterator operator++(int) &
post-increment (it++)
Definition: json.hpp:13684
json_reverse_iterator & operator++()
pre-increment (++it)
Definition: json.hpp:13690
json_reverse_iterator operator--(int) &
post-decrement (it–)
Definition: json.hpp:13696
json_reverse_iterator & operator--()
pre-decrement (–it)
Definition: json.hpp:13702
std::ptrdiff_t difference_type
Definition: json.hpp:13670
reference operator[](difference_type n) const
access to successor
Definition: json.hpp:13732
auto key() const -> decltype(std::declval< Base >().key())
return the key of an object iterator
Definition: json.hpp:13738
difference_type operator-(const json_reverse_iterator &other) const
return difference
Definition: json.hpp:13726
json_reverse_iterator & operator+=(difference_type i)
add to iterator
Definition: json.hpp:13708
typename Base::reference reference
the reference type for the pointed-to element
Definition: json.hpp:13674
reference value() const
return the value of an iterator
Definition: json.hpp:13745
json_reverse_iterator(const base_iterator &it) noexcept
create reverse iterator from base class
Definition: json.hpp:13681
std::reverse_iterator< Base > base_iterator
shortcut to the reverse iterator adapter
Definition: json.hpp:13672
json_reverse_iterator operator-(difference_type i) const
subtract from iterator
Definition: json.hpp:13720
json_reverse_iterator(const typename base_iterator::iterator_type &it) noexcept
create reverse iterator from iterator
Definition: json.hpp:13677
json_reverse_iterator operator+(difference_type i) const
add to iterator
Definition: json.hpp:13714
Definition: json.hpp:7291
typename BasicJsonType::number_unsigned_t number_unsigned_t
Definition: json.hpp:7294
bool end_object()
Definition: json.hpp:7344
bool start_object(std::size_t=static_cast< std::size_t >(-1))
Definition: json.hpp:7334
bool binary(binary_t &)
Definition: json.hpp:7329
bool number_integer(number_integer_t)
Definition: json.hpp:7309
bool start_array(std::size_t=static_cast< std::size_t >(-1))
Definition: json.hpp:7349
bool boolean(bool)
Definition: json.hpp:7304
bool end_array()
Definition: json.hpp:7354
bool number_unsigned(number_unsigned_t)
Definition: json.hpp:7314
bool string(string_t &)
Definition: json.hpp:7324
typename BasicJsonType::binary_t binary_t
Definition: json.hpp:7297
bool number_float(number_float_t, const string_t &)
Definition: json.hpp:7319
bool parse_error(std::size_t, const std::string &, const detail::exception &)
Definition: json.hpp:7359
bool key(string_t &)
Definition: json.hpp:7339
typename BasicJsonType::number_integer_t number_integer_t
Definition: json.hpp:7293
typename BasicJsonType::number_float_t number_float_t
Definition: json.hpp:7295
typename BasicJsonType::string_t string_t
Definition: json.hpp:7296
Definition: json.hpp:6984
bool boolean(bool val)
Definition: json.hpp:7015
bool parse_error(std::size_t, const std::string &, const Exception &ex)
Definition: json.hpp:7172
typename BasicJsonType::string_t string_t
Definition: json.hpp:6989
bool number_float(number_float_t val, const string_t &)
Definition: json.hpp:7033
constexpr bool is_errored() const
Definition: json.hpp:7184
bool string(string_t &val)
Definition: json.hpp:7039
json_sax_dom_callback_parser(const json_sax_dom_callback_parser &)=delete
typename BasicJsonType::number_unsigned_t number_unsigned_t
Definition: json.hpp:6987
typename BasicJsonType::binary_t binary_t
Definition: json.hpp:6990
bool start_object(std::size_t len)
Definition: json.hpp:7051
bool start_array(std::size_t len)
Definition: json.hpp:7122
typename BasicJsonType::number_integer_t number_integer_t
Definition: json.hpp:6986
bool end_array()
Definition: json.hpp:7139
json_sax_dom_callback_parser(json_sax_dom_callback_parser &&)=default
bool key(string_t &val)
Definition: json.hpp:7069
bool end_object()
Definition: json.hpp:7086
json_sax_dom_callback_parser & operator=(const json_sax_dom_callback_parser &)=delete
~json_sax_dom_callback_parser()=default
typename BasicJsonType::parse_event_t parse_event_t
Definition: json.hpp:6992
typename BasicJsonType::parser_callback_t parser_callback_t
Definition: json.hpp:6991
bool number_unsigned(number_unsigned_t val)
Definition: json.hpp:7027
json_sax_dom_callback_parser & operator=(json_sax_dom_callback_parser &&)=default
json_sax_dom_callback_parser(BasicJsonType &r, const parser_callback_t cb, const bool allow_exceptions_=true)
Definition: json.hpp:6994
typename BasicJsonType::number_float_t number_float_t
Definition: json.hpp:6988
bool number_integer(number_integer_t val)
Definition: json.hpp:7021
bool binary(binary_t &val)
Definition: json.hpp:7045
SAX implementation to create a JSON value from SAX events.
Definition: json.hpp:6801
json_sax_dom_parser & operator=(json_sax_dom_parser &&)=default
json_sax_dom_parser(const json_sax_dom_parser &)=delete
bool string(string_t &val)
Definition: json.hpp:6855
json_sax_dom_parser(BasicJsonType &r, const bool allow_exceptions_=true)
Definition: json.hpp:6814
bool parse_error(std::size_t, const std::string &, const Exception &ex)
Definition: json.hpp:6922
~json_sax_dom_parser()=default
typename BasicJsonType::string_t string_t
Definition: json.hpp:6806
bool start_object(std::size_t len)
Definition: json.hpp:6867
typename BasicJsonType::number_unsigned_t number_unsigned_t
Definition: json.hpp:6804
bool number_unsigned(number_unsigned_t val)
Definition: json.hpp:6843
bool number_integer(number_integer_t val)
Definition: json.hpp:6837
typename BasicJsonType::number_integer_t number_integer_t
Definition: json.hpp:6803
bool binary(binary_t &val)
Definition: json.hpp:6861
json_sax_dom_parser(json_sax_dom_parser &&)=default
bool boolean(bool val)
Definition: json.hpp:6831
bool end_array()
Definition: json.hpp:6911
json_sax_dom_parser & operator=(const json_sax_dom_parser &)=delete
bool number_float(number_float_t val, const string_t &)
Definition: json.hpp:6849
bool end_object()
Definition: json.hpp:6889
constexpr bool is_errored() const
Definition: json.hpp:6934
typename BasicJsonType::binary_t binary_t
Definition: json.hpp:6807
typename BasicJsonType::number_float_t number_float_t
Definition: json.hpp:6805
bool start_array(std::size_t len)
Definition: json.hpp:6899
bool key(string_t &val)
Definition: json.hpp:6879
Definition: json.hpp:7408
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)
Definition: json.hpp:7435
token_type
token types for the parser
Definition: json.hpp:7412
lexical analysis
Definition: json.hpp:7485
bool skip_bom()
skip the UTF-8 byte order mark
Definition: json.hpp:8859
void skip_whitespace()
Definition: json.hpp:8873
lexer & operator=(lexer &&)=default
lexer(InputAdapterType &&adapter, bool ignore_comments_=false) noexcept
Definition: json.hpp:7496
std::string get_token_string() const
Definition: json.hpp:8821
constexpr number_integer_t get_number_integer() const noexcept
return integer value
Definition: json.hpp:8785
constexpr position_t get_position() const noexcept
return position of last read token
Definition: json.hpp:8813
token_type scan()
Definition: json.hpp:8881
constexpr number_unsigned_t get_number_unsigned() const noexcept
return unsigned integer value
Definition: json.hpp:8791
typename lexer_base< BasicJsonType >::token_type token_type
Definition: json.hpp:7494
string_t & get_string()
return current string value (implicitly resets the token; useful only once)
Definition: json.hpp:8803
lexer & operator=(lexer &)=delete
lexer(const lexer &)=delete
constexpr JSON_HEDLEY_RETURNS_NON_NULL const char * get_error_message() const noexcept
return syntax error message
Definition: json.hpp:8846
constexpr number_float_t get_number_float() const noexcept
return floating-point value
Definition: json.hpp:8797
exception indicating other library errors
Definition: json.hpp:4576
static other_error create(int id_, const std::string &what_arg, BasicJsonContext context)
Definition: json.hpp:4579
exception indicating access out of the defined range
Definition: json.hpp:4559
static out_of_range create(int id_, const std::string &what_arg, BasicJsonContext context)
Definition: json.hpp:4562
Definition: json.hpp:15036
output_adapter(StringType &s)
Definition: json.hpp:15047
output_adapter(std::basic_ostream< CharType > &s)
Definition: json.hpp:15043
output_adapter(std::vector< CharType, AllocatorType > &vec)
Definition: json.hpp:15039
output adapter for output streams
Definition: json.hpp:14988
output_stream_adapter(std::basic_ostream< CharType > &s) noexcept
Definition: json.hpp:14990
void write_character(CharType c) override
Definition: json.hpp:14994
output adapter for basic_string
Definition: json.hpp:15013
void write_character(CharType c) override
Definition: json.hpp:15019
output_string_adapter(StringType &s) noexcept
Definition: json.hpp:15015
output adapter for byte vectors
Definition: json.hpp:14963
output_vector_adapter(std::vector< CharType, AllocatorType > &vec) noexcept
Definition: json.hpp:14965
void write_character(CharType c) override
Definition: json.hpp:14969
exception indicating a parse error
Definition: json.hpp:4471
static parse_error create(int id_, const position_t &pos, const std::string &what_arg, BasicJsonContext context)
create a parse error exception
Definition: json.hpp:4483
static parse_error create(int id_, std::size_t byte_, const std::string &what_arg, BasicJsonContext context)
Definition: json.hpp:4491
const std::size_t byte
byte index of the parse error
Definition: json.hpp:4508
syntax analysis
Definition: json.hpp:12228
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
Definition: json.hpp:12238
void parse(const bool strict, BasicJsonType &result)
public parser interface
Definition: json.hpp:12260
bool accept(const bool strict=true)
public accept interface
Definition: json.hpp:12320
bool sax_parse(SAX *sax, const bool strict=true)
Definition: json.hpp:12328
Definition: json.hpp:12732
primitive_iterator_t & operator+=(difference_type n) noexcept
Definition: json.hpp:12820
primitive_iterator_t & operator--() noexcept
Definition: json.hpp:12807
constexpr bool is_begin() const noexcept
return whether the iterator can be dereferenced
Definition: json.hpp:12761
constexpr friend bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
Definition: json.hpp:12777
primitive_iterator_t & operator++() noexcept
Definition: json.hpp:12794
void set_end() noexcept
set iterator to a defined past the end
Definition: json.hpp:12755
constexpr friend difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
Definition: json.hpp:12789
constexpr bool is_end() const noexcept
return whether the iterator is at end
Definition: json.hpp:12767
primitive_iterator_t operator++(int) &noexcept
Definition: json.hpp:12800
constexpr difference_type get_value() const noexcept
Definition: json.hpp:12743
primitive_iterator_t operator+(difference_type n) noexcept
Definition: json.hpp:12782
primitive_iterator_t & operator-=(difference_type n) noexcept
Definition: json.hpp:12826
void set_begin() noexcept
set iterator to a defined beginning
Definition: json.hpp:12749
primitive_iterator_t operator--(int) &noexcept
Definition: json.hpp:12813
constexpr friend bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
Definition: json.hpp:12772
Definition: json.hpp:18059
serializer & operator=(serializer &&)=delete
std::array< char, 512 > string_buffer
string buffer
Definition: json.hpp:18983
std::uint8_t state
Definition: json.hpp:18401
std::size_t bytes_after_last_accept
Definition: json.hpp:18405
serializer(output_adapter_t< char > s, const char ichar, error_handler_t error_handler_=error_handler_t::strict)
Definition: json.hpp:18074
JSON_PRIVATE_UNLESS_TESTED const bool ensure_ascii
Definition: json.hpp:18399
std::size_t undumped_chars
Definition: json.hpp:18406
const char thousands_sep
the locale's thousand separator character
Definition: json.hpp:18978
const char decimal_point
the locale's decimal point character
Definition: json.hpp:18980
const error_handler_t error_handler
error_handler how to react on decoding errors
Definition: json.hpp:18991
string_t indent_string
the indentation string
Definition: json.hpp:18988
const std::lconv * loc
the locale
Definition: json.hpp:18976
serializer & operator=(const serializer &)=delete
std::array< char, 64 > number_buffer
a (hopefully) large enough character buffer
Definition: json.hpp:18973
const char indent_char
the indentation character
Definition: json.hpp:18986
std::size_t bytes
Definition: json.hpp:18402
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
Definition: json.hpp:18114
serializer(const serializer &)=delete
serializer(serializer &&)=delete
exception indicating executing a member function with a wrong type
Definition: json.hpp:4542
static type_error create(int id_, const std::string &what_arg, BasicJsonContext context)
Definition: json.hpp:4545
JSON Pointer defines a string syntax for identifying a specific value within a JSON document.
Definition: json.hpp:13840
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
Definition: json.hpp:13935
json_pointer & operator/=(string_t token)
append an unescaped reference token at the end of this JSON pointer
Definition: json.hpp:13912
typename string_t_helper< RefStringType >::type string_t
Definition: json.hpp:13862
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
Definition: json.hpp:13942
json_pointer & operator/=(const json_pointer &ptr)
append another JSON pointer at the end of this JSON pointer
Definition: json.hpp:13902
json_pointer(const string_t &s="")
create JSON pointer
Definition: json.hpp:13866
bool empty() const noexcept
return whether pointer points to the root document
Definition: json.hpp:14001
friend bool operator==(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
compares two JSON pointers for equality
Definition: json.hpp:14735
friend std::ostream & operator<<(std::ostream &o, const json_pointer &ptr)
write string representation of the JSON pointer to stream
Definition: json.hpp:13893
void pop_back()
remove last reference token
Definition: json.hpp:13963
string_t to_string() const
return a string representation of the JSON pointer
Definition: json.hpp:13872
void push_back(string_t &&token)
append an unescaped token at the end of the reference pointer
Definition: json.hpp:13994
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
Definition: json.hpp:13927
json_pointer parent_pointer() const
returns the parent of this JSON pointer
Definition: json.hpp:13949
friend bool operator!=(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
compares two JSON pointers for inequality
Definition: json.hpp:14760
friend class json_pointer
Definition: json.hpp:13846
const string_t & back() const
return last reference token
Definition: json.hpp:13975
void push_back(const string_t &token)
append an unescaped token at the end of the reference pointer
Definition: json.hpp:13987
friend bool operator<(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
compares two JSON pointer for less-than
Definition: json.hpp:14785
json_pointer & operator/=(std::size_t array_idx)
append an array index at the end of this JSON pointer
Definition: json.hpp:13920
decltype(get< N >(std::declval< ::nlohmann::detail::iteration_proxy_value< IteratorType > >())) type
Definition: json.hpp:5381
#define NLOHMANN_BASIC_JSON_TPL_DECLARATION
Definition: json.hpp:2596
#define JSON_HEDLEY_CONST
Definition: json.hpp:1818
#define JSON_HEDLEY_DIAGNOSTIC_PUSH
Definition: json.hpp:1102
#define JSON_INLINE_VARIABLE
Definition: json.hpp:2499
#define JSON_HEDLEY_WARN_UNUSED_RESULT
Definition: json.hpp:1448
#define JSON_PRIVATE_UNLESS_TESTED
Definition: json.hpp:2559
#define NLOHMANN_JSON_VERSION_PATCH
Definition: json.hpp:70
#define JSON_HEDLEY_LIKELY(expr)
Definition: json.hpp:1713
#define JSON_HEDLEY_NON_NULL(...)
Definition: json.hpp:1606
#define JSON_INTERNAL_CATCH(exception)
Definition: json.hpp:2526
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Definition: json.hpp:24455
#define JSON_HEDLEY_RETURNS_NON_NULL
Definition: json.hpp:2047
bool operator==(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition: json.hpp:14735
#define JSON_CATCH(exception)
Definition: json.hpp:2525
#define JSON_ASSERT(x)
Definition: json.hpp:2552
#define JSON_THROW(exception)
Definition: json.hpp:2523
#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
Definition: json.hpp:77
#define NLOHMANN_JSON_VERSION_MAJOR
Definition: json.hpp:68
#define NLOHMANN_BASIC_JSON_TPL
Definition: json.hpp:2606
#define JSON_HEDLEY_UNLIKELY(expr)
Definition: json.hpp:1714
#define JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_
Definition: json.hpp:12118
#define JSON_TRY
Definition: json.hpp:2524
#define NLOHMANN_JSON_NAMESPACE_END
Definition: json.hpp:144
#define JSON_NO_UNIQUE_ADDRESS
Definition: json.hpp:2505
bool operator!=(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition: json.hpp:14760
#define NLOHMANN_JSON_VERSION_MINOR
Definition: json.hpp:69
#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name)
Definition: json.hpp:2786
#define NLOHMANN_JSON_NAMESPACE_BEGIN
Definition: json.hpp:134
#define JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_
Definition: json.hpp:12115
basic_json<> json
default specialization
Definition: json.hpp:3423
#define JSON_HEDLEY_DIAGNOSTIC_POP
Definition: json.hpp:1103
#define JSON_EXPLICIT
Definition: json.hpp:2823
#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement)
Definition: json.hpp:1396
#define JSON_HEDLEY_PURE
Definition: json.hpp:1787
bool operator<(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition: json.hpp:14785
#define JSON_IMPLEMENT_OPERATOR(op, null_result, unordered_result, default_result)
Definition: json.hpp:22881
fill
Definition: OrderbookView.py:93
root
Definition: addOrder.py:127
int find_largest_pow10(const std::uint32_t n, std::uint32_t &pow10)
Definition: json.hpp:17398
cached_power get_cached_power_for_binary_exponent(int e)
Definition: json.hpp:17234
Target reinterpret_bits(const Source source)
Definition: json.hpp:16954
boundaries compute_boundaries(FloatType value)
Definition: json.hpp:17095
JSON_HEDLEY_RETURNS_NON_NULL char * append_exponent(char *buf, int e)
appends a decimal representation of e to buf
Definition: json.hpp:17834
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
Definition: json.hpp:17886
void grisu2_round(char *buf, int len, std::uint64_t dist, std::uint64_t delta, std::uint64_t rest, std::uint64_t ten_k)
Definition: json.hpp:17452
constexpr int kAlpha
Definition: json.hpp:17217
void grisu2(char *buf, int &len, int &decimal_exponent, diyfp m_minus, diyfp v, diyfp m_plus)
Definition: json.hpp:17734
constexpr int kGamma
Definition: json.hpp:17218
void grisu2_digit_gen(char *buffer, int &length, int &decimal_exponent, diyfp M_minus, diyfp w, diyfp M_plus)
Definition: json.hpp:17493
constexpr bool is_transparent()
Definition: json.hpp:4195
constexpr bool is_c_string()
Definition: json.hpp:4167
detail namespace with internal helper functions
Definition: json.hpp:249
input_format_t
the supported input formats
Definition: json.hpp:6177
void to_json_tuple_impl(BasicJsonType &j, const Tuple &t, index_sequence< Idx... >)
Definition: json.hpp:5781
std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact
Definition: json.hpp:309
typename make_void< Ts... >::type void_t
Definition: json.hpp:255
decltype(std::declval< T & >().start_array(std::declval< std::size_t >())) start_array_function_t
Definition: json.hpp:9074
std::shared_ptr< output_adapter_protocol< CharType > > output_adapter_t
a type to simplify interfaces
Definition: json.hpp:14958
decltype(std::declval< StringType & >()+=std::declval< Arg && >()) string_can_append_op
Definition: json.hpp:4276
decltype(std::declval< T & >().parse_error(std::declval< std::size_t >(), std::declval< const std::string & >(), std::declval< const Exception & >())) parse_error_function_t
Definition: json.hpp:9082
constexpr std::array< T, sizeof...(Args)> make_array(Args &&... args)
Definition: json.hpp:3223
std::function< bool(int, parse_event_t, BasicJsonType &)> parser_callback_t
Definition: json.hpp:12219
OutStringType concat(Args &&... args)
Definition: json.hpp:4350
is_detected< string_can_append_iter, StringType, Arg > detect_string_can_append_iter
Definition: json.hpp:4285
std::pair< A1, A2 > from_json_tuple_impl(BasicJsonType &&j, identity_tag< std::pair< A1, A2 >>, priority_tag< 0 >)
Definition: json.hpp:5011
decltype(T::to_json(std::declval< Args >()...)) to_json_function
Definition: json.hpp:3518
decltype(std::declval< T >().template get< U >()) get_template_function
Definition: json.hpp:3524
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
Definition: json.hpp:4017
void to_json(BasicJsonType &j, const T &b)
Definition: json.hpp:5775
typename T::pointer pointer_t
Definition: json.hpp:3509
decltype(std::declval< StringType & >().append(std::declval< Arg && >())) string_can_append
Definition: json.hpp:4270
parse_event_t
Definition: json.hpp:12202
@ 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
is_detected< string_can_append_op, StringType, Arg > detect_string_can_append_op
Definition: json.hpp:4279
integer_sequence< size_t, Ints... > index_sequence
Definition: json.hpp:3138
void from_json_array_impl(const BasicJsonType &j, typename BasicJsonType::array_t &arr, priority_tag< 3 >)
Definition: json.hpp:4822
typename utility_internal::Gen< T, N >::type make_integer_sequence
Definition: json.hpp:3184
typename T::value_type value_type_t
Definition: json.hpp:3503
std::is_convertible< detected_t< Op, Args... >, To > is_detected_convertible
Definition: json.hpp:313
T conditional_static_cast(U value)
Definition: json.hpp:4051
is_detected< string_can_append_data, StringType, Arg > detect_string_can_append_data
Definition: json.hpp:4291
typename std::enable_if< B, T >::type enable_if_t
Definition: json.hpp:3096
void from_json(const BasicJsonType &j, std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > &m)
Definition: json.hpp:5070
decltype(std::declval< T & >().number_integer(std::declval< Integer >())) number_integer_function_t
Definition: json.hpp:9043
typename T::mapped_type mapped_type_t
Definition: json.hpp:3497
void replace_substring(StringType &s, const StringType &f, const StringType &t)
replace all occurrences of a substring by another string
Definition: json.hpp:2971
decltype(std::declval< T & >().number_float(std::declval< Float >(), std::declval< const String & >())) number_float_function_t
Definition: json.hpp:9051
enable_if_t< is_range< R >::value, result_of_begin< decltype(std::declval< R & >())> > iterator_t
Definition: json.hpp:3745
auto get(const nlohmann::detail::iteration_proxy_value< IteratorType > &i) -> decltype(i.key())
Definition: json.hpp:5343
cbor_tag_handler_t
how to treat CBOR tags
Definition: json.hpp:9185
@ store
store tags as binary type
@ error
throw a parse_error exception in case of a tag
typename detected_or< Default, Op, Args... >::type detected_or_t
Definition: json.hpp:306
decltype(T::from_json(std::declval< Args >()...)) from_json_function
Definition: json.hpp:3521
decltype(input_adapter(std::declval< const char * >(), std::declval< const char * >())) contiguous_bytes_input_adapter
Definition: json.hpp:6579
make_integer_sequence< size_t, N > make_index_sequence
Definition: json.hpp:3192
std::integral_constant< bool, Value > bool_constant
Definition: json.hpp:4157
void concat_into(OutStringType &)
Definition: json.hpp:4266
typename T::key_type key_type_t
Definition: json.hpp:3500
constexpr bool value_in_range_of(T val)
Definition: json.hpp:4151
value_t
the JSON type enumeration
Definition: json.hpp:2873
@ 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)
std::integral_constant< bool, all_signed< Types... >::value||all_unsigned< Types... >::value > same_sign
Definition: json.hpp:4074
iterator_input_adapter_factory< IteratorType >::adapter_type input_adapter(IteratorType first, IteratorType last)
Definition: json.hpp:6522
std::tuple< Args... > from_json_tuple_impl_base(BasicJsonType &&j, index_sequence< Idx... >)
Definition: json.hpp:5005
decltype(std::declval< T & >().binary(std::declval< Binary & >())) binary_function_t
Definition: json.hpp:9059
typename detector< nonesuch, void, Op, Args... >::type detected_t
Definition: json.hpp:300
std::size_t hash(const BasicJsonType &j)
hash a JSON value
Definition: json.hpp:6023
decltype(std::declval< StringType & >().append(std::declval< const Arg & >().begin(), std::declval< const Arg & >().end())) string_can_append_iter
Definition: json.hpp:4282
typename T::iterator_category iterator_category_t
Definition: json.hpp:3515
std::size_t combine(std::size_t seed, std::size_t h) noexcept
Definition: json.hpp:6005
bool operator<(const value_t lhs, const value_t rhs) noexcept
comparison operator for JSON types
Definition: json.hpp:2902
decltype(std::declval< T & >().end_array()) end_array_function_t
Definition: json.hpp:9077
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).
Definition: json.hpp:17971
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
Definition: json.hpp:4029
error_handler_t
how to treat decoding errors
Definition: json.hpp:18051
@ 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()
Definition: json.hpp:4235
value_type_t< iterator_traits< iterator_t< T > >> range_value_t
Definition: json.hpp:3748
void from_json(const BasicJsonType &j, typename std::nullptr_t &n)
Definition: json.hpp:4665
typename actual_object_comparator< BasicJsonType >::type actual_object_comparator_t
Definition: json.hpp:3597
void to_json(BasicJsonType &j, T b) noexcept
Definition: json.hpp:5643
void get_arithmetic_value(const BasicJsonType &j, ArithmeticType &val)
Definition: json.hpp:4679
decltype(std::declval< T & >().null()) null_function_t
Definition: json.hpp:9035
make_index_sequence< sizeof...(Ts)> index_sequence_for
Definition: json.hpp:3200
typename T::difference_type difference_type_t
Definition: json.hpp:3506
typename std::remove_cv< typename std::remove_reference< T >::type >::type uncvref_t
Definition: json.hpp:3082
typename T::is_transparent detect_is_transparent
Definition: json.hpp:3987
decltype(std::declval< T & >().string(std::declval< String & >())) string_function_t
Definition: json.hpp:9055
typename std::conditional< std::is_same< T, void >::value, json_default_base, T >::type json_base_class
Definition: json.hpp:13794
typename T::reference reference_t
Definition: json.hpp:3512
decltype(std::declval< T & >().boolean(std::declval< bool >())) boolean_function_t
Definition: json.hpp:9039
decltype(std::declval< T & >().end_object()) end_object_function_t
Definition: json.hpp:9070
decltype(std::declval< ObjectType & >().erase(std::declval< KeyType >())) detect_erase_with_key_type
Definition: json.hpp:4020
typename T::key_compare detect_key_compare
Definition: json.hpp:3581
decltype(std::declval< T & >().start_object(std::declval< std::size_t >())) start_object_function_t
Definition: json.hpp:9063
decltype(std::declval< StringType & >().append(std::declval< const Arg & >().data(), std::declval< const Arg & >().size())) string_can_append_data
Definition: json.hpp:4288
decltype(std::declval< T & >().number_unsigned(std::declval< Unsigned >())) number_unsigned_function_t
Definition: json.hpp:9047
typename detector< nonesuch, void, Op, Args... >::value_t is_detected
Definition: json.hpp:294
StringType escape(StringType s)
string escaping as described in RFC 6901 (Sect. 4)
Definition: json.hpp:2991
void int_to_string(string_type &target, std::size_t value)
Definition: json.hpp:5180
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
Definition: json.hpp:4079
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
Definition: json.hpp:4001
is_detected< string_can_append, StringType, Arg > detect_string_can_append
Definition: json.hpp:4273
std::array< T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJsonType &&j, identity_tag< std::array< T, sizeof...(Idx)>>, index_sequence< Idx... >)
Definition: json.hpp:4905
decltype(std::declval< T & >().key(std::declval< String & >())) key_function_t
Definition: json.hpp:9067
Definition: json.hpp:24461
Definition: json.hpp:5364
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression, cppcoreguidelines-noexcept-swap, performance-noexcept-swap) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
Definition: json.hpp:24536
namespace for Niels Lohmann
Definition: json.hpp:5834
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
Definition: json.hpp:5858
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
Definition: json.hpp:5848
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
Definition: json.hpp:5838
Definition: json.hpp:3589
typename BasicJsonType::object_t object_t
Definition: json.hpp:3590
typename BasicJsonType::default_object_comparator_t object_comparator_t
Definition: json.hpp:3591
typename std::conditional< has_key_compare< object_t >::value, typename object_t::key_compare, object_comparator_t >::type type
Definition: json.hpp:3593
signed char char_type
Definition: json.hpp:3636
static constexpr int_type eof() noexcept
Definition: json.hpp:3650
uint64_t int_type
Definition: json.hpp:3637
static char_type to_char_type(int_type i) noexcept
Definition: json.hpp:3645
static int_type to_int_type(char_type c) noexcept
Definition: json.hpp:3640
static char_type to_char_type(int_type i) noexcept
Definition: json.hpp:3621
static constexpr int_type eof() noexcept
Definition: json.hpp:3626
unsigned char char_type
Definition: json.hpp:3612
uint64_t int_type
Definition: json.hpp:3613
static int_type to_int_type(char_type c) noexcept
Definition: json.hpp:3616
Definition: json.hpp:3606
Definition: json.hpp:3662
Definition: json.hpp:3661
std::true_type value_t
Definition: json.hpp:289
Op< Args... > type
Definition: json.hpp:290
std::false_type value_t
Definition: json.hpp:282
Default type
Definition: json.hpp:283
Definition: json.hpp:17082
diyfp w
Definition: json.hpp:17083
diyfp minus
Definition: json.hpp:17084
diyfp plus
Definition: json.hpp:17085
Definition: json.hpp:17221
std::uint64_t f
Definition: json.hpp:17222
int e
Definition: json.hpp:17223
int k
Definition: json.hpp:17224
Definition: json.hpp:16964
static diyfp mul(const diyfp &x, const diyfp &y) noexcept
returns x * y
Definition: json.hpp:16988
static diyfp normalize_to(const diyfp &x, const int target_exponent) noexcept
normalize x such that the result has the exponent E
Definition: json.hpp:17070
static diyfp normalize(diyfp x) noexcept
normalize x such that the significand is >= 2^(q-1)
Definition: json.hpp:17053
static diyfp sub(const diyfp &x, const diyfp &y) noexcept
returns x - y
Definition: json.hpp:16976
constexpr diyfp(std::uint64_t f_, int e_) noexcept
Definition: json.hpp:16970
static constexpr int kPrecision
Definition: json.hpp:16965
std::uint64_t f
Definition: json.hpp:16967
int e
Definition: json.hpp:16968
static void construct(BasicJsonType &j, const std::vector< bool > &arr)
Definition: json.hpp:5568
static void construct(BasicJsonType &j, typename BasicJsonType::array_t &&arr)
Definition: json.hpp:5543
static void construct(BasicJsonType &j, const typename BasicJsonType::array_t &arr)
Definition: json.hpp:5533
static void construct(BasicJsonType &j, const CompatibleArrayType &arr)
Definition: json.hpp:5555
static void construct(BasicJsonType &j, const std::valarray< T > &arr)
Definition: json.hpp:5584
static void construct(BasicJsonType &j, const typename BasicJsonType::binary_t &b)
Definition: json.hpp:5472
static void construct(BasicJsonType &j, typename BasicJsonType::binary_t &&b)
Definition: json.hpp:5481
static void construct(BasicJsonType &j, typename BasicJsonType::boolean_t b) noexcept
Definition: json.hpp:5426
static void construct(BasicJsonType &j, typename BasicJsonType::number_float_t val) noexcept
Definition: json.hpp:5494
static void construct(BasicJsonType &j, typename BasicJsonType::number_integer_t val) noexcept
Definition: json.hpp:5520
static void construct(BasicJsonType &j, typename BasicJsonType::number_unsigned_t val) noexcept
Definition: json.hpp:5507
static void construct(BasicJsonType &j, const typename BasicJsonType::object_t &obj)
Definition: json.hpp:5603
static void construct(BasicJsonType &j, const CompatibleObjectType &obj)
Definition: json.hpp:5624
static void construct(BasicJsonType &j, typename BasicJsonType::object_t &&obj)
Definition: json.hpp:5613
static void construct(BasicJsonType &j, typename BasicJsonType::string_t &&s)
Definition: json.hpp:5448
static void construct(BasicJsonType &j, const CompatibleStringType &str)
Definition: json.hpp:5459
static void construct(BasicJsonType &j, const typename BasicJsonType::string_t &s)
Definition: json.hpp:5439
Definition: json.hpp:5420
Definition: json.hpp:5100
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)))
Definition: json.hpp:5102
typename BasicJsonType::template json_serializer< T, void > serializer
Definition: json.hpp:3543
Definition: json.hpp:3528
Definition: json.hpp:3584
typename BasicJsonType::template json_serializer< T, void > serializer
Definition: json.hpp:3558
Definition: json.hpp:3553
typename BasicJsonType::template json_serializer< T, void > serializer
Definition: json.hpp:3573
Definition: json.hpp:3568
Definition: json.hpp:4616
Definition: json.hpp:3124
T value_type
Definition: json.hpp:3125
static constexpr std::size_t size() noexcept
Definition: json.hpp:3126
an iterator value
Definition: json.hpp:12848
BasicJsonType::array_t::iterator array_iterator
iterator for JSON arrays
Definition: json.hpp:12852
primitive_iterator_t primitive_iterator
generic iterator for all other types
Definition: json.hpp:12854
BasicJsonType::object_t::iterator object_iterator
iterator for JSON objects
Definition: json.hpp:12850
Definition: json.hpp:3477
Definition: json.hpp:3464
Definition: json.hpp:4182
Definition: json.hpp:3978
Definition: json.hpp:3842
Definition: json.hpp:3861
std::numeric_limits< RealIntegerType > RealLimits
Definition: json.hpp:3919
std::numeric_limits< CompatibleNumberIntegerType > CompatibleLimits
Definition: json.hpp:3920
Definition: json.hpp:3909
Definition: json.hpp:3932
typename BasicJsonType::object_t object_t
Definition: json.hpp:3770
Definition: json.hpp:3762
Definition: json.hpp:3782
Definition: json.hpp:3819
static constexpr auto value
Definition: json.hpp:3820
Definition: json.hpp:3935
Definition: json.hpp:3948
Definition: json.hpp:3755
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
Definition: json.hpp:3891
Definition: json.hpp:3864
Definition: json.hpp:3905
typename BasicJsonType::object_t object_t
Definition: json.hpp:3794
Definition: json.hpp:3786
Definition: json.hpp:3815
Definition: json.hpp:3826
ConstructibleStringType laundered_type
Definition: json.hpp:3831
static constexpr auto value
Definition: json.hpp:3834
Definition: json.hpp:3951
Definition: json.hpp:3693
Definition: json.hpp:3674
Definition: json.hpp:3536
static constexpr bool value
Definition: json.hpp:3537
Definition: json.hpp:6498
typename std::iterator_traits< T >::value_type value_type
Definition: json.hpp:6499
Definition: json.hpp:3708
Definition: json.hpp:3957
Definition: json.hpp:3487
Definition: json.hpp:4039
char x[2]
Definition: json.hpp:4040
Definition: json.hpp:4035
static one test(decltype(&C::capacity))
@ value
Definition: json.hpp:4046
char one
Definition: json.hpp:4036
Definition: json.hpp:3727
static constexpr bool value
Definition: json.hpp:3741
Definition: json.hpp:9117
Definition: json.hpp:9086
static constexpr bool value
Definition: json.hpp:9099
Definition: json.hpp:3968
Definition: json.hpp:4204
T value_type
Definition: json.hpp:3305
T * pointer
Definition: json.hpp:3307
ptrdiff_t difference_type
Definition: json.hpp:3306
T & reference
Definition: json.hpp:3308
std::random_access_iterator_tag iterator_category
Definition: json.hpp:3304
Definition: json.hpp:3292
typename It::iterator_category iterator_category
Definition: json.hpp:3285
typename It::difference_type difference_type
Definition: json.hpp:3281
typename It::value_type value_type
Definition: json.hpp:3282
typename It::reference reference
Definition: json.hpp:3284
typename It::pointer pointer
Definition: json.hpp:3283
Definition: json.hpp:3273
Default base class of the basic_json class.
Definition: json.hpp:13787
void type
Definition: json.hpp:253
Definition: json.hpp:3668
nonesuch(nonesuch const &&)=delete
void operator=(nonesuch &&)=delete
void operator=(nonesuch const &)=delete
nonesuch(nonesuch const &)=delete
abstract output adapter interface
Definition: json.hpp:14944
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
Definition: json.hpp:3037
std::size_t chars_read_current_line
the number of characters read in the current line
Definition: json.hpp:3041
std::size_t lines_read
the number of lines read
Definition: json.hpp:3043
std::size_t chars_read_total
the total number of characters read
Definition: json.hpp:3039
Definition: json.hpp:3208
Definition: json.hpp:3207
Definition: json.hpp:3213
static constexpr JSON_INLINE_VARIABLE T value
Definition: json.hpp:3214
Definition: json.hpp:5801
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())
Definition: json.hpp:5803
Definition: json.hpp:3144
Definition: json.hpp:3163
typename Extend< typename Gen< T, N/2 >::type, N/2, N % 2 >::type type
Definition: json.hpp:3165
static constexpr bool test(T val)
Definition: json.hpp:4135
static constexpr bool test(T)
Definition: json.hpp:4144
Definition: json.hpp:4130
static constexpr bool test(T val)
Definition: json.hpp:4089
static constexpr bool test(T val)
Definition: json.hpp:4109
static constexpr bool test(T val)
Definition: json.hpp:4099
static constexpr bool test(T val)
Definition: json.hpp:4119
Definition: json.hpp:4084
SAX interface.
Definition: json.hpp:6671
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
Definition: json.hpp:6672
typename BasicJsonType::string_t string_t
Definition: json.hpp:6675
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
Definition: json.hpp:6674
typename BasicJsonType::number_unsigned_t number_unsigned_t
Definition: json.hpp:6673
json_sax(json_sax &&) noexcept=default
typename BasicJsonType::binary_t binary_t
Definition: json.hpp:6676
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
Definition: json.hpp:19033
const T & at(const key_type &key) const
Definition: json.hpp:19137
std::vector< std::pair< const Key, T >, Allocator > Container
Definition: json.hpp:19036
const T & operator[](const key_type &key) const
Definition: json.hpp:19097
std::pair< iterator, bool > emplace(KeyType &&key, T &&t)
Definition: json.hpp:19072
typename Container::value_type value_type
Definition: json.hpp:19040
std::equal_to< Key > key_compare
Definition: json.hpp:19044
iterator erase(iterator pos)
Definition: json.hpp:19205
T mapped_type
Definition: json.hpp:19035
ordered_map(const Allocator &alloc) noexcept(noexcept(Container(alloc)))
Definition: json.hpp:19050
typename Container::iterator iterator
Definition: json.hpp:19037
T & operator[](KeyType &&key)
Definition: json.hpp:19092
iterator find(const key_type &key)
Definition: json.hpp:19289
T & at(const key_type &key)
Definition: json.hpp:19109
iterator erase(iterator first, iterator last)
Definition: json.hpp:19210
const_iterator find(const key_type &key) const
Definition: json.hpp:19315
std::pair< iterator, bool > insert(const value_type &value)
Definition: json.hpp:19332
size_type erase(KeyType &&key)
Definition: json.hpp:19186
typename Container::size_type size_type
Definition: json.hpp:19039
const T & at(KeyType &&key) const
Definition: json.hpp:19152
std::pair< iterator, bool > emplace(const key_type &key, T &&t)
Definition: json.hpp:19057
ordered_map() noexcept(noexcept(Container()))
Definition: json.hpp:19049
void insert(InputIt first, InputIt last)
Definition: json.hpp:19350
T & operator[](const key_type &key)
Definition: json.hpp:19085
size_type count(const key_type &key) const
Definition: json.hpp:19263
size_type erase(const key_type &key)
Definition: json.hpp:19165
std::pair< iterator, bool > insert(value_type &&value)
Definition: json.hpp:19327
ordered_map(std::initializer_list< value_type > init, const Allocator &alloc=Allocator())
Definition: json.hpp:19054
size_type count(KeyType &&key) const
Definition: json.hpp:19277
Key key_type
Definition: json.hpp:19034
ordered_map(It first, It last, const Allocator &alloc=Allocator())
Definition: json.hpp:19052
typename std::enable_if< std::is_convertible< typename std::iterator_traits< InputIt >::iterator_category, std::input_iterator_tag >::value >::type require_input_iter
Definition: json.hpp:19347
iterator find(KeyType &&key)
Definition: json.hpp:19303
T & at(KeyType &&key)
Definition: json.hpp:19124
typename Container::const_iterator const_iterator
Definition: json.hpp:19038
const T & operator[](KeyType &&key) const
Definition: json.hpp:19104
std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL &j) const
Definition: json.hpp:24505
bool operator()(::nlohmann::detail::value_t lhs, ::nlohmann::detail::value_t rhs) const noexcept
compare two value_t enum values
Definition: json.hpp:24519