2018-01-10 17:18:31 +08:00
|
|
|
#pragma once
|
2017-08-14 20:59:17 +08:00
|
|
|
|
|
|
|
// This file contains all internal macro definitions
|
|
|
|
// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
|
|
|
|
|
|
|
|
// exclude unsupported compilers
|
2018-06-27 04:47:40 +08:00
|
|
|
#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
|
|
|
|
#if defined(__clang__)
|
|
|
|
#if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
|
|
|
|
#error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
|
|
|
|
#endif
|
|
|
|
#elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
|
2018-09-20 23:19:33 +08:00
|
|
|
#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
|
2018-06-27 04:47:40 +08:00
|
|
|
#error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
|
|
|
|
#endif
|
2017-08-14 20:59:17 +08:00
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// disable float-equal warnings on GCC/clang
|
|
|
|
#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
|
|
|
|
#pragma GCC diagnostic push
|
|
|
|
#pragma GCC diagnostic ignored "-Wfloat-equal"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// disable documentation warnings on clang
|
|
|
|
#if defined(__clang__)
|
|
|
|
#pragma GCC diagnostic push
|
|
|
|
#pragma GCC diagnostic ignored "-Wdocumentation"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// allow for portable deprecation warnings
|
|
|
|
#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
|
|
|
|
#define JSON_DEPRECATED __attribute__((deprecated))
|
|
|
|
#elif defined(_MSC_VER)
|
|
|
|
#define JSON_DEPRECATED __declspec(deprecated)
|
|
|
|
#else
|
|
|
|
#define JSON_DEPRECATED
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// allow to disable exceptions
|
2018-01-17 03:41:04 +08:00
|
|
|
#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
|
2017-08-14 20:59:17 +08:00
|
|
|
#define JSON_THROW(exception) throw exception
|
|
|
|
#define JSON_TRY try
|
|
|
|
#define JSON_CATCH(exception) catch(exception)
|
2018-07-19 14:43:41 +08:00
|
|
|
#define JSON_INTERNAL_CATCH(exception) catch(exception)
|
2017-08-14 20:59:17 +08:00
|
|
|
#else
|
|
|
|
#define JSON_THROW(exception) std::abort()
|
|
|
|
#define JSON_TRY if(true)
|
|
|
|
#define JSON_CATCH(exception) if(false)
|
2018-07-19 14:43:41 +08:00
|
|
|
#define JSON_INTERNAL_CATCH(exception) if(false)
|
2017-08-14 20:59:17 +08:00
|
|
|
#endif
|
|
|
|
|
2018-01-29 06:42:13 +08:00
|
|
|
// override exception macros
|
|
|
|
#if defined(JSON_THROW_USER)
|
|
|
|
#undef JSON_THROW
|
|
|
|
#define JSON_THROW JSON_THROW_USER
|
|
|
|
#endif
|
|
|
|
#if defined(JSON_TRY_USER)
|
|
|
|
#undef JSON_TRY
|
|
|
|
#define JSON_TRY JSON_TRY_USER
|
|
|
|
#endif
|
|
|
|
#if defined(JSON_CATCH_USER)
|
|
|
|
#undef JSON_CATCH
|
|
|
|
#define JSON_CATCH JSON_CATCH_USER
|
2018-08-24 20:52:24 +08:00
|
|
|
#undef JSON_INTERNAL_CATCH
|
2018-07-19 14:43:41 +08:00
|
|
|
#define JSON_INTERNAL_CATCH JSON_CATCH_USER
|
|
|
|
#endif
|
|
|
|
#if defined(JSON_INTERNAL_CATCH_USER)
|
|
|
|
#undef JSON_INTERNAL_CATCH
|
|
|
|
#define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER
|
2018-01-29 06:42:13 +08:00
|
|
|
#endif
|
|
|
|
|
2017-08-14 20:59:17 +08:00
|
|
|
// manual branch prediction
|
|
|
|
#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
|
|
|
|
#define JSON_LIKELY(x) __builtin_expect(!!(x), 1)
|
|
|
|
#define JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
|
|
|
|
#else
|
|
|
|
#define JSON_LIKELY(x) x
|
|
|
|
#define JSON_UNLIKELY(x) x
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// C++ language standard detection
|
|
|
|
#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
|
|
|
|
#define JSON_HAS_CPP_17
|
|
|
|
#define JSON_HAS_CPP_14
|
|
|
|
#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
|
|
|
|
#define JSON_HAS_CPP_14
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Ugly macros to avoid uglier copy-paste when specializing basic_json. They
|
|
|
|
// may be removed in the future once the class is split.
|
|
|
|
|
|
|
|
#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \
|
|
|
|
template<template<typename, typename, typename...> class ObjectType, \
|
|
|
|
template<typename, typename...> class ArrayType, \
|
|
|
|
class StringType, class BooleanType, class NumberIntegerType, \
|
|
|
|
class NumberUnsignedType, class NumberFloatType, \
|
|
|
|
template<typename> class AllocatorType, \
|
|
|
|
template<typename, typename = void> class JSONSerializer>
|
|
|
|
|
|
|
|
#define NLOHMANN_BASIC_JSON_TPL \
|
|
|
|
basic_json<ObjectType, ArrayType, StringType, BooleanType, \
|
|
|
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, \
|
|
|
|
AllocatorType, JSONSerializer>
|