1 #pragma once
2 
3 #include <utility> // pair
4 #include <nlohmann/thirdparty/hedley/hedley.hpp>
5 
6 // This file contains all internal macro definitions
7 // You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
8 
9 // exclude unsupported compilers
10 #if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
11     #if defined(__clang__)
12         #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
13             #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
14         #endif
15     #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
16         #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
17             #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
18         #endif
19     #endif
20 #endif
21 
22 // C++ language standard detection
23 #if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
24     #define JSON_HAS_CPP_17
25     #define JSON_HAS_CPP_14
26 #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
27     #define JSON_HAS_CPP_14
28 #endif
29 
30 // disable float-equal warnings on GCC/clang
31 #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
32     #pragma GCC diagnostic push
33     #pragma GCC diagnostic ignored "-Wfloat-equal"
34 #endif
35 
36 // disable documentation warnings on clang
37 #if defined(__clang__)
38     #pragma GCC diagnostic push
39     #pragma GCC diagnostic ignored "-Wdocumentation"
40 #endif
41 
42 // allow to disable exceptions
43 #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
44     #define JSON_THROW(exception) throw exception
45     #define JSON_TRY try
46     #define JSON_CATCH(exception) catch(exception)
47     #define JSON_INTERNAL_CATCH(exception) catch(exception)
48 #else
49     #include <cstdlib>
50     #define JSON_THROW(exception) std::abort()
51     #define JSON_TRY if(true)
52     #define JSON_CATCH(exception) if(false)
53     #define JSON_INTERNAL_CATCH(exception) if(false)
54 #endif
55 
56 // override exception macros
57 #if defined(JSON_THROW_USER)
58     #undef JSON_THROW
59     #define JSON_THROW JSON_THROW_USER
60 #endif
61 #if defined(JSON_TRY_USER)
62     #undef JSON_TRY
63     #define JSON_TRY JSON_TRY_USER
64 #endif
65 #if defined(JSON_CATCH_USER)
66     #undef JSON_CATCH
67     #define JSON_CATCH JSON_CATCH_USER
68     #undef JSON_INTERNAL_CATCH
69     #define JSON_INTERNAL_CATCH JSON_CATCH_USER
70 #endif
71 #if defined(JSON_INTERNAL_CATCH_USER)
72     #undef JSON_INTERNAL_CATCH
73     #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER
74 #endif
75 
76 /*!
77 @brief macro to briefly define a mapping between an enum and JSON
78 @def NLOHMANN_JSON_SERIALIZE_ENUM
79 @since version 3.4.0
80 */
81 #define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                                            \
82     template<typename BasicJsonType>                                                            \
83     inline void to_json(BasicJsonType& j, const ENUM_TYPE& e)                                   \
84     {                                                                                           \
85         static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");          \
86         static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \
87         auto it = std::find_if(std::begin(m), std::end(m),                                      \
88                                [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool  \
89         {                                                                                       \
90             return ej_pair.first == e;                                                          \
91         });                                                                                     \
92         j = ((it != std::end(m)) ? it : std::begin(m))->second;                                 \
93     }                                                                                           \
94     template<typename BasicJsonType>                                                            \
95     inline void from_json(const BasicJsonType& j, ENUM_TYPE& e)                                 \
96     {                                                                                           \
97         static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");          \
98         static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \
99         auto it = std::find_if(std::begin(m), std::end(m),                                      \
100                                [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
101         {                                                                                       \
102             return ej_pair.second == j;                                                         \
103         });                                                                                     \
104         e = ((it != std::end(m)) ? it : std::begin(m))->first;                                  \
105     }
106 
107 // Ugly macros to avoid uglier copy-paste when specializing basic_json. They
108 // may be removed in the future once the class is split.
109 
110 #define NLOHMANN_BASIC_JSON_TPL_DECLARATION                                \
111     template<template<typename, typename, typename...> class ObjectType,   \
112              template<typename, typename...> class ArrayType,              \
113              class StringType, class BooleanType, class NumberIntegerType, \
114              class NumberUnsignedType, class NumberFloatType,              \
115              template<typename> class AllocatorType,                       \
116              template<typename, typename = void> class JSONSerializer>
117 
118 #define NLOHMANN_BASIC_JSON_TPL                                            \
119     basic_json<ObjectType, ArrayType, StringType, BooleanType,             \
120     NumberIntegerType, NumberUnsignedType, NumberFloatType,                \
121     AllocatorType, JSONSerializer>
122