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 \ 122 namespace RAPIDJSON_NAMESPACE \ 125 #ifndef RAPIDJSON_NAMESPACE_END 126 #define RAPIDJSON_NAMESPACE_END } 132 #ifndef RAPIDJSON_HAS_STDSTRING 133 #if RAPIDJSON_DOXYGEN_RUNNING 134 #define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation 136 #define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default 148 #endif // !defined(RAPIDJSON_HAS_STDSTRING) 150 #if RAPIDJSON_HAS_STDSTRING 152 #endif // RAPIDJSON_HAS_STDSTRING 167 #ifndef RAPIDJSON_NO_INT64DEFINE 168 #if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 177 #if RAPIDJSON_DOXYGEN_RUNNING 179 #define RAPIDJSON_NO_INT64DEFINE 181 #endif // RAPIDJSON_NO_INT64TYPEDEF 186 #ifndef RAPIDJSON_FORCEINLINE 187 #if defined(_MSC_VER) && defined(NDEBUG) 189 #define RAPIDJSON_FORCEINLINE __forceinline 190 #elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) 191 #define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) 193 #define RAPIDJSON_FORCEINLINE 195 #endif // RAPIDJSON_FORCEINLINE 200 #define RAPIDJSON_LITTLEENDIAN 0 201 #define RAPIDJSON_BIGENDIAN 1 216 #ifndef RAPIDJSON_ENDIAN 218 #ifdef __BYTE_ORDER__ 219 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 220 #define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 221 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 222 #define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN 224 #error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. 225 #endif // __BYTE_ORDER__ 227 #elif defined(__GLIBC__) 229 #if (__BYTE_ORDER == __LITTLE_ENDIAN) 230 #define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 231 #elif (__BYTE_ORDER == __BIG_ENDIAN) 232 #define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN 234 #error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. 237 #elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) 238 #define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 239 #elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) 240 #define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN 242 #elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || \ 243 defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) 244 #define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN 245 #elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || \ 246 defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || \ 247 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) 248 #define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 249 #elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) 250 #define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 251 #elif defined(RAPIDJSON_DOXYGEN_RUNNING) 252 #define RAPIDJSON_ENDIAN 254 #error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. 256 #endif // RAPIDJSON_ENDIAN 262 #ifndef RAPIDJSON_64BIT 263 #if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) 264 #define RAPIDJSON_64BIT 1 266 #define RAPIDJSON_64BIT 0 268 #endif // RAPIDJSON_64BIT 280 #ifndef RAPIDJSON_ALIGN 281 #define RAPIDJSON_ALIGN(x) (((x) + static_cast<size_t>(7u)) & ~static_cast<size_t>(7u)) 293 #ifndef RAPIDJSON_UINT64_C2 294 #define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32)) 308 #ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION 309 #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || \ 311 #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 313 #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 315 #endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION 317 #if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 318 #if RAPIDJSON_64BIT != 1 319 #error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 321 #define RAPIDJSON_SETPOINTER(type, p, x) \ 322 (p = reinterpret_cast<type*>( \ 323 (reinterpret_cast<uintptr_t>(p) & static_cast<uintptr_t>(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | \ 324 reinterpret_cast<uintptr_t>(reinterpret_cast<const void*>(x)))) 325 #define RAPIDJSON_GETPOINTER(type, p) \ 326 (reinterpret_cast<type*>(reinterpret_cast<uintptr_t>(p) & \ 327 static_cast<uintptr_t>(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) 329 #define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) 330 #define RAPIDJSON_GETPOINTER(type, p) (p) 362 #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING) 363 #define RAPIDJSON_SIMD 369 #ifndef RAPIDJSON_NO_SIZETYPEDEFINE 385 #if RAPIDJSON_DOXYGEN_RUNNING 386 #define RAPIDJSON_NO_SIZETYPEDEFINE 414 #ifndef RAPIDJSON_ASSERT 416 #define RAPIDJSON_ASSERT(x) assert(x) 417 #endif // RAPIDJSON_ASSERT 423 #ifndef RAPIDJSON_STATIC_ASSERT 424 #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800) 425 #define RAPIDJSON_STATIC_ASSERT(x) static_assert(x, RAPIDJSON_STRINGIFY(x)) 427 #endif // RAPIDJSON_STATIC_ASSERT 430 #ifndef RAPIDJSON_STATIC_ASSERT 436 struct STATIC_ASSERTION_FAILURE;
438 struct STATIC_ASSERTION_FAILURE<true>
446 struct StaticAssertTest
451 #if defined(__GNUC__) || defined(__clang__) 452 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) 454 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE 465 #define RAPIDJSON_STATIC_ASSERT(x) \ 466 typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest<sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x)>)> \ 467 RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE 468 #endif // RAPIDJSON_STATIC_ASSERT 478 #ifndef RAPIDJSON_LIKELY 479 #if defined(__GNUC__) || defined(__clang__) 480 #define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) 482 #define RAPIDJSON_LIKELY(x) (x) 491 #ifndef RAPIDJSON_UNLIKELY 492 #if defined(__GNUC__) || defined(__clang__) 493 #define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) 495 #define RAPIDJSON_UNLIKELY(x) (x) 504 #define RAPIDJSON_MULTILINEMACRO_BEGIN \ 507 #define RAPIDJSON_MULTILINEMACRO_END \ 512 #define RAPIDJSON_VERSION_CODE(x, y, z) (((x)*100000) + ((y)*100) + (z)) 517 #if defined(__GNUC__) 518 #define RAPIDJSON_GNUC RAPIDJSON_VERSION_CODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) 521 #if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4, 2, 0)) 523 #define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) 524 #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) 525 #define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W, x))) 528 #if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4, 6, 0)) 529 #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) 530 #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) 531 #else // GCC >= 4.2, < 4.6 532 #define RAPIDJSON_DIAG_PUSH 533 #define RAPIDJSON_DIAG_POP 536 #elif defined(_MSC_VER) 539 #define RAPIDJSON_PRAGMA(x) __pragma(x) 540 #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) 542 #define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable : x) 543 #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) 544 #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) 548 #define RAPIDJSON_DIAG_OFF(x) 549 #define RAPIDJSON_DIAG_PUSH 550 #define RAPIDJSON_DIAG_POP 552 #endif // RAPIDJSON_DIAG_* 557 #ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS 558 #if defined(__clang__) 559 #if __has_feature(cxx_rvalue_references) && \ 560 (defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) 561 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 563 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 565 #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4, 3, 0)) && \ 566 defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ 567 (defined(_MSC_VER) && _MSC_VER >= 1600) || \ 568 (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) 570 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 572 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 574 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 576 #ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT 577 #if defined(__clang__) 578 #define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) 579 #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4, 6, 0)) && \ 580 defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ 581 (defined(_MSC_VER) && _MSC_VER >= 1900) || \ 582 (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) 583 #define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 585 #define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 588 #if RAPIDJSON_HAS_CXX11_NOEXCEPT 589 #define RAPIDJSON_NOEXCEPT noexcept 591 #define RAPIDJSON_NOEXCEPT 592 #endif // RAPIDJSON_HAS_CXX11_NOEXCEPT 595 #ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS 596 #if (defined(_MSC_VER) && _MSC_VER >= 1700) 597 #define RAPIDJSON_HAS_CXX11_TYPETRAITS 1 599 #define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 603 #ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR 604 #if defined(__clang__) 605 #define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) 606 #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4, 6, 0)) && \ 607 defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ 608 (defined(_MSC_VER) && _MSC_VER >= 1700) || \ 609 (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) 610 #define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 612 #define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 614 #endif // RAPIDJSON_HAS_CXX11_RANGE_FOR 632 #ifndef RAPIDJSON_NOEXCEPT_ASSERT 633 #if RAPIDJSON_ASSERT_THROWS 634 #if RAPIDJSON_HAS_CXX11_NOEXCEPT 635 #define RAPIDJSON_NOEXCEPT_ASSERT(x) 637 #define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) 638 #endif // RAPIDJSON_HAS_CXX11_NOEXCEPT 640 #define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) 641 #endif // RAPIDJSON_ASSERT_THROWS 642 #endif // RAPIDJSON_NOEXCEPT_ASSERT 647 #ifndef RAPIDJSON_NEW 648 #define RAPIDJSON_NEW(TypeName) new TypeName 651 #ifndef RAPIDJSON_DELETE 652 #define RAPIDJSON_DELETE(x) delete x 679 #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