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 166 #if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 175 #ifdef RAPIDJSON_DOXYGEN_RUNNING 177 #define RAPIDJSON_NO_INT64DEFINE 179 #endif // RAPIDJSON_NO_INT64TYPEDEF 184 #ifndef RAPIDJSON_FORCEINLINE 185 #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 193 #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 endianess 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 endianess 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) 245 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN 246 # elif defined(RAPIDJSON_DOXYGEN_RUNNING) 247 # define RAPIDJSON_ENDIAN 249 # error Unknown machine endianess 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 276 #ifndef RAPIDJSON_ALIGN 277 #if RAPIDJSON_64BIT == 1 278 #define RAPIDJSON_ALIGN(x) (((x) + static_cast<uint64_t>(7u)) & ~static_cast<uint64_t>(7u)) 280 #define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u) 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) || defined(_M_AMD64) 310 #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 312 #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 314 #endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION 316 #if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 317 #if RAPIDJSON_64BIT != 1 318 #error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 320 #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)))) 321 #define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast<type *>(reinterpret_cast<uintptr_t>(p) & static_cast<uintptr_t>(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) 323 #define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) 324 #define RAPIDJSON_GETPOINTER(type, p) (p) 356 #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ 357 || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING) 358 #define RAPIDJSON_SIMD 364 #ifndef RAPIDJSON_NO_SIZETYPEDEFINE 380 #ifdef RAPIDJSON_DOXYGEN_RUNNING 381 #define RAPIDJSON_NO_SIZETYPEDEFINE 409 #ifndef RAPIDJSON_ASSERT 411 #define RAPIDJSON_ASSERT(x) assert(x) 412 #endif // RAPIDJSON_ASSERT 418 #ifndef RAPIDJSON_STATIC_ASSERT 419 #if __cplusplus >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 ) 420 #define RAPIDJSON_STATIC_ASSERT(x) \ 421 static_assert(x, RAPIDJSON_STRINGIFY(x)) 423 #endif // RAPIDJSON_STATIC_ASSERT 426 #ifndef RAPIDJSON_STATIC_ASSERT 431 template <
bool x>
struct STATIC_ASSERTION_FAILURE;
432 template <>
struct STATIC_ASSERTION_FAILURE<true> {
enum {
value = 1 }; };
433 template <
size_t x>
struct StaticAssertTest {};
436 #if defined(__GNUC__) 437 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) 439 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE 450 #define RAPIDJSON_STATIC_ASSERT(x) \ 451 typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ 452 sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \ 453 RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE 454 #endif // RAPIDJSON_STATIC_ASSERT 464 #ifndef RAPIDJSON_LIKELY 465 #if defined(__GNUC__) || defined(__clang__) 466 #define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) 468 #define RAPIDJSON_LIKELY(x) (x) 477 #ifndef RAPIDJSON_UNLIKELY 478 #if defined(__GNUC__) || defined(__clang__) 479 #define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) 481 #define RAPIDJSON_UNLIKELY(x) (x) 490 #define RAPIDJSON_MULTILINEMACRO_BEGIN do { 491 #define RAPIDJSON_MULTILINEMACRO_END \ 495 #define RAPIDJSON_VERSION_CODE(x,y,z) \ 496 (((x)*100000) + ((y)*100) + (z)) 501 #if defined(__GNUC__) 502 #define RAPIDJSON_GNUC \ 503 RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) 506 #if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) 508 #define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) 509 #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) 510 #define RAPIDJSON_DIAG_OFF(x) \ 511 RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) 514 #if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) 515 #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) 516 #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) 517 #else // GCC >= 4.2, < 4.6 518 #define RAPIDJSON_DIAG_PUSH 519 #define RAPIDJSON_DIAG_POP 522 #elif defined(_MSC_VER) 525 #define RAPIDJSON_PRAGMA(x) __pragma(x) 526 #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) 528 #define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) 529 #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) 530 #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) 534 #define RAPIDJSON_DIAG_OFF(x) 535 #define RAPIDJSON_DIAG_PUSH 536 #define RAPIDJSON_DIAG_POP 538 #endif // RAPIDJSON_DIAG_* 543 #ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS 544 #if defined(__clang__) 545 #if __has_feature(cxx_rvalue_references) && \ 546 (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) 547 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 549 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 551 #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ 552 (defined(_MSC_VER) && _MSC_VER >= 1600) 554 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 556 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 558 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS 560 #ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT 561 #if defined(__clang__) 562 #define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) 563 #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) 565 #define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 567 #define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 570 #if RAPIDJSON_HAS_CXX11_NOEXCEPT 571 #define RAPIDJSON_NOEXCEPT noexcept 573 #define RAPIDJSON_NOEXCEPT 574 #endif // RAPIDJSON_HAS_CXX11_NOEXCEPT 577 #ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS 578 #define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 581 #ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR 582 #if defined(__clang__) 583 #define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) 584 #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ 585 (defined(_MSC_VER) && _MSC_VER >= 1700) 586 #define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 588 #define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 590 #endif // RAPIDJSON_HAS_CXX11_RANGE_FOR 597 #ifndef RAPIDJSON_NEW 598 #define RAPIDJSON_NEW(TypeName) new TypeName 601 #ifndef RAPIDJSON_DELETE 602 #define RAPIDJSON_DELETE(x) delete x 628 #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