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