1e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Tencent is pleased to support the open source community by making RapidJSON available.
2e462795ff5d4c7359f9e8637c10544bb2de70107tturney//
3e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4e462795ff5d4c7359f9e8637c10544bb2de70107tturney//
5e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Licensed under the MIT License (the "License"); you may not use this file except
6e462795ff5d4c7359f9e8637c10544bb2de70107tturney// in compliance with the License. You may obtain a copy of the License at
7e462795ff5d4c7359f9e8637c10544bb2de70107tturney//
8e462795ff5d4c7359f9e8637c10544bb2de70107tturney// http://opensource.org/licenses/MIT
9e462795ff5d4c7359f9e8637c10544bb2de70107tturney//
10e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Unless required by applicable law or agreed to in writing, software distributed
11e462795ff5d4c7359f9e8637c10544bb2de70107tturney// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12e462795ff5d4c7359f9e8637c10544bb2de70107tturney// CONDITIONS OF ANY KIND, either express or implied. See the License for the
13e462795ff5d4c7359f9e8637c10544bb2de70107tturney// specific language governing permissions and limitations under the License.
14e462795ff5d4c7359f9e8637c10544bb2de70107tturney
15e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "perftest.h"
16e462795ff5d4c7359f9e8637c10544bb2de70107tturney
17e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if TEST_RAPIDJSON
18e462795ff5d4c7359f9e8637c10544bb2de70107tturney
19e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/rapidjson.h"
20e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/document.h"
21e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/prettywriter.h"
22e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/stringbuffer.h"
23e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/filereadstream.h"
24e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/encodedstream.h"
25e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/memorystream.h"
26e462795ff5d4c7359f9e8637c10544bb2de70107tturney
27e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifdef RAPIDJSON_SSE2
28e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define SIMD_SUFFIX(name) name##_SSE2
29e462795ff5d4c7359f9e8637c10544bb2de70107tturney#elif defined(RAPIDJSON_SSE42)
30e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define SIMD_SUFFIX(name) name##_SSE42
31e462795ff5d4c7359f9e8637c10544bb2de70107tturney#else
32e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define SIMD_SUFFIX(name) name
33e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif
34e462795ff5d4c7359f9e8637c10544bb2de70107tturney
35e462795ff5d4c7359f9e8637c10544bb2de70107tturneyusing namespace rapidjson;
36e462795ff5d4c7359f9e8637c10544bb2de70107tturney
37e462795ff5d4c7359f9e8637c10544bb2de70107tturneyclass RapidJson : public PerfTest {
38e462795ff5d4c7359f9e8637c10544bb2de70107tturneypublic:
39e462795ff5d4c7359f9e8637c10544bb2de70107tturney    RapidJson() : temp_(), doc_() {}
40e462795ff5d4c7359f9e8637c10544bb2de70107tturney
41e462795ff5d4c7359f9e8637c10544bb2de70107tturney    virtual void SetUp() {
42e462795ff5d4c7359f9e8637c10544bb2de70107tturney        PerfTest::SetUp();
43e462795ff5d4c7359f9e8637c10544bb2de70107tturney
44e462795ff5d4c7359f9e8637c10544bb2de70107tturney        // temp buffer for insitu parsing.
45e462795ff5d4c7359f9e8637c10544bb2de70107tturney        temp_ = (char *)malloc(length_ + 1);
46e462795ff5d4c7359f9e8637c10544bb2de70107tturney
47e462795ff5d4c7359f9e8637c10544bb2de70107tturney        // Parse as a document
48e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_FALSE(doc_.Parse(json_).IsNull());
49e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
50e462795ff5d4c7359f9e8637c10544bb2de70107tturney
51e462795ff5d4c7359f9e8637c10544bb2de70107tturney    virtual void TearDown() {
52e462795ff5d4c7359f9e8637c10544bb2de70107tturney        PerfTest::TearDown();
53e462795ff5d4c7359f9e8637c10544bb2de70107tturney        free(temp_);
54e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
55e462795ff5d4c7359f9e8637c10544bb2de70107tturney
56e462795ff5d4c7359f9e8637c10544bb2de70107tturneyprivate:
57e462795ff5d4c7359f9e8637c10544bb2de70107tturney    RapidJson(const RapidJson&);
58e462795ff5d4c7359f9e8637c10544bb2de70107tturney    RapidJson& operator=(const RapidJson&);
59e462795ff5d4c7359f9e8637c10544bb2de70107tturney
60e462795ff5d4c7359f9e8637c10544bb2de70107tturneyprotected:
61e462795ff5d4c7359f9e8637c10544bb2de70107tturney    char *temp_;
62e462795ff5d4c7359f9e8637c10544bb2de70107tturney    Document doc_;
63e462795ff5d4c7359f9e8637c10544bb2de70107tturney};
64e462795ff5d4c7359f9e8637c10544bb2de70107tturney
65e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(ReaderParseInsitu_DummyHandler)) {
66e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
67e462795ff5d4c7359f9e8637c10544bb2de70107tturney        memcpy(temp_, json_, length_ + 1);
68e462795ff5d4c7359f9e8637c10544bb2de70107tturney        InsituStringStream s(temp_);
69e462795ff5d4c7359f9e8637c10544bb2de70107tturney        BaseReaderHandler<> h;
70e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Reader reader;
71e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_TRUE(reader.Parse<kParseInsituFlag>(s, h));
72e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
73e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
74e462795ff5d4c7359f9e8637c10544bb2de70107tturney
75e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(ReaderParseInsitu_DummyHandler_ValidateEncoding)) {
76e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
77e462795ff5d4c7359f9e8637c10544bb2de70107tturney        memcpy(temp_, json_, length_ + 1);
78e462795ff5d4c7359f9e8637c10544bb2de70107tturney        InsituStringStream s(temp_);
79e462795ff5d4c7359f9e8637c10544bb2de70107tturney        BaseReaderHandler<> h;
80e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Reader reader;
81e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_TRUE(reader.Parse<kParseInsituFlag | kParseValidateEncodingFlag>(s, h));
82e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
83e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
84e462795ff5d4c7359f9e8637c10544bb2de70107tturney
85e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler)) {
86e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
87e462795ff5d4c7359f9e8637c10544bb2de70107tturney        StringStream s(json_);
88e462795ff5d4c7359f9e8637c10544bb2de70107tturney        BaseReaderHandler<> h;
89e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Reader reader;
90e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_TRUE(reader.Parse(s, h));
91e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
92e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
93e462795ff5d4c7359f9e8637c10544bb2de70107tturney
94e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_FullPrecision)) {
95e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
96e462795ff5d4c7359f9e8637c10544bb2de70107tturney        StringStream s(json_);
97e462795ff5d4c7359f9e8637c10544bb2de70107tturney        BaseReaderHandler<> h;
98e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Reader reader;
99e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_TRUE(reader.Parse<kParseFullPrecisionFlag>(s, h));
100e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
101e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
102e462795ff5d4c7359f9e8637c10544bb2de70107tturney
103e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterative_DummyHandler)) {
104e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
105e462795ff5d4c7359f9e8637c10544bb2de70107tturney        StringStream s(json_);
106e462795ff5d4c7359f9e8637c10544bb2de70107tturney        BaseReaderHandler<> h;
107e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Reader reader;
108e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_TRUE(reader.Parse<kParseIterativeFlag>(s, h));
109e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
110e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
111e462795ff5d4c7359f9e8637c10544bb2de70107tturney
112e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterativeInsitu_DummyHandler)) {
113e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
114e462795ff5d4c7359f9e8637c10544bb2de70107tturney        memcpy(temp_, json_, length_ + 1);
115e462795ff5d4c7359f9e8637c10544bb2de70107tturney        InsituStringStream s(temp_);
116e462795ff5d4c7359f9e8637c10544bb2de70107tturney        BaseReaderHandler<> h;
117e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Reader reader;
118e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_TRUE(reader.Parse<kParseIterativeFlag|kParseInsituFlag>(s, h));
119e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
120e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
121e462795ff5d4c7359f9e8637c10544bb2de70107tturney
122e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_ValidateEncoding)) {
123e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
124e462795ff5d4c7359f9e8637c10544bb2de70107tturney        StringStream s(json_);
125e462795ff5d4c7359f9e8637c10544bb2de70107tturney        BaseReaderHandler<> h;
126e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Reader reader;
127e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_TRUE(reader.Parse<kParseValidateEncodingFlag>(s, h));
128e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
129e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
130e462795ff5d4c7359f9e8637c10544bb2de70107tturney
131e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(DocumentParseInsitu_MemoryPoolAllocator)) {
132e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
133e462795ff5d4c7359f9e8637c10544bb2de70107tturney        memcpy(temp_, json_, length_ + 1);
134e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Document doc;
135e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc.ParseInsitu(temp_);
136e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_TRUE(doc.IsObject());
137e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
138e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
139e462795ff5d4c7359f9e8637c10544bb2de70107tturney
140e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(DocumentParseIterativeInsitu_MemoryPoolAllocator)) {
141e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
142e462795ff5d4c7359f9e8637c10544bb2de70107tturney        memcpy(temp_, json_, length_ + 1);
143e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Document doc;
144e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc.ParseInsitu<kParseIterativeFlag>(temp_);
145e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_TRUE(doc.IsObject());
146e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
147e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
148e462795ff5d4c7359f9e8637c10544bb2de70107tturney
149e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(DocumentParse_MemoryPoolAllocator)) {
150e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
151e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Document doc;
152e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc.Parse(json_);
153e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_TRUE(doc.IsObject());
154e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
155e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
156e462795ff5d4c7359f9e8637c10544bb2de70107tturney
157e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(DocumentParseIterative_MemoryPoolAllocator)) {
158e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
159e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Document doc;
160e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc.Parse<kParseIterativeFlag>(json_);
161e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_TRUE(doc.IsObject());
162e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
163e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
164e462795ff5d4c7359f9e8637c10544bb2de70107tturney
165e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(DocumentParse_CrtAllocator)) {
166e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
167e462795ff5d4c7359f9e8637c10544bb2de70107tturney        memcpy(temp_, json_, length_ + 1);
168e462795ff5d4c7359f9e8637c10544bb2de70107tturney        GenericDocument<UTF8<>, CrtAllocator> doc;
169e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc.Parse(temp_);
170e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_TRUE(doc.IsObject());
171e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
172e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
173e462795ff5d4c7359f9e8637c10544bb2de70107tturney
174e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(DocumentParseEncodedInputStream_MemoryStream)) {
175e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
176e462795ff5d4c7359f9e8637c10544bb2de70107tturney        MemoryStream ms(json_, length_);
177e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EncodedInputStream<UTF8<>, MemoryStream> is(ms);
178e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Document doc;
179e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc.ParseStream<0, UTF8<> >(is);
180e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_TRUE(doc.IsObject());
181e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
182e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
183e462795ff5d4c7359f9e8637c10544bb2de70107tturney
184e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(DocumentParseAutoUTFInputStream_MemoryStream)) {
185e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
186e462795ff5d4c7359f9e8637c10544bb2de70107tturney        MemoryStream ms(json_, length_);
187e462795ff5d4c7359f9e8637c10544bb2de70107tturney        AutoUTFInputStream<unsigned, MemoryStream> is(ms);
188e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Document doc;
189e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc.ParseStream<0, AutoUTF<unsigned> >(is);
190e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_TRUE(doc.IsObject());
191e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
192e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
193e462795ff5d4c7359f9e8637c10544bb2de70107tturney
194e462795ff5d4c7359f9e8637c10544bb2de70107tturneytemplate<typename T>
195e462795ff5d4c7359f9e8637c10544bb2de70107tturneysize_t Traverse(const T& value) {
196e462795ff5d4c7359f9e8637c10544bb2de70107tturney    size_t count = 1;
197e462795ff5d4c7359f9e8637c10544bb2de70107tturney    switch(value.GetType()) {
198e462795ff5d4c7359f9e8637c10544bb2de70107tturney        case kObjectType:
199e462795ff5d4c7359f9e8637c10544bb2de70107tturney            for (typename T::ConstMemberIterator itr = value.MemberBegin(); itr != value.MemberEnd(); ++itr) {
200e462795ff5d4c7359f9e8637c10544bb2de70107tturney                count++;    // name
201e462795ff5d4c7359f9e8637c10544bb2de70107tturney                count += Traverse(itr->value);
202e462795ff5d4c7359f9e8637c10544bb2de70107tturney            }
203e462795ff5d4c7359f9e8637c10544bb2de70107tturney            break;
204e462795ff5d4c7359f9e8637c10544bb2de70107tturney
205e462795ff5d4c7359f9e8637c10544bb2de70107tturney        case kArrayType:
206e462795ff5d4c7359f9e8637c10544bb2de70107tturney            for (typename T::ConstValueIterator itr = value.Begin(); itr != value.End(); ++itr)
207e462795ff5d4c7359f9e8637c10544bb2de70107tturney                count += Traverse(*itr);
208e462795ff5d4c7359f9e8637c10544bb2de70107tturney            break;
209e462795ff5d4c7359f9e8637c10544bb2de70107tturney
210e462795ff5d4c7359f9e8637c10544bb2de70107tturney        default:
211e462795ff5d4c7359f9e8637c10544bb2de70107tturney            // Do nothing.
212e462795ff5d4c7359f9e8637c10544bb2de70107tturney            break;
213e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
214e462795ff5d4c7359f9e8637c10544bb2de70107tturney    return count;
215e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
216e462795ff5d4c7359f9e8637c10544bb2de70107tturney
217e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, DocumentTraverse) {
218e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
219e462795ff5d4c7359f9e8637c10544bb2de70107tturney        size_t count = Traverse(doc_);
220e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_EQ(4339u, count);
221e462795ff5d4c7359f9e8637c10544bb2de70107tturney        //if (i == 0)
222e462795ff5d4c7359f9e8637c10544bb2de70107tturney        //  std::cout << count << std::endl;
223e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
224e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
225e462795ff5d4c7359f9e8637c10544bb2de70107tturney
226e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifdef __GNUC__
227e462795ff5d4c7359f9e8637c10544bb2de70107tturneyRAPIDJSON_DIAG_PUSH
228e462795ff5d4c7359f9e8637c10544bb2de70107tturneyRAPIDJSON_DIAG_OFF(effc++)
229e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif
230e462795ff5d4c7359f9e8637c10544bb2de70107tturney
231e462795ff5d4c7359f9e8637c10544bb2de70107tturneystruct ValueCounter : public BaseReaderHandler<> {
232e462795ff5d4c7359f9e8637c10544bb2de70107tturney    ValueCounter() : count_(1) {}   // root
233e462795ff5d4c7359f9e8637c10544bb2de70107tturney
234e462795ff5d4c7359f9e8637c10544bb2de70107tturney    bool EndObject(SizeType memberCount) { count_ += memberCount * 2; return true; }
235e462795ff5d4c7359f9e8637c10544bb2de70107tturney    bool EndArray(SizeType elementCount) { count_ += elementCount; return true; }
236e462795ff5d4c7359f9e8637c10544bb2de70107tturney
237e462795ff5d4c7359f9e8637c10544bb2de70107tturney    SizeType count_;
238e462795ff5d4c7359f9e8637c10544bb2de70107tturney};
239e462795ff5d4c7359f9e8637c10544bb2de70107tturney
240e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifdef __GNUC__
241e462795ff5d4c7359f9e8637c10544bb2de70107tturneyRAPIDJSON_DIAG_POP
242e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif
243e462795ff5d4c7359f9e8637c10544bb2de70107tturney
244e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, DocumentAccept) {
245e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
246e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ValueCounter counter;
247e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc_.Accept(counter);
248e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_EQ(4339u, counter.count_);
249e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
250e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
251e462795ff5d4c7359f9e8637c10544bb2de70107tturney
252e462795ff5d4c7359f9e8637c10544bb2de70107tturneystruct NullStream {
253e462795ff5d4c7359f9e8637c10544bb2de70107tturney    NullStream() /*: length_(0)*/ {}
254e462795ff5d4c7359f9e8637c10544bb2de70107tturney    void Put(char) { /*++length_;*/ }
255e462795ff5d4c7359f9e8637c10544bb2de70107tturney    void Flush() {}
256e462795ff5d4c7359f9e8637c10544bb2de70107tturney    //size_t length_;
257e462795ff5d4c7359f9e8637c10544bb2de70107tturney};
258e462795ff5d4c7359f9e8637c10544bb2de70107tturney
259e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, Writer_NullStream) {
260e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
261e462795ff5d4c7359f9e8637c10544bb2de70107tturney        NullStream s;
262e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Writer<NullStream> writer(s);
263e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc_.Accept(writer);
264e462795ff5d4c7359f9e8637c10544bb2de70107tturney        //if (i == 0)
265e462795ff5d4c7359f9e8637c10544bb2de70107tturney        //  std::cout << s.length_ << std::endl;
266e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
267e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
268e462795ff5d4c7359f9e8637c10544bb2de70107tturney
269e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, Writer_StringBuffer) {
270e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
271e462795ff5d4c7359f9e8637c10544bb2de70107tturney        StringBuffer s(0, 1024 * 1024);
272e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Writer<StringBuffer> writer(s);
273e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc_.Accept(writer);
274e462795ff5d4c7359f9e8637c10544bb2de70107tturney        const char* str = s.GetString();
275e462795ff5d4c7359f9e8637c10544bb2de70107tturney        (void)str;
276e462795ff5d4c7359f9e8637c10544bb2de70107tturney        //if (i == 0)
277e462795ff5d4c7359f9e8637c10544bb2de70107tturney        //  std::cout << strlen(str) << std::endl;
278e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
279e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
280e462795ff5d4c7359f9e8637c10544bb2de70107tturney
281e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, PrettyWriter_StringBuffer) {
282e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
283e462795ff5d4c7359f9e8637c10544bb2de70107tturney        StringBuffer s(0, 2048 * 1024);
284e462795ff5d4c7359f9e8637c10544bb2de70107tturney        PrettyWriter<StringBuffer> writer(s);
285e462795ff5d4c7359f9e8637c10544bb2de70107tturney        writer.SetIndent(' ', 1);
286e462795ff5d4c7359f9e8637c10544bb2de70107tturney        doc_.Accept(writer);
287e462795ff5d4c7359f9e8637c10544bb2de70107tturney        const char* str = s.GetString();
288e462795ff5d4c7359f9e8637c10544bb2de70107tturney        (void)str;
289e462795ff5d4c7359f9e8637c10544bb2de70107tturney        //if (i == 0)
290e462795ff5d4c7359f9e8637c10544bb2de70107tturney        //  std::cout << strlen(str) << std::endl;
291e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
292e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
293e462795ff5d4c7359f9e8637c10544bb2de70107tturney
294e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, internal_Pow10) {
295e462795ff5d4c7359f9e8637c10544bb2de70107tturney    double sum = 0;
296e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount * kTrialCount; i++)
297e462795ff5d4c7359f9e8637c10544bb2de70107tturney        sum += internal::Pow10(int(i & 255));
298e462795ff5d4c7359f9e8637c10544bb2de70107tturney    EXPECT_GT(sum, 0.0);
299e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
300e462795ff5d4c7359f9e8637c10544bb2de70107tturney
301e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SkipWhitespace_Basic) {
302e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
303e462795ff5d4c7359f9e8637c10544bb2de70107tturney        rapidjson::StringStream s(whitespace_);
304e462795ff5d4c7359f9e8637c10544bb2de70107tturney        while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t')
305e462795ff5d4c7359f9e8637c10544bb2de70107tturney            s.Take();
306e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_EQ('[', s.Peek());
307e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
308e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
309e462795ff5d4c7359f9e8637c10544bb2de70107tturney
310e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(SkipWhitespace)) {
311e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
312e462795ff5d4c7359f9e8637c10544bb2de70107tturney        rapidjson::StringStream s(whitespace_);
313e462795ff5d4c7359f9e8637c10544bb2de70107tturney        rapidjson::SkipWhitespace(s);
314e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_EQ('[', s.Peek());
315e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
316e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
317e462795ff5d4c7359f9e8637c10544bb2de70107tturney
318e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SkipWhitespace_strspn) {
319e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
320e462795ff5d4c7359f9e8637c10544bb2de70107tturney        const char* s = whitespace_ + std::strspn(whitespace_, " \t\r\n");
321e462795ff5d4c7359f9e8637c10544bb2de70107tturney        ASSERT_EQ('[', *s);
322e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
323e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
324e462795ff5d4c7359f9e8637c10544bb2de70107tturney
325e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, UTF8_Validate) {
326e462795ff5d4c7359f9e8637c10544bb2de70107tturney    NullStream os;
327e462795ff5d4c7359f9e8637c10544bb2de70107tturney
328e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
329e462795ff5d4c7359f9e8637c10544bb2de70107tturney        StringStream is(json_);
330e462795ff5d4c7359f9e8637c10544bb2de70107tturney        bool result = true;
331e462795ff5d4c7359f9e8637c10544bb2de70107tturney        while (is.Peek() != '\0')
332e462795ff5d4c7359f9e8637c10544bb2de70107tturney            result &= UTF8<>::Validate(is, os);
333e462795ff5d4c7359f9e8637c10544bb2de70107tturney        EXPECT_TRUE(result);
334e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
335e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
336e462795ff5d4c7359f9e8637c10544bb2de70107tturney
337e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, FileReadStream) {
338e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
339e462795ff5d4c7359f9e8637c10544bb2de70107tturney        FILE *fp = fopen(filename_, "rb");
340e462795ff5d4c7359f9e8637c10544bb2de70107tturney        char buffer[65536];
341e462795ff5d4c7359f9e8637c10544bb2de70107tturney        FileReadStream s(fp, buffer, sizeof(buffer));
342e462795ff5d4c7359f9e8637c10544bb2de70107tturney        while (s.Take() != '\0')
343e462795ff5d4c7359f9e8637c10544bb2de70107tturney            ;
344e462795ff5d4c7359f9e8637c10544bb2de70107tturney        fclose(fp);
345e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
346e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
347e462795ff5d4c7359f9e8637c10544bb2de70107tturney
348e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_FileReadStream)) {
349e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (size_t i = 0; i < kTrialCount; i++) {
350e462795ff5d4c7359f9e8637c10544bb2de70107tturney        FILE *fp = fopen(filename_, "rb");
351e462795ff5d4c7359f9e8637c10544bb2de70107tturney        char buffer[65536];
352e462795ff5d4c7359f9e8637c10544bb2de70107tturney        FileReadStream s(fp, buffer, sizeof(buffer));
353e462795ff5d4c7359f9e8637c10544bb2de70107tturney        BaseReaderHandler<> h;
354e462795ff5d4c7359f9e8637c10544bb2de70107tturney        Reader reader;
355e462795ff5d4c7359f9e8637c10544bb2de70107tturney        reader.Parse(s, h);
356e462795ff5d4c7359f9e8637c10544bb2de70107tturney        fclose(fp);
357e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
358e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
359e462795ff5d4c7359f9e8637c10544bb2de70107tturney
360e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif // TEST_RAPIDJSON
361