1 #ifndef RAPIDJSON_RAPIDJSON_H_
2 #define RAPIDJSON_RAPIDJSON_H_
22 #ifndef RAPIDJSON_NO_INT64DEFINE
24 #ifndef __STDC_CONSTANT_MACROS
25 # define __STDC_CONSTANT_MACROS 1 // required by C++ standard
28 #include "msinttypes/stdint.h"
29 #include "msinttypes/inttypes.h"
36 #endif // RAPIDJSON_NO_INT64TYPEDEF
41 #ifndef RAPIDJSON_FORCEINLINE
43 #define RAPIDJSON_FORCEINLINE __forceinline
44 #elif defined(__GNUC__) && __GNUC__ >= 4
45 #define RAPIDJSON_FORCEINLINE __attribute__((always_inline))
47 #define RAPIDJSON_FORCEINLINE
49 #endif // RAPIDJSON_FORCEINLINE
53 #define RAPIDJSON_LITTLEENDIAN 0
54 #define RAPIDJSON_BIGENDIAN 1
65 #ifndef RAPIDJSON_ENDIAN
67 # ifdef __BYTE_ORDER__
68 # if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
69 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
70 # elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
71 # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
73 # error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN.
74 # endif // __BYTE_ORDER__
76 # elif defined(__GLIBC__)
78 # if (__BYTE_ORDER == __LITTLE_ENDIAN)
79 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
80 # elif (__BYTE_ORDER == __BIG_ENDIAN)
81 # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
83 # error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN.
86 # elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
87 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
88 # elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
89 # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
91 # elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__)
92 # define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
93 # 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__)
94 # define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
96 # error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN.
98 #endif // RAPIDJSON_ENDIAN
108 #ifndef RAPIDJSON_ALIGN
109 #define RAPIDJSON_ALIGN(x) ((x + 3u) & ~3u)
121 #if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42)
122 #define RAPIDJSON_SIMD
128 #ifndef RAPIDJSON_NO_SIZETYPEDEFINE
129 namespace rapidjson {
144 #ifndef RAPIDJSON_ASSERT
146 #define RAPIDJSON_ASSERT(x) assert(x)
147 #endif // RAPIDJSON_ASSERT
153 #ifndef RAPIDJSON_STATIC_ASSERT
155 namespace rapidjson {
157 template <
bool x>
struct STATIC_ASSERTION_FAILURE;
158 template <>
struct STATIC_ASSERTION_FAILURE<true> {
enum { value = 1 }; };
159 template<
int x>
struct StaticAssertTest {};
162 #define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y)
163 #define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y)
164 #define RAPIDJSON_DO_JOIN2(X, Y) X##Y
166 #if defined(__GNUC__)
167 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
169 #define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
178 #define RAPIDJSON_STATIC_ASSERT(x) typedef ::rapidjson::StaticAssertTest<\
179 sizeof(::rapidjson::STATIC_ASSERTION_FAILURE<bool(x) >)>\
180 RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
188 #define RAPIDJSON_MULTILINEMACRO_BEGIN do {
189 #define RAPIDJSON_MULTILINEMACRO_END \
193 #define RAPIDJSON_VERSION_CODE(x,y,z) \
194 (((x)*100000) + ((y)*100) + (z))
197 #define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x)
198 #define RAPIDJSON_DO_STRINGIFY(x) #x
203 #if defined(__clang__) || (defined(__GNUC__) && RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) >= RAPIDJSON_VERSION_CODE(4,2,0))
205 #define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x))
206 #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x)
207 #define RAPIDJSON_DIAG_OFF(x) \
208 RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x)))
211 #if defined(__clang__) || (defined(__GNUC__) && RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) >= RAPIDJSON_VERSION_CODE(4,6,0))
212 #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push)
213 #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop)
214 #else // GCC >= 4.2, < 4.6
215 #define RAPIDJSON_DIAG_PUSH
216 #define RAPIDJSON_DIAG_POP
219 #elif defined(_MSC_VER)
222 #define RAPIDJSON_PRAGMA(x) __pragma(x)
223 #define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x))
225 #define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x)
226 #define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push)
227 #define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop)
231 #define RAPIDJSON_DIAG_OFF(x)
232 #define RAPIDJSON_DIAG_PUSH
233 #define RAPIDJSON_DIAG_POP
235 #endif // RAPIDJSON_DIAG_*
242 #include "allocators.h"
243 #include "encodings.h"
246 namespace rapidjson {
285 size_t PutEnd(Ch* begin);
296 template<
typename Stream>
303 enum { copyOptimization = 0 };
307 template<
typename Stream,
typename Ch>
309 for (
size_t i = 0; i < n; i++)
319 template <
typename Encoding>
321 typedef typename Encoding::Ch Ch;
325 Ch Peek()
const {
return *
src_; }
326 Ch Take() {
return *
src_++; }
327 size_t Tell()
const {
return static_cast<size_t>(
src_ -
head_); }
338 template <
typename Encoding>
340 enum { copyOptimization = 1 };
353 template <
typename Encoding>
355 typedef typename Encoding::Ch Ch;
360 Ch Peek() {
return *src_; }
361 Ch Take() {
return *src_++; }
362 size_t Tell() {
return static_cast<size_t>(src_ - head_); }
367 Ch* PutBegin() {
return dst_ = src_; }
368 size_t PutEnd(Ch* begin) {
return static_cast<size_t>(dst_ - begin); }
371 Ch* Push(
size_t count) { Ch* begin = dst_; dst_ += count;
return begin; }
372 void Pop(
size_t count) { dst_ -= count; }
379 template <
typename Encoding>
381 enum { copyOptimization = 1 };
403 #endif // RAPIDJSON_RAPIDJSON_H_
true
Definition: rapidjson.h:394
Read-only string stream.
Definition: rapidjson.h:320
unsigned SizeType
Use 32-bit array/string indices even for 64-bit platform, instead of using size_t.
Definition: rapidjson.h:133
false
Definition: rapidjson.h:393
const Ch * head_
Original head of the string.
Definition: rapidjson.h:335
const Ch * src_
Current read position.
Definition: rapidjson.h:334
GenericInsituStringStream< UTF8<> > InsituStringStream
Insitu string stream with UTF8 encoding.
Definition: rapidjson.h:385
Concept for encoding of Unicode characters.
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:146
Type
Type of JSON value.
Definition: rapidjson.h:391
object
Definition: rapidjson.h:395
GenericStringStream< UTF8<> > StringStream
String stream with UTF8 encoding.
Definition: rapidjson.h:344
array
Definition: rapidjson.h:396
void PutN(FileWriteStream &stream, char c, size_t n)
Implement specialized version of PutN() with memset() for better performance.
Definition: filewritestream.h:71
null
Definition: rapidjson.h:392
Concept for reading and writing characters.
string
Definition: rapidjson.h:397
number
Definition: rapidjson.h:398
Provides additional information for stream.
Definition: rapidjson.h:297
A read-write string stream.
Definition: rapidjson.h:354