15 #ifndef RAPIDJSON_RAPIDJSON_H_ 16 #define RAPIDJSON_RAPIDJSON_H_ 50 #define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) 51 #define RAPIDJSON_DO_STRINGIFY(x) #x 54 #define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) 55 #define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) 56 #define RAPIDJSON_DO_JOIN2(X, Y) X##Y 75 #define RAPIDJSON_MAJOR_VERSION 1 76 #define RAPIDJSON_MINOR_VERSION 1 77 #define RAPIDJSON_PATCH_VERSION 0 78 #define RAPIDJSON_VERSION_STRING \ 79 RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) 117 #ifndef RAPIDJSON_NAMESPACE 118 #define RAPIDJSON_NAMESPACE rapidjson 120 #ifndef RAPIDJSON_NAMESPACE_BEGIN 121 #define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { 123 #ifndef RAPIDJSON_NAMESPACE_END 124 #define RAPIDJSON_NAMESPACE_END } 130 #ifndef RAPIDJSON_HAS_STDSTRING 131 #ifdef RAPIDJSON_DOXYGEN_RUNNING 132 #define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation 134 #define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default 146 #endif // !defined(RAPIDJSON_HAS_STDSTRING) 148 #if RAPIDJSON_HAS_STDSTRING 150 #endif // RAPIDJSON_HAS_STDSTRING 165 #ifndef RAPIDJSON_NO_INT64DEFINE 167 #if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 176 #ifdef RAPIDJSON_DOXYGEN_RUNNING 177 #define RAPIDJSON_NO_INT64DEFINE 179 #endif // RAPIDJSON_NO_INT64TYPEDEF 184 #ifndef RAPIDJSON_FORCEINLINE 186 #if defined(_MSC_VER) && defined(NDEBUG) 187 #define RAPIDJSON_FORCEINLINE __forceinline 188 #elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) 189 #define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) 191 #define RAPIDJSON_FORCEINLINE 194 #endif // RAPIDJSON_FORCEINLINE 198 #define RAPIDJSON_LITTLEENDIAN 0 199 #define RAPIDJSON_BIGENDIAN 1
214 #ifndef RAPIDJSON_ENDIAN 216 # ifdef __BYTE_ORDER__ 217 # if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 218 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 219 # elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 220 # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN 222 # error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. 223 # endif // __BYTE_ORDER__ 225 # elif defined(__GLIBC__) 227 # if (__BYTE_ORDER == __LITTLE_ENDIAN) 228 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 229 # elif (__BYTE_ORDER == __BIG_ENDIAN) 230 # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN 232 # error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. 235 # elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) 236 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 237 # elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) 238 # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN 240 # elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) 241 # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN 242 # elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) 243 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 244 # elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) 245 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 246 # elif defined(RAPIDJSON_DOXYGEN_RUNNING) 247 # define RAPIDJSON_ENDIAN 249 # error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. 251 #endif // RAPIDJSON_ENDIAN 257 #ifndef RAPIDJSON_64BIT 258 #if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) 259 #define RAPIDJSON_64BIT 1 261 #define RAPIDJSON_64BIT 0 263 #endif // RAPIDJSON_64BIT 275 #ifndef RAPIDJSON_ALIGN 276 #define RAPIDJSON_ALIGN(x) (((x) + static_cast<size_t>(7u)) & ~static_cast<size_t>(7u)) 288 #ifndef RAPIDJSON_UINT64_C2 289 #define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32)) 303 #ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION 304 #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) 305 #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 307 #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 309 #endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION 311 #if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 312 #if RAPIDJSON_64BIT != 1 313 #error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 315 #define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast<type *>((reinterpret_cast<uintptr_t>(p) & static_cast<uintptr_t>(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast<uintptr_t>(reinterpret_cast<const void*>(x)))) 316 #define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast<type *>(reinterpret_cast<uintptr_t>(p) & static_cast<uintptr_t>(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) 318 #define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) 319 #define RAPIDJSON_GETPOINTER(type, p) (p) 351 #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ 352 || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING) 353 #define RAPIDJSON_SIMD 359 #ifndef RAPIDJSON_NO_SIZETYPEDEFINE 375 #ifdef RAPIDJSON_DOXYGEN_RUNNING 376 #define RAPIDJSON_NO_SIZETYPEDEFINE 404 #ifndef RAPIDJSON_ASSERT 406 #define RAPIDJSON_ASSERT(x) assert(x) 407 #endif // RAPIDJSON_ASSERT 413 #ifndef RAPIDJSON_STATIC_ASSERT 414 #if __cplusplus >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 ) 415 #define RAPIDJSON_STATIC_ASSERT(x) \ 416 static_assert(x, RAPIDJSON_STRINGIFY(x)) 418 #endif // RAPIDJSON_STATIC_ASSERT 421 #ifndef RAPIDJSON_STATIC_ASSERT 426 template <
bool x>
struct STATIC_ASSERTION_FAILURE;
427 template <>
struct STATIC_ASSERTION_FAILURE<true> {
enum {
value = 1 }; };
428 template <
size_t x>
struct StaticAssertTest {};
431 #if defined(__GNUC__) || defined(__clang__) 432 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) 434 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE 445 #define RAPIDJSON_STATIC_ASSERT(x) \ 446 typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ 447 sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \ 448 RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE 449 #endif // RAPIDJSON_STATIC_ASSERT 459 #ifndef RAPIDJSON_LIKELY 460 #if defined(__GNUC__) || defined(__clang__) 461 #define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) 463 #define RAPIDJSON_LIKELY(x) (x) 472 #ifndef RAPIDJSON_UNLIKELY 473 #if defined(__GNUC__) || defined(__clang__) 474 #define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) 476 #define RAPIDJSON_UNLIKELY(x) (x) 485 #define RAPIDJSON_MULTILINEMACRO_BEGIN do { 486 #define RAPIDJSON_MULTILINEMACRO_END \ 490 #define RAPIDJSON_VERSION_CODE(x,y,z) \ 491 (((x)*100000) + ((y)*100) + (z)) 496 #if defined(__GNUC__) 497 #define RAPIDJSON_GNUC \ 498 RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) 501 #if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) 503 #define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) 504 #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) 505 #define RAPIDJSON_DIAG_OFF(x) \ 506 RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) 509 #if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) 510 #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) 511 #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) 512 #else // GCC >= 4.2, < 4.6 513 #define RAPIDJSON_DIAG_PUSH 514 #define RAPIDJSON_DIAG_POP 517 #elif defined(_MSC_VER) 520 #define RAPIDJSON_PRAGMA(x) __pragma(x) 521 #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) 523 #define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) 524 #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) 525 #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) 529 #define RAPIDJSON_DIAG_OFF(x) 530 #define RAPIDJSON_DIAG_PUSH 531 #define RAPIDJSON_DIAG_POP 533 #endif // RAPIDJSON_DIAG_* 538 #ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS 539 #if defined(__clang__) 540 #if __has_feature(cxx_rvalue_references) && \ 541 (defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) 542 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 544 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 546 #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ 547 (defined(_MSC_VER) && _MSC_VER >= 1600) || \ 548 (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) 550 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 552 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 554 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 556 #ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT 557 #if defined(__clang__) 558 #define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) 559 #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ 560 (defined(_MSC_VER) && _MSC_VER >= 1900) || \ 561 (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) 562 #define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 564 #define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 567 #if RAPIDJSON_HAS_CXX11_NOEXCEPT 568 #define RAPIDJSON_NOEXCEPT noexcept 570 #define RAPIDJSON_NOEXCEPT 571 #endif // RAPIDJSON_HAS_CXX11_NOEXCEPT 574 #ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS 575 #if (defined(_MSC_VER) && _MSC_VER >= 1700) 576 #define RAPIDJSON_HAS_CXX11_TYPETRAITS 1 578 #define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 582 #ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR 583 #if defined(__clang__) 584 #define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) 585 #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ 586 (defined(_MSC_VER) && _MSC_VER >= 1700) || \ 587 (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) 588 #define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 590 #define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 592 #endif // RAPIDJSON_HAS_CXX11_RANGE_FOR 599 #ifndef RAPIDJSON_NEW 601 #define RAPIDJSON_NEW(TypeName) new TypeName 603 #ifndef RAPIDJSON_DELETE 605 #define RAPIDJSON_DELETE(x) delete x 630 #endif // RAPIDJSON_RAPIDJSON_H_ RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
const GenericPointer< typename T::ValueType > T2 value