Electroneum
Toggle main menu visibility
Loading...
Searching...
No Matches
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
23
38
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
58
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 namespace RAPIDJSON_NAMESPACE {
122
#endif
123
#ifndef RAPIDJSON_NAMESPACE_END
124
#define RAPIDJSON_NAMESPACE_END }
125
#endif
126
128
// RAPIDJSON_HAS_STDSTRING
129
130
#ifndef RAPIDJSON_HAS_STDSTRING
131
#ifdef RAPIDJSON_DOXYGEN_RUNNING
132
#define RAPIDJSON_HAS_STDSTRING 1
// force generation of documentation
133
#else
134
#define RAPIDJSON_HAS_STDSTRING 0
// no std::string support by default
135
#endif
146
#endif
// !defined(RAPIDJSON_HAS_STDSTRING)
147
148
#if RAPIDJSON_HAS_STDSTRING
149
#include <string>
150
#endif
// RAPIDJSON_HAS_STDSTRING
151
153
// RAPIDJSON_NO_INT64DEFINE
154
165
#ifndef RAPIDJSON_NO_INT64DEFINE
167
#if defined(_MSC_VER) && (_MSC_VER < 1800)
// Visual Studio 2013
168
#include "
msinttypes/stdint.h
"
169
#include "
msinttypes/inttypes.h
"
170
#else
171
// Other compilers should have this.
172
#include <
stdint.h
>
173
#include <
inttypes.h
>
174
#endif
176
#ifdef RAPIDJSON_DOXYGEN_RUNNING
177
#define RAPIDJSON_NO_INT64DEFINE
178
#endif
179
#endif
// RAPIDJSON_NO_INT64TYPEDEF
180
182
// RAPIDJSON_FORCEINLINE
183
184
#ifndef RAPIDJSON_FORCEINLINE
186
#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))
190
#else
191
#define RAPIDJSON_FORCEINLINE
192
#endif
194
#endif
// RAPIDJSON_FORCEINLINE
195
197
// RAPIDJSON_ENDIAN
198
#define RAPIDJSON_LITTLEENDIAN 0
199
#define RAPIDJSON_BIGENDIAN 1
200
202
214
#ifndef RAPIDJSON_ENDIAN
215
// Detect with GCC 4.6's macro
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
221
# else
222
# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN.
223
# endif
// __BYTE_ORDER__
224
// Detect with GLIBC's endian.h
225
# elif defined(__GLIBC__)
226
# include <endian.h>
227
# if (__BYTE_ORDER == __LITTLE_ENDIAN)
228
# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
229
# elif (__BYTE_ORDER == __BIG_ENDIAN)
230
# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
231
# else
232
# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN.
233
# endif
// __GLIBC__
234
// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro
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
239
// Detect with architecture macros
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) || defined(_M_ARM64))
245
# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
246
# elif defined(RAPIDJSON_DOXYGEN_RUNNING)
247
# define RAPIDJSON_ENDIAN
248
# else
249
# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN.
250
# endif
251
#endif
// RAPIDJSON_ENDIAN
252
254
// RAPIDJSON_64BIT
255
257
#ifndef RAPIDJSON_64BIT
258
#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__)
259
#define RAPIDJSON_64BIT 1
260
#else
261
#define RAPIDJSON_64BIT 0
262
#endif
263
#endif
// RAPIDJSON_64BIT
264
266
// RAPIDJSON_ALIGN
267
269
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))
279
#else
280
#define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u)
281
#endif
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) || defined(_M_AMD64)
310
#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1
311
#else
312
#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0
313
#endif
314
#endif
// RAPIDJSON_48BITPOINTER_OPTIMIZATION
315
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
319
#endif
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))))
322
#else
323
#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x))
324
#define RAPIDJSON_GETPOINTER(type, p) (p)
325
#endif
326
328
// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_NEON/RAPIDJSON_SIMD
329
356
#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \
357
|| defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING)
358
#define RAPIDJSON_SIMD
359
#endif
360
362
// RAPIDJSON_NO_SIZETYPEDEFINE
363
364
#ifndef RAPIDJSON_NO_SIZETYPEDEFINE
380
#ifdef RAPIDJSON_DOXYGEN_RUNNING
381
#define RAPIDJSON_NO_SIZETYPEDEFINE
382
#endif
383
RAPIDJSON_NAMESPACE_BEGIN
385
389
typedef
unsigned
SizeType
;
390
RAPIDJSON_NAMESPACE_END
391
#endif
392
393
// always import std::size_t to rapidjson namespace
394
RAPIDJSON_NAMESPACE_BEGIN
395
using
std::size_t;
396
RAPIDJSON_NAMESPACE_END
397
399
// RAPIDJSON_ASSERT
400
402
409
#ifndef RAPIDJSON_ASSERT
410
#include <cassert>
411
#define RAPIDJSON_ASSERT(x) assert(x)
412
#endif
// RAPIDJSON_ASSERT
413
415
// RAPIDJSON_STATIC_ASSERT
416
417
// Prefer C++11 static_assert, if available
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))
422
#endif
// C++11
423
#endif
// RAPIDJSON_STATIC_ASSERT
424
425
// Adopt C++03 implementation from boost
426
#ifndef RAPIDJSON_STATIC_ASSERT
427
#ifndef __clang__
429
#endif
430
RAPIDJSON_NAMESPACE_BEGIN
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 {};
434
RAPIDJSON_NAMESPACE_END
435
436
#if defined(__GNUC__) || defined(__clang__)
437
#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
438
#else
439
#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
440
#endif
441
#ifndef __clang__
443
#endif
444
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
455
457
// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY
458
460
464
#ifndef RAPIDJSON_LIKELY
465
#if defined(__GNUC__) || defined(__clang__)
466
#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1)
467
#else
468
#define RAPIDJSON_LIKELY(x) (x)
469
#endif
470
#endif
471
473
477
#ifndef RAPIDJSON_UNLIKELY
478
#if defined(__GNUC__) || defined(__clang__)
479
#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
480
#else
481
#define RAPIDJSON_UNLIKELY(x) (x)
482
#endif
483
#endif
484
486
// Helpers
487
489
490
#define RAPIDJSON_MULTILINEMACRO_BEGIN do {
491
#define RAPIDJSON_MULTILINEMACRO_END \
492
} while((void)0, 0)
493
494
// adopted from Boost
495
#define RAPIDJSON_VERSION_CODE(x,y,z) \
496
(((x)*100000) + ((y)*100) + (z))
497
499
// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF
500
501
#if defined(__GNUC__)
502
#define RAPIDJSON_GNUC \
503
RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__)
504
#endif
505
506
#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0))
507
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)))
512
513
// push/pop support in Clang and GCC>=4.6
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
/* ignored */
519
#define RAPIDJSON_DIAG_POP
/* ignored */
520
#endif
521
522
#elif defined(_MSC_VER)
523
524
// pragma (MSVC specific)
525
#define RAPIDJSON_PRAGMA(x) __pragma(x)
526
#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x))
527
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)
531
532
#else
533
534
#define RAPIDJSON_DIAG_OFF(x)
/* ignored */
535
#define RAPIDJSON_DIAG_PUSH
/* ignored */
536
#define RAPIDJSON_DIAG_POP
/* ignored */
537
538
#endif
// RAPIDJSON_DIAG_*
539
541
// C++11 features
542
543
#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS
544
#if defined(__clang__)
545
#if __has_feature(cxx_rvalue_references) && \
546
(defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306)
547
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1
548
#else
549
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0
550
#endif
551
#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \
552
(defined(_MSC_VER) && _MSC_VER >= 1600)
553
554
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1
555
#else
556
#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0
557
#endif
558
#endif
// RAPIDJSON_HAS_CXX11_RVALUE_REFS
559
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__)) || \
564
(defined(_MSC_VER) && _MSC_VER >= 1900)
565
#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1
566
#else
567
#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0
568
#endif
569
#endif
570
#if RAPIDJSON_HAS_CXX11_NOEXCEPT
571
#define RAPIDJSON_NOEXCEPT noexcept
572
#else
573
#define RAPIDJSON_NOEXCEPT
/* noexcept */
574
#endif
// RAPIDJSON_HAS_CXX11_NOEXCEPT
575
576
// no automatic detection, yet
577
#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS
578
#if (defined(_MSC_VER) && _MSC_VER >= 1700)
579
#define RAPIDJSON_HAS_CXX11_TYPETRAITS 1
580
#else
581
#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0
582
#endif
583
#endif
584
585
#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR
586
#if defined(__clang__)
587
#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for)
588
#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \
589
(defined(_MSC_VER) && _MSC_VER >= 1700)
590
#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1
591
#else
592
#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0
593
#endif
594
#endif
// RAPIDJSON_HAS_CXX11_RANGE_FOR
595
597
599
// new/delete
600
601
#ifndef RAPIDJSON_NEW
603
#define RAPIDJSON_NEW(TypeName) new TypeName
604
#endif
605
#ifndef RAPIDJSON_DELETE
607
#define RAPIDJSON_DELETE(x) delete x
608
#endif
609
611
// Type
612
617
RAPIDJSON_NAMESPACE_BEGIN
618
620
enum
Type
{
621
kNullType
= 0,
622
kFalseType
= 1,
623
kTrueType
= 2,
624
kObjectType
= 3,
625
kArrayType
= 4,
626
kStringType
= 5,
627
kNumberType
= 6
628
};
629
630
RAPIDJSON_NAMESPACE_END
631
632
#endif
// RAPIDJSON_RAPIDJSON_H_
RAPIDJSON_NAMESPACE_BEGIN
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition
rapidjson.h:121
RAPIDJSON_NAMESPACE_END
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition
rapidjson.h:124
inttypes.h
value
const GenericPointer< typename T::ValueType > T2 value
Definition
pointer.h:1225
Type
Type
Type of JSON value.
Definition
rapidjson.h:620
kFalseType
@ kFalseType
false
Definition
rapidjson.h:622
kObjectType
@ kObjectType
object
Definition
rapidjson.h:624
kTrueType
@ kTrueType
true
Definition
rapidjson.h:623
kStringType
@ kStringType
string
Definition
rapidjson.h:626
kNullType
@ kNullType
null
Definition
rapidjson.h:621
kArrayType
@ kArrayType
array
Definition
rapidjson.h:625
kNumberType
@ kNumberType
number
Definition
rapidjson.h:627
SizeType
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.).
Definition
rapidjson.h:389
true
#define true
stdint.h
external
rapidjson
include
rapidjson
rapidjson.h
Generated on
for Electroneum by
1.17.0