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