rapidjson.h (rapidjson-1.0.2) | : | rapidjson.h (rapidjson-1.1.0) | ||
---|---|---|---|---|
skipping to change at line 71 | skipping to change at line 71 | |||
*/ | */ | |||
/*! \def RAPIDJSON_PATCH_VERSION | /*! \def RAPIDJSON_PATCH_VERSION | |||
\ingroup RAPIDJSON_CONFIG | \ingroup RAPIDJSON_CONFIG | |||
\brief Patch version of RapidJSON in integer. | \brief Patch version of RapidJSON in integer. | |||
*/ | */ | |||
/*! \def RAPIDJSON_VERSION_STRING | /*! \def RAPIDJSON_VERSION_STRING | |||
\ingroup RAPIDJSON_CONFIG | \ingroup RAPIDJSON_CONFIG | |||
\brief Version of RapidJSON in "<major>.<minor>.<patch>" string format. | \brief Version of RapidJSON in "<major>.<minor>.<patch>" string format. | |||
*/ | */ | |||
#define RAPIDJSON_MAJOR_VERSION 1 | #define RAPIDJSON_MAJOR_VERSION 1 | |||
#define RAPIDJSON_MINOR_VERSION 0 | #define RAPIDJSON_MINOR_VERSION 1 | |||
#define RAPIDJSON_PATCH_VERSION 2 | #define RAPIDJSON_PATCH_VERSION 0 | |||
#define RAPIDJSON_VERSION_STRING \ | #define RAPIDJSON_VERSION_STRING \ | |||
RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSO N_PATCH_VERSION) | RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSO N_PATCH_VERSION) | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_NAMESPACE_(BEGIN|END) | // RAPIDJSON_NAMESPACE_(BEGIN|END) | |||
/*! \def RAPIDJSON_NAMESPACE | /*! \def RAPIDJSON_NAMESPACE | |||
\ingroup RAPIDJSON_CONFIG | \ingroup RAPIDJSON_CONFIG | |||
\brief provide custom rapidjson namespace | \brief provide custom rapidjson namespace | |||
In order to avoid symbol clashes and/or "One Definition Rule" errors | In order to avoid symbol clashes and/or "One Definition Rule" errors | |||
skipping to change at line 123 | skipping to change at line 123 | |||
#define RAPIDJSON_NAMESPACE rapidjson | #define RAPIDJSON_NAMESPACE rapidjson | |||
#endif | #endif | |||
#ifndef RAPIDJSON_NAMESPACE_BEGIN | #ifndef RAPIDJSON_NAMESPACE_BEGIN | |||
#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { | #define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { | |||
#endif | #endif | |||
#ifndef RAPIDJSON_NAMESPACE_END | #ifndef RAPIDJSON_NAMESPACE_END | |||
#define RAPIDJSON_NAMESPACE_END } | #define RAPIDJSON_NAMESPACE_END } | |||
#endif | #endif | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_HAS_STDSTRING | ||||
#ifndef RAPIDJSON_HAS_STDSTRING | ||||
#ifdef RAPIDJSON_DOXYGEN_RUNNING | ||||
#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation | ||||
#else | ||||
#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default | ||||
#endif | ||||
/*! \def RAPIDJSON_HAS_STDSTRING | ||||
\ingroup RAPIDJSON_CONFIG | ||||
\brief Enable RapidJSON support for \c std::string | ||||
By defining this preprocessor symbol to \c 1, several convenience functions | ||||
for using | ||||
\ref rapidjson::GenericValue with \c std::string are enabled, especially | ||||
for construction and comparison. | ||||
\hideinitializer | ||||
*/ | ||||
#endif // !defined(RAPIDJSON_HAS_STDSTRING) | ||||
#if RAPIDJSON_HAS_STDSTRING | ||||
#include <string> | ||||
#endif // RAPIDJSON_HAS_STDSTRING | ||||
/////////////////////////////////////////////////////////////////////////////// | ||||
// RAPIDJSON_NO_INT64DEFINE | // RAPIDJSON_NO_INT64DEFINE | |||
/*! \def RAPIDJSON_NO_INT64DEFINE | /*! \def RAPIDJSON_NO_INT64DEFINE | |||
\ingroup RAPIDJSON_CONFIG | \ingroup RAPIDJSON_CONFIG | |||
\brief Use external 64-bit integer types. | \brief Use external 64-bit integer types. | |||
RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t type s | RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t type s | |||
to be available at global scope. | to be available at global scope. | |||
If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to | If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to | |||
prevent RapidJSON from defining its own types. | prevent RapidJSON from defining its own types. | |||
*/ | */ | |||
#ifndef RAPIDJSON_NO_INT64DEFINE | #ifndef RAPIDJSON_NO_INT64DEFINE | |||
//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN | //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN | |||
#ifdef _MSC_VER | #if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 | |||
#include "msinttypes/stdint.h" | #include "msinttypes/stdint.h" | |||
#include "msinttypes/inttypes.h" | #include "msinttypes/inttypes.h" | |||
#else | #else | |||
// Other compilers should have this. | // Other compilers should have this. | |||
#include <stdint.h> | #include <stdint.h> | |||
#include <inttypes.h> | #include <inttypes.h> | |||
#endif | #endif | |||
//!@endcond | //!@endcond | |||
#ifdef RAPIDJSON_DOXYGEN_RUNNING | #ifdef RAPIDJSON_DOXYGEN_RUNNING | |||
#define RAPIDJSON_NO_INT64DEFINE | #define RAPIDJSON_NO_INT64DEFINE | |||
#endif | #endif | |||
#endif // RAPIDJSON_NO_INT64TYPEDEF | #endif // RAPIDJSON_NO_INT64TYPEDEF | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_FORCEINLINE | // RAPIDJSON_FORCEINLINE | |||
#ifndef RAPIDJSON_FORCEINLINE | #ifndef RAPIDJSON_FORCEINLINE | |||
//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN | //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN | |||
#if defined(_MSC_VER) && !defined(NDEBUG) | #if defined(_MSC_VER) && defined(NDEBUG) | |||
#define RAPIDJSON_FORCEINLINE __forceinline | #define RAPIDJSON_FORCEINLINE __forceinline | |||
#elif defined(__GNUC__) && __GNUC__ >= 4 && !defined(NDEBUG) | #elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) | |||
#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) | #define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) | |||
#else | #else | |||
#define RAPIDJSON_FORCEINLINE | #define RAPIDJSON_FORCEINLINE | |||
#endif | #endif | |||
//!@endcond | //!@endcond | |||
#endif // RAPIDJSON_FORCEINLINE | #endif // RAPIDJSON_FORCEINLINE | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_ENDIAN | // RAPIDJSON_ENDIAN | |||
#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine | #define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine | |||
skipping to change at line 214 | skipping to change at line 239 | |||
// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro | // Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro | |||
# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) | # elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) | |||
# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN | # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN | |||
# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) | # elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) | |||
# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN | # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN | |||
// Detect with architecture macros | // Detect with architecture macros | |||
# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__p owerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_ MIPSEB) || defined(_POWER) || defined(__s390__) | # elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__p owerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_ MIPSEB) || defined(_POWER) || defined(__s390__) | |||
# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN | # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN | |||
# 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) || defi ned(__x86_64__) || defined(_M_X64) || defined(__bfin__) | # 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) || defi ned(__x86_64__) || defined(_M_X64) || defined(__bfin__) | |||
# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN | # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN | |||
# elif defined(_MSC_VER) && defined(_M_ARM) | ||||
# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN | ||||
# elif defined(RAPIDJSON_DOXYGEN_RUNNING) | # elif defined(RAPIDJSON_DOXYGEN_RUNNING) | |||
# define RAPIDJSON_ENDIAN | # define RAPIDJSON_ENDIAN | |||
# else | # else | |||
# error Unknown machine endianess detected. User needs to define RAPIDJSON_EN DIAN. | # error Unknown machine endianess detected. User needs to define RAPIDJSON_EN DIAN. | |||
# endif | # endif | |||
#endif // RAPIDJSON_ENDIAN | #endif // RAPIDJSON_ENDIAN | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_64BIT | // RAPIDJSON_64BIT | |||
//! Whether using 64-bit architecture | //! Whether using 64-bit architecture | |||
#ifndef RAPIDJSON_64BIT | #ifndef RAPIDJSON_64BIT | |||
#if defined(__LP64__) || defined(_WIN64) | #if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined( _WIN64) || defined(__EMSCRIPTEN__) | |||
#define RAPIDJSON_64BIT 1 | #define RAPIDJSON_64BIT 1 | |||
#else | #else | |||
#define RAPIDJSON_64BIT 0 | #define RAPIDJSON_64BIT 0 | |||
#endif | #endif | |||
#endif // RAPIDJSON_64BIT | #endif // RAPIDJSON_64BIT | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_ALIGN | // RAPIDJSON_ALIGN | |||
//! Data alignment of the machine. | //! Data alignment of the machine. | |||
/*! \ingroup RAPIDJSON_CONFIG | /*! \ingroup RAPIDJSON_CONFIG | |||
\param x pointer to align | \param x pointer to align | |||
Some machines require strict data alignment. Currently the default uses 4 by tes | Some machines require strict data alignment. Currently the default uses 4 by tes | |||
alignment. User can customize by defining the RAPIDJSON_ALIGN function macro | alignment on 32-bit platforms and 8 bytes alignment for 64-bit platforms. | |||
., | User can customize by defining the RAPIDJSON_ALIGN function macro. | |||
*/ | */ | |||
#ifndef RAPIDJSON_ALIGN | #ifndef RAPIDJSON_ALIGN | |||
#if RAPIDJSON_64BIT == 1 | #if RAPIDJSON_64BIT == 1 | |||
#define RAPIDJSON_ALIGN(x) ((x + 7u) & ~7u) | #define RAPIDJSON_ALIGN(x) (((x) + static_cast<uint64_t>(7u)) & ~static_cast<uin t64_t>(7u)) | |||
#else | #else | |||
#define RAPIDJSON_ALIGN(x) ((x + 3u) & ~3u) | #define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u) | |||
#endif | #endif | |||
#endif | #endif | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_UINT64_C2 | // RAPIDJSON_UINT64_C2 | |||
//! Construct a 64-bit literal by a pair of 32-bit integer. | //! Construct a 64-bit literal by a pair of 32-bit integer. | |||
/*! | /*! | |||
64-bit literal with or without ULL suffix is prone to compiler warnings. | 64-bit literal with or without ULL suffix is prone to compiler warnings. | |||
UINT64_C() is C macro which cause compilation problems. | UINT64_C() is C macro which cause compilation problems. | |||
Use this macro to define 64-bit constants by a pair of 32-bit integer. | Use this macro to define 64-bit constants by a pair of 32-bit integer. | |||
*/ | */ | |||
#ifndef RAPIDJSON_UINT64_C2 | #ifndef RAPIDJSON_UINT64_C2 | |||
#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32 ) | static_cast<uint64_t>(low32)) | #define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32 ) | static_cast<uint64_t>(low32)) | |||
#endif | #endif | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_48BITPOINTER_OPTIMIZATION | ||||
//! Use only lower 48-bit address for some pointers. | ||||
/*! | ||||
\ingroup RAPIDJSON_CONFIG | ||||
This optimization uses the fact that current X86-64 architecture only implem | ||||
ent lower 48-bit virtual address. | ||||
The higher 16-bit can be used for storing other data. | ||||
\c GenericValue uses this optimization to reduce its size form 24 bytes to 1 | ||||
6 bytes in 64-bit architecture. | ||||
*/ | ||||
#ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION | ||||
#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x | ||||
86_64) || defined(_M_X64) || defined(_M_AMD64) | ||||
#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 | ||||
#else | ||||
#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 | ||||
#endif | ||||
#endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION | ||||
#if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 | ||||
#if RAPIDJSON_64BIT != 1 | ||||
#error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_6 | ||||
4BIT=1 | ||||
#endif | ||||
#define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast<type *>((reinterp | ||||
ret_cast<uintptr_t>(p) & static_cast<uintptr_t>(RAPIDJSON_UINT64_C2(0xFFFF0000, | ||||
0x00000000))) | reinterpret_cast<uintptr_t>(reinterpret_cast<const void*>(x)))) | ||||
#define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast<type *>(reinterpret_cast | ||||
<uintptr_t>(p) & static_cast<uintptr_t>(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFF | ||||
FF)))) | ||||
#else | ||||
#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) | ||||
#define RAPIDJSON_GETPOINTER(type, p) (p) | ||||
#endif | ||||
/////////////////////////////////////////////////////////////////////////////// | ||||
// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_SIMD | // RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_SIMD | |||
/*! \def RAPIDJSON_SIMD | /*! \def RAPIDJSON_SIMD | |||
\ingroup RAPIDJSON_CONFIG | \ingroup RAPIDJSON_CONFIG | |||
\brief Enable SSE2/SSE4.2 optimization. | \brief Enable SSE2/SSE4.2 optimization. | |||
RapidJSON supports optimized implementations for some parsing operations | RapidJSON supports optimized implementations for some parsing operations | |||
based on the SSE2 or SSE4.2 SIMD extensions on modern Intel-compatible | based on the SSE2 or SSE4.2 SIMD extensions on modern Intel-compatible | |||
processors. | processors. | |||
skipping to change at line 352 | skipping to change at line 410 | |||
#ifndef RAPIDJSON_ASSERT | #ifndef RAPIDJSON_ASSERT | |||
#include <cassert> | #include <cassert> | |||
#define RAPIDJSON_ASSERT(x) assert(x) | #define RAPIDJSON_ASSERT(x) assert(x) | |||
#endif // RAPIDJSON_ASSERT | #endif // RAPIDJSON_ASSERT | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_STATIC_ASSERT | // RAPIDJSON_STATIC_ASSERT | |||
// Adopt from boost | // Adopt from boost | |||
#ifndef RAPIDJSON_STATIC_ASSERT | #ifndef RAPIDJSON_STATIC_ASSERT | |||
#ifndef __clang__ | ||||
//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN | //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN | |||
#endif | ||||
RAPIDJSON_NAMESPACE_BEGIN | RAPIDJSON_NAMESPACE_BEGIN | |||
template <bool x> struct STATIC_ASSERTION_FAILURE; | template <bool x> struct STATIC_ASSERTION_FAILURE; | |||
template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; }; | template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; }; | |||
template<int x> struct StaticAssertTest {}; | template<int x> struct StaticAssertTest {}; | |||
RAPIDJSON_NAMESPACE_END | RAPIDJSON_NAMESPACE_END | |||
#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) | #define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) | |||
#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) | #define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) | |||
#define RAPIDJSON_DO_JOIN2(X, Y) X##Y | #define RAPIDJSON_DO_JOIN2(X, Y) X##Y | |||
#if defined(__GNUC__) | #if defined(__GNUC__) | |||
#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) | #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) | |||
#else | #else | |||
#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE | #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE | |||
#endif | #endif | |||
#ifndef __clang__ | ||||
//!@endcond | //!@endcond | |||
#endif | ||||
/*! \def RAPIDJSON_STATIC_ASSERT | /*! \def RAPIDJSON_STATIC_ASSERT | |||
\brief (Internal) macro to check for conditions at compile-time | \brief (Internal) macro to check for conditions at compile-time | |||
\param x compile-time condition | \param x compile-time condition | |||
\hideinitializer | \hideinitializer | |||
*/ | */ | |||
#define RAPIDJSON_STATIC_ASSERT(x) \ | #define RAPIDJSON_STATIC_ASSERT(x) \ | |||
typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ | typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ | |||
sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \ | sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \ | |||
RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED _ATTRIBUTE | RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED _ATTRIBUTE | |||
#endif | #endif | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY | ||||
//! Compiler branching hint for expression with high probability to be true. | ||||
/*! | ||||
\ingroup RAPIDJSON_CONFIG | ||||
\param x Boolean expression likely to be true. | ||||
*/ | ||||
#ifndef RAPIDJSON_LIKELY | ||||
#if defined(__GNUC__) || defined(__clang__) | ||||
#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) | ||||
#else | ||||
#define RAPIDJSON_LIKELY(x) (x) | ||||
#endif | ||||
#endif | ||||
//! Compiler branching hint for expression with low probability to be true. | ||||
/*! | ||||
\ingroup RAPIDJSON_CONFIG | ||||
\param x Boolean expression unlikely to be true. | ||||
*/ | ||||
#ifndef RAPIDJSON_UNLIKELY | ||||
#if defined(__GNUC__) || defined(__clang__) | ||||
#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) | ||||
#else | ||||
#define RAPIDJSON_UNLIKELY(x) (x) | ||||
#endif | ||||
#endif | ||||
/////////////////////////////////////////////////////////////////////////////// | ||||
// Helpers | // Helpers | |||
//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN | //!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN | |||
#define RAPIDJSON_MULTILINEMACRO_BEGIN do { | #define RAPIDJSON_MULTILINEMACRO_BEGIN do { | |||
#define RAPIDJSON_MULTILINEMACRO_END \ | #define RAPIDJSON_MULTILINEMACRO_END \ | |||
} while((void)0, 0) | } while((void)0, 0) | |||
// adopted from Boost | // adopted from Boost | |||
#define RAPIDJSON_VERSION_CODE(x,y,z) \ | #define RAPIDJSON_VERSION_CODE(x,y,z) \ | |||
skipping to change at line 441 | skipping to change at line 532 | |||
#define RAPIDJSON_DIAG_PUSH /* ignored */ | #define RAPIDJSON_DIAG_PUSH /* ignored */ | |||
#define RAPIDJSON_DIAG_POP /* ignored */ | #define RAPIDJSON_DIAG_POP /* ignored */ | |||
#endif // RAPIDJSON_DIAG_* | #endif // RAPIDJSON_DIAG_* | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// C++11 features | // C++11 features | |||
#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS | #ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS | |||
#if defined(__clang__) | #if defined(__clang__) | |||
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS __has_feature(cxx_rvalue_references) && \ | #if __has_feature(cxx_rvalue_references) && \ | |||
(defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306 ) | (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306 ) | |||
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 | ||||
#else | ||||
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 | ||||
#endif | ||||
#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3, 0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ | #elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3, 0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ | |||
(defined(_MSC_VER) && _MSC_VER >= 1600) | (defined(_MSC_VER) && _MSC_VER >= 1600) | |||
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 | #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 | |||
#else | #else | |||
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 | #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 | |||
#endif | #endif | |||
#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS | #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS | |||
#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT | #ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT | |||
skipping to change at line 473 | skipping to change at line 568 | |||
#define RAPIDJSON_NOEXCEPT noexcept | #define RAPIDJSON_NOEXCEPT noexcept | |||
#else | #else | |||
#define RAPIDJSON_NOEXCEPT /* noexcept */ | #define RAPIDJSON_NOEXCEPT /* noexcept */ | |||
#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT | #endif // RAPIDJSON_HAS_CXX11_NOEXCEPT | |||
// no automatic detection, yet | // no automatic detection, yet | |||
#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS | #ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS | |||
#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 | #define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 | |||
#endif | #endif | |||
#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR | ||||
#if defined(__clang__) | ||||
#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) | ||||
#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3, | ||||
0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ | ||||
(defined(_MSC_VER) && _MSC_VER >= 1700) | ||||
#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 | ||||
#else | ||||
#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 | ||||
#endif | ||||
#endif // RAPIDJSON_HAS_CXX11_RANGE_FOR | ||||
//!@endcond | //!@endcond | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// new/delete | // new/delete | |||
#ifndef RAPIDJSON_NEW | #ifndef RAPIDJSON_NEW | |||
///! customization point for global \c new | ///! customization point for global \c new | |||
#define RAPIDJSON_NEW(x) new x | #define RAPIDJSON_NEW(x) new x | |||
#endif | #endif | |||
#ifndef RAPIDJSON_DELETE | #ifndef RAPIDJSON_DELETE | |||
///! customization point for global \c delete | ///! customization point for global \c delete | |||
#define RAPIDJSON_DELETE(x) delete x | #define RAPIDJSON_DELETE(x) delete x | |||
#endif | #endif | |||
/////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | |||
// Allocators and Encodings | // Type | |||
#include "allocators.h" | ||||
#include "encodings.h" | ||||
/*! \namespace rapidjson | /*! \namespace rapidjson | |||
\brief main RapidJSON namespace | \brief main RapidJSON namespace | |||
\see RAPIDJSON_NAMESPACE | \see RAPIDJSON_NAMESPACE | |||
*/ | */ | |||
RAPIDJSON_NAMESPACE_BEGIN | RAPIDJSON_NAMESPACE_BEGIN | |||
/////////////////////////////////////////////////////////////////////////////// | ||||
// Stream | ||||
/*! \class rapidjson::Stream | ||||
\brief Concept for reading and writing characters. | ||||
For read-only stream, no need to implement PutBegin(), Put(), Flush() and Pu | ||||
tEnd(). | ||||
For write-only stream, only need to implement Put() and Flush(). | ||||
\code | ||||
concept Stream { | ||||
typename Ch; //!< Character type of the stream. | ||||
//! Read the current character from stream without moving the read cursor. | ||||
Ch Peek() const; | ||||
//! Read the current character from stream and moving the read cursor to nex | ||||
t character. | ||||
Ch Take(); | ||||
//! Get the current read cursor. | ||||
//! \return Number of characters read from start. | ||||
size_t Tell(); | ||||
//! Begin writing operation at the current read pointer. | ||||
//! \return The begin writer pointer. | ||||
Ch* PutBegin(); | ||||
//! Write a character. | ||||
void Put(Ch c); | ||||
//! Flush the buffer. | ||||
void Flush(); | ||||
//! End the writing operation. | ||||
//! \param begin The begin write pointer returned by PutBegin(). | ||||
//! \return Number of characters written. | ||||
size_t PutEnd(Ch* begin); | ||||
} | ||||
\endcode | ||||
*/ | ||||
//! Provides additional information for stream. | ||||
/*! | ||||
By using traits pattern, this type provides a default configuration for stre | ||||
am. | ||||
For custom stream, this type can be specialized for other configuration. | ||||
See TEST(Reader, CustomStringStream) in readertest.cpp for example. | ||||
*/ | ||||
template<typename Stream> | ||||
struct StreamTraits { | ||||
//! Whether to make local copy of stream for optimization during parsing. | ||||
/*! | ||||
By default, for safety, streams do not use local copy optimization. | ||||
Stream that can be copied fast should specialize this, like StreamTraits | ||||
<StringStream>. | ||||
*/ | ||||
enum { copyOptimization = 0 }; | ||||
}; | ||||
//! Put N copies of a character to a stream. | ||||
template<typename Stream, typename Ch> | ||||
inline void PutN(Stream& stream, Ch c, size_t n) { | ||||
for (size_t i = 0; i < n; i++) | ||||
stream.Put(c); | ||||
} | ||||
/////////////////////////////////////////////////////////////////////////////// | ||||
// StringStream | ||||
//! Read-only string stream. | ||||
/*! \note implements Stream concept | ||||
*/ | ||||
template <typename Encoding> | ||||
struct GenericStringStream { | ||||
typedef typename Encoding::Ch Ch; | ||||
GenericStringStream(const Ch *src) : src_(src), head_(src) {} | ||||
Ch Peek() const { return *src_; } | ||||
Ch Take() { return *src_++; } | ||||
size_t Tell() const { return static_cast<size_t>(src_ - head_); } | ||||
Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } | ||||
void Put(Ch) { RAPIDJSON_ASSERT(false); } | ||||
void Flush() { RAPIDJSON_ASSERT(false); } | ||||
size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } | ||||
const Ch* src_; //!< Current read position. | ||||
const Ch* head_; //!< Original head of the string. | ||||
}; | ||||
template <typename Encoding> | ||||
struct StreamTraits<GenericStringStream<Encoding> > { | ||||
enum { copyOptimization = 1 }; | ||||
}; | ||||
//! String stream with UTF8 encoding. | ||||
typedef GenericStringStream<UTF8<> > StringStream; | ||||
/////////////////////////////////////////////////////////////////////////////// | ||||
// InsituStringStream | ||||
//! A read-write string stream. | ||||
/*! This string stream is particularly designed for in-situ parsing. | ||||
\note implements Stream concept | ||||
*/ | ||||
template <typename Encoding> | ||||
struct GenericInsituStringStream { | ||||
typedef typename Encoding::Ch Ch; | ||||
GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} | ||||
// Read | ||||
Ch Peek() { return *src_; } | ||||
Ch Take() { return *src_++; } | ||||
size_t Tell() { return static_cast<size_t>(src_ - head_); } | ||||
// Write | ||||
void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } | ||||
Ch* PutBegin() { return dst_ = src_; } | ||||
size_t PutEnd(Ch* begin) { return static_cast<size_t>(dst_ - begin); } | ||||
void Flush() {} | ||||
Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } | ||||
void Pop(size_t count) { dst_ -= count; } | ||||
Ch* src_; | ||||
Ch* dst_; | ||||
Ch* head_; | ||||
}; | ||||
template <typename Encoding> | ||||
struct StreamTraits<GenericInsituStringStream<Encoding> > { | ||||
enum { copyOptimization = 1 }; | ||||
}; | ||||
//! Insitu string stream with UTF8 encoding. | ||||
typedef GenericInsituStringStream<UTF8<> > InsituStringStream; | ||||
/////////////////////////////////////////////////////////////////////////////// | ||||
// Type | ||||
//! Type of JSON value | //! Type of JSON value | |||
enum Type { | enum Type { | |||
kNullType = 0, //!< null | kNullType = 0, //!< null | |||
kFalseType = 1, //!< false | kFalseType = 1, //!< false | |||
kTrueType = 2, //!< true | kTrueType = 2, //!< true | |||
kObjectType = 3, //!< object | kObjectType = 3, //!< object | |||
kArrayType = 4, //!< array | kArrayType = 4, //!< array | |||
kStringType = 5, //!< string | kStringType = 5, //!< string | |||
kNumberType = 6 //!< number | kNumberType = 6 //!< number | |||
}; | }; | |||
End of changes. 21 change blocks. | ||||
161 lines changed or deleted | 127 lines changed or added |