rapidjson.h
Go to the documentation of this file.
1 // Tencent is pleased to support the open source community by making RapidJSON available.
2 //
3 // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4 //
5 // Licensed under the MIT License (the "License"); you may not use this file except
6 // in compliance with the License. You may obtain a copy of the License at
7 //
8 // http://opensource.org/licenses/MIT
9 //
10 // Unless required by applicable law or agreed to in writing, software distributed
11 // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12 // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13 // specific language governing permissions and limitations under the License.
14 
15 #ifndef RAPIDJSON_RAPIDJSON_H_
16 #define RAPIDJSON_RAPIDJSON_H_
17 
39 #include <cstdlib> // malloc(), realloc(), free(), size_t
40 #include <cstring> // memset(), memcpy(), memmove(), memcmp()
41 
43 // RAPIDJSON_VERSION_STRING
44 //
45 // ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt.
46 //
47 
49 // token stringification
50 #define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x)
51 #define RAPIDJSON_DO_STRINGIFY(x) #x
52 
53 // token concatenation
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
57 
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)
80 
82 // RAPIDJSON_NAMESPACE_(BEGIN|END)
117 #ifndef RAPIDJSON_NAMESPACE
118 #define RAPIDJSON_NAMESPACE rapidjson
119 #endif
120 #ifndef RAPIDJSON_NAMESPACE_BEGIN
121 #define RAPIDJSON_NAMESPACE_BEGIN \
122  namespace RAPIDJSON_NAMESPACE \
123  {
124 #endif
125 #ifndef RAPIDJSON_NAMESPACE_END
126 #define RAPIDJSON_NAMESPACE_END }
127 #endif
128 
130 // RAPIDJSON_HAS_STDSTRING
131 
132 #ifndef RAPIDJSON_HAS_STDSTRING
133 #if RAPIDJSON_DOXYGEN_RUNNING
134 #define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation
135 #else
136 #define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default
137 #endif
138 
148 #endif // !defined(RAPIDJSON_HAS_STDSTRING)
149 
150 #if RAPIDJSON_HAS_STDSTRING
151 #include <string>
152 #endif // RAPIDJSON_HAS_STDSTRING
153 
155 // RAPIDJSON_NO_INT64DEFINE
156 
167 #ifndef RAPIDJSON_NO_INT64DEFINE
168 #if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013
170 #include "msinttypes/stdint.h"
171 #include "msinttypes/inttypes.h"
172 #else
173 // Other compilers should have this.
174 #include <stdint.h>
175 #include <inttypes.h>
176 #endif
177 #if RAPIDJSON_DOXYGEN_RUNNING
179 #define RAPIDJSON_NO_INT64DEFINE
180 #endif
181 #endif // RAPIDJSON_NO_INT64TYPEDEF
182 
184 // RAPIDJSON_FORCEINLINE
185 
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))
192 #else
193 #define RAPIDJSON_FORCEINLINE
194 #endif
195 #endif // RAPIDJSON_FORCEINLINE
197 
199 // RAPIDJSON_ENDIAN
200 #define RAPIDJSON_LITTLEENDIAN 0
201 #define RAPIDJSON_BIGENDIAN 1
202 
203 
216 #ifndef RAPIDJSON_ENDIAN
217 // Detect with GCC 4.6's macro
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
223 #else
224 #error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN.
225 #endif // __BYTE_ORDER__
226 // Detect with GLIBC's endian.h
227 #elif defined(__GLIBC__)
228 #include <endian.h>
229 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
230 #define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
231 #elif (__BYTE_ORDER == __BIG_ENDIAN)
232 #define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
233 #else
234 #error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN.
235 #endif // __GLIBC__
236 // Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro
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
241 // Detect with architecture macros
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
253 #else
254 #error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN.
255 #endif
256 #endif // RAPIDJSON_ENDIAN
257 
259 // RAPIDJSON_64BIT
260 
262 #ifndef RAPIDJSON_64BIT
263 #if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__)
264 #define RAPIDJSON_64BIT 1
265 #else
266 #define RAPIDJSON_64BIT 0
267 #endif
268 #endif // RAPIDJSON_64BIT
269 
271 // RAPIDJSON_ALIGN
272 
274 
280 #ifndef RAPIDJSON_ALIGN
281 #define RAPIDJSON_ALIGN(x) (((x) + static_cast<size_t>(7u)) & ~static_cast<size_t>(7u))
282 #endif
283 
285 // RAPIDJSON_UINT64_C2
286 
288 
293 #ifndef RAPIDJSON_UINT64_C2
294 #define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
295 #endif
296 
298 // RAPIDJSON_48BITPOINTER_OPTIMIZATION
299 
301 
308 #ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION
309 #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || \
310  defined(_M_AMD64)
311 #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1
312 #else
313 #define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0
314 #endif
315 #endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION
316 
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
320 #endif
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))))
328 #else
329 #define RAPIDJSON_SETPOINTER(type, p, x) (p = (x))
330 #define RAPIDJSON_GETPOINTER(type, p) (p)
331 #endif
332 
334 // RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_NEON/RAPIDJSON_SIMD
335 
362 #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING)
363 #define RAPIDJSON_SIMD
364 #endif
365 
367 // RAPIDJSON_NO_SIZETYPEDEFINE
368 
369 #ifndef RAPIDJSON_NO_SIZETYPEDEFINE
370 
385 #if RAPIDJSON_DOXYGEN_RUNNING
386 #define RAPIDJSON_NO_SIZETYPEDEFINE
387 #endif
390 
394 typedef unsigned SizeType;
396 #endif
397 
398 // always import std::size_t to rapidjson namespace
400 using std::size_t;
402 
404 // RAPIDJSON_ASSERT
405 
407 
414 #ifndef RAPIDJSON_ASSERT
415 #include <cassert>
416 #define RAPIDJSON_ASSERT(x) assert(x)
417 #endif // RAPIDJSON_ASSERT
418 
420 // RAPIDJSON_STATIC_ASSERT
421 
422 // Prefer C++11 static_assert, if available
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))
426 #endif // C++11
427 #endif // RAPIDJSON_STATIC_ASSERT
428 
429 // Adopt C++03 implementation from boost
430 #ifndef RAPIDJSON_STATIC_ASSERT
431 #ifndef __clang__
432 #endif
435 template <bool x>
436 struct STATIC_ASSERTION_FAILURE;
437 template <>
438 struct STATIC_ASSERTION_FAILURE<true>
439 {
440  enum
441  {
442  value = 1
443  };
444 };
445 template <size_t x>
446 struct StaticAssertTest
447 {
448 };
450 
451 #if defined(__GNUC__) || defined(__clang__)
452 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
453 #else
454 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
455 #endif
456 #ifndef __clang__
457 #endif
459 
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
469 
471 // RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY
472 
474 
478 #ifndef RAPIDJSON_LIKELY
479 #if defined(__GNUC__) || defined(__clang__)
480 #define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1)
481 #else
482 #define RAPIDJSON_LIKELY(x) (x)
483 #endif
484 #endif
485 
487 
491 #ifndef RAPIDJSON_UNLIKELY
492 #if defined(__GNUC__) || defined(__clang__)
493 #define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
494 #else
495 #define RAPIDJSON_UNLIKELY(x) (x)
496 #endif
497 #endif
498 
500 // Helpers
501 
503 
504 #define RAPIDJSON_MULTILINEMACRO_BEGIN \
505  do \
506  {
507 #define RAPIDJSON_MULTILINEMACRO_END \
508  } \
509  while ((void)0, 0)
510 
511 // adopted from Boost
512 #define RAPIDJSON_VERSION_CODE(x, y, z) (((x)*100000) + ((y)*100) + (z))
513 
515 // RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF
516 
517 #if defined(__GNUC__)
518 #define RAPIDJSON_GNUC RAPIDJSON_VERSION_CODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
519 #endif
520 
521 #if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4, 2, 0))
522 
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)))
526 
527 // push/pop support in Clang and GCC>=4.6
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 /* ignored */
533 #define RAPIDJSON_DIAG_POP /* ignored */
534 #endif
535 
536 #elif defined(_MSC_VER)
537 
538 // pragma (MSVC specific)
539 #define RAPIDJSON_PRAGMA(x) __pragma(x)
540 #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x))
541 
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)
545 
546 #else
547 
548 #define RAPIDJSON_DIAG_OFF(x) /* ignored */
549 #define RAPIDJSON_DIAG_PUSH /* ignored */
550 #define RAPIDJSON_DIAG_POP /* ignored */
551 
552 #endif // RAPIDJSON_DIAG_*
553 
555 // C++11 features
556 
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
562 #else
563 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0
564 #endif
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__))
569 
570 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1
571 #else
572 #define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0
573 #endif
574 #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
575 
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
584 #else
585 #define RAPIDJSON_HAS_CXX11_NOEXCEPT 0
586 #endif
587 #endif
588 #if RAPIDJSON_HAS_CXX11_NOEXCEPT
589 #define RAPIDJSON_NOEXCEPT noexcept
590 #else
591 #define RAPIDJSON_NOEXCEPT /* noexcept */
592 #endif // RAPIDJSON_HAS_CXX11_NOEXCEPT
593 
594 // no automatic detection, yet
595 #ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS
596 #if (defined(_MSC_VER) && _MSC_VER >= 1700)
597 #define RAPIDJSON_HAS_CXX11_TYPETRAITS 1
598 #else
599 #define RAPIDJSON_HAS_CXX11_TYPETRAITS 0
600 #endif
601 #endif
602 
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
611 #else
612 #define RAPIDJSON_HAS_CXX11_RANGE_FOR 0
613 #endif
614 #endif // RAPIDJSON_HAS_CXX11_RANGE_FOR
615 
617 
619 
629 // RAPIDJSON_NOEXCEPT_ASSERT
631 
632 #ifndef RAPIDJSON_NOEXCEPT_ASSERT
633 #if RAPIDJSON_ASSERT_THROWS
634 #if RAPIDJSON_HAS_CXX11_NOEXCEPT
635 #define RAPIDJSON_NOEXCEPT_ASSERT(x)
636 #else
637 #define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x)
638 #endif // RAPIDJSON_HAS_CXX11_NOEXCEPT
639 #else
640 #define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x)
641 #endif // RAPIDJSON_ASSERT_THROWS
642 #endif // RAPIDJSON_NOEXCEPT_ASSERT
643 
645 // new/delete
646 
647 #ifndef RAPIDJSON_NEW
648 #define RAPIDJSON_NEW(TypeName) new TypeName
650 #endif
651 #ifndef RAPIDJSON_DELETE
652 #define RAPIDJSON_DELETE(x) delete x
654 #endif
655 
657 // Type
658 
664 
666 enum Type
667 {
668  kNullType = 0,
670  kTrueType = 2,
675 };
676 
678 
679 #endif // RAPIDJSON_RAPIDJSON_H_
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:394
object
Definition: rapidjson.h:671
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition: rapidjson.h:126
array
Definition: rapidjson.h:672
false
Definition: rapidjson.h:669
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition: rapidjson.h:121
string
Definition: rapidjson.h:673
number
Definition: rapidjson.h:674
const GenericPointer< typename T::ValueType > T2 value
Definition: pointer.h:1563
true
Definition: rapidjson.h:670
Type
Type of JSON value.
Definition: rapidjson.h:666
null
Definition: rapidjson.h:668


xbot_talker
Author(s): wangxiaoyun
autogenerated on Sat Oct 10 2020 03:27:53