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
70#define RAPIDJSON_MAJOR_VERSION 1
71#define RAPIDJSON_MINOR_VERSION 1
72#define RAPIDJSON_PATCH_VERSION 0
73#define RAPIDJSON_VERSION_STRING \
74 RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION)
112#ifndef RAPIDJSON_NAMESPACE
113#define RAPIDJSON_NAMESPACE rapidjson
115#ifndef RAPIDJSON_NAMESPACE_BEGIN
116#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE {
118#ifndef RAPIDJSON_NAMESPACE_END
119#define RAPIDJSON_NAMESPACE_END }
125#ifndef RAPIDJSON_HAS_STDSTRING
126#ifdef RAPIDJSON_DOXYGEN_RUNNING
127#define RAPIDJSON_HAS_STDSTRING 1
129#define RAPIDJSON_HAS_STDSTRING 0
143#if RAPIDJSON_HAS_STDSTRING
160#ifndef RAPIDJSON_NO_INT64DEFINE
162#if defined(_MSC_VER) && (_MSC_VER < 1800)
163#include "msinttypes/stdint.h"
164#include "msinttypes/inttypes.h"
171#ifdef RAPIDJSON_DOXYGEN_RUNNING
172#define RAPIDJSON_NO_INT64DEFINE
179#ifndef RAPIDJSON_FORCEINLINE
181#if defined(_MSC_VER) && defined(NDEBUG)
182#define RAPIDJSON_FORCEINLINE __forceinline
183#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG)
184#define RAPIDJSON_FORCEINLINE __attribute__((always_inline))
186#define RAPIDJSON_FORCEINLINE
193#define RAPIDJSON_LITTLEENDIAN 0
194#define RAPIDJSON_BIGENDIAN 1
209#ifndef RAPIDJSON_ENDIAN
211# ifdef __BYTE_ORDER__
212# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
213# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
214# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
215# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
217# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN.
220# elif defined(__GLIBC__)
222# if (__BYTE_ORDER == __LITTLE_ENDIAN)
223# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
224# elif (__BYTE_ORDER == __BIG_ENDIAN)
225# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
227# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN.
230# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
231# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
232# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
233# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
235# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__)
236# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
237# 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__)
238# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
239# elif defined(_MSC_VER) && defined(_M_ARM)
240# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
241# elif defined(RAPIDJSON_DOXYGEN_RUNNING)
242# define RAPIDJSON_ENDIAN
244# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN.
252#ifndef RAPIDJSON_64BIT
253#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__)
254#define RAPIDJSON_64BIT 1
256#define RAPIDJSON_64BIT 0
271#ifndef RAPIDJSON_ALIGN
272#if RAPIDJSON_64BIT == 1
273#define RAPIDJSON_ALIGN(x) (((x) + static_cast<uint64_t>(7u)) & ~static_cast<uint64_t>(7u))
275#define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u)
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
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)
347#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \
348 || defined(RAPIDJSON_DOXYGEN_RUNNING)
349#define RAPIDJSON_SIMD
355#ifndef RAPIDJSON_NO_SIZETYPEDEFINE
371#ifdef RAPIDJSON_DOXYGEN_RUNNING
372#define RAPIDJSON_NO_SIZETYPEDEFINE
374RAPIDJSON_NAMESPACE_BEGIN
381RAPIDJSON_NAMESPACE_END
385RAPIDJSON_NAMESPACE_BEGIN
387RAPIDJSON_NAMESPACE_END
400#ifndef RAPIDJSON_ASSERT
402#define RAPIDJSON_ASSERT(x) assert(x)
409#ifndef RAPIDJSON_STATIC_ASSERT
413RAPIDJSON_NAMESPACE_BEGIN
414template <
bool x>
struct STATIC_ASSERTION_FAILURE;
415template <>
struct STATIC_ASSERTION_FAILURE<true> {
enum { value = 1 }; };
416template<
int x>
struct StaticAssertTest {};
417RAPIDJSON_NAMESPACE_END
419#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y)
420#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y)
421#define RAPIDJSON_DO_JOIN2(X, Y) X##Y
424#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
426#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
437#define RAPIDJSON_STATIC_ASSERT(x) \
438 typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \
439 sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \
440 RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
451#ifndef RAPIDJSON_LIKELY
452#if defined(__GNUC__) || defined(__clang__)
453#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1)
455#define RAPIDJSON_LIKELY(x) (x)
464#ifndef RAPIDJSON_UNLIKELY
465#if defined(__GNUC__) || defined(__clang__)
466#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
468#define RAPIDJSON_UNLIKELY(x) (x)
477#define RAPIDJSON_MULTILINEMACRO_BEGIN do {
478#define RAPIDJSON_MULTILINEMACRO_END \
482#define RAPIDJSON_VERSION_CODE(x,y,z) \
483 (((x)*100000) + ((y)*100) + (z))
489#define RAPIDJSON_GNUC \
490 RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__)
493#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0))
495#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x))
496#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x)
497#define RAPIDJSON_DIAG_OFF(x) \
498 RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x)))
501#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0))
502#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push)
503#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop)
505#define RAPIDJSON_DIAG_PUSH
506#define RAPIDJSON_DIAG_POP
509#elif defined(_MSC_VER)
512#define RAPIDJSON_PRAGMA(x) __pragma(x)
513#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x))
515#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x)
516#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push)
517#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop)
521#define RAPIDJSON_DIAG_OFF(x)
522#define RAPIDJSON_DIAG_PUSH
523#define RAPIDJSON_DIAG_POP
530#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS
531#if defined(__clang__)
532#if __has_feature(cxx_rvalue_references) && \
533 (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306)
534#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1
536#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0
538#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \
539 (defined(_MSC_VER) && _MSC_VER >= 1600)
541#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1
543#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0
547#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT
548#if defined(__clang__)
549#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept)
550#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__))
552#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1
554#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0
557#if RAPIDJSON_HAS_CXX11_NOEXCEPT
558#define RAPIDJSON_NOEXCEPT noexcept
560#define RAPIDJSON_NOEXCEPT
564#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS
565#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0
568#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR
569#if defined(__clang__)
570#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for)
571#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \
572 (defined(_MSC_VER) && _MSC_VER >= 1700)
573#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1
575#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0
586#define RAPIDJSON_NEW(x) new x
588#ifndef RAPIDJSON_DELETE
590#define RAPIDJSON_DELETE(x) delete x
600RAPIDJSON_NAMESPACE_BEGIN
613RAPIDJSON_NAMESPACE_END
unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:380
Type
Type of JSON value.
Definition: rapidjson.h:603
@ kArrayType
array
Definition: rapidjson.h:608
@ kTrueType
true
Definition: rapidjson.h:606
@ kNullType
null
Definition: rapidjson.h:604
@ kFalseType
false
Definition: rapidjson.h:605
@ kNumberType
number
Definition: rapidjson.h:610
@ kObjectType
object
Definition: rapidjson.h:607
@ kStringType
string
Definition: rapidjson.h:609