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