Skip to content

Commit 1391e42

Browse files
authored
Merge pull request Tencent#3 from miloyip/master
Merge back
2 parents 5b593bb + e5635fb commit 1391e42

File tree

7 files changed

+157
-118
lines changed

7 files changed

+157
-118
lines changed

CMakeLists.txt

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -173,15 +173,35 @@ install(DIRECTORY example/
173173
# Provide config and version files to be used by other applications
174174
# ===============================
175175

176-
export(PACKAGE ${PROJECT_NAME})
177-
178-
# cmake-modules
179-
CONFIGURE_FILE(${PROJECT_NAME}Config.cmake.in
180-
${PROJECT_NAME}Config.cmake
181-
@ONLY)
182-
CONFIGURE_FILE(${PROJECT_NAME}ConfigVersion.cmake.in
183-
${PROJECT_NAME}ConfigVersion.cmake
184-
@ONLY)
176+
################################################################################
177+
# Export package for use from the build tree
178+
EXPORT( PACKAGE ${PROJECT_NAME} )
179+
180+
# Create the RapidJSONConfig.cmake file for other cmake projects.
181+
# ... for the build tree
182+
SET( CONFIG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
183+
SET( CONFIG_DIR ${CMAKE_CURRENT_BINARY_DIR})
184+
CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
185+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY )
186+
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}ConfigVersion.cmake.in
187+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake @ONLY)
188+
189+
# ... for the install tree
190+
SET( CMAKECONFIG_INSTALL_DIR lib/cmake/${PROJECT_NAME} )
191+
FILE( RELATIVE_PATH REL_INCLUDE_DIR
192+
"${CMAKE_INSTALL_PREFIX}/${CMAKECONFIG_INSTALL_DIR}"
193+
"${CMAKE_INSTALL_PREFIX}/include" )
194+
195+
SET( ${PROJECT_NAME}_INCLUDE_DIR "\${${PROJECT_NAME}_CMAKE_DIR}/${REL_INCLUDE_DIR}" )
196+
SET( CONFIG_SOURCE_DIR )
197+
SET( CONFIG_DIR )
198+
CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
199+
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake @ONLY )
200+
201+
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake"
202+
DESTINATION ${CMAKECONFIG_INSTALL_DIR} )
203+
204+
# Install files
185205
INSTALL(FILES
186206
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
187207
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake

RapidJSONConfig.cmake.in

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1-
get_filename_component(RAPIDJSON_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
2-
set(RAPIDJSON_INCLUDE_DIRS "@INCLUDE_INSTALL_DIR@")
3-
message(STATUS "RapidJSON found. Headers: ${RAPIDJSON_INCLUDE_DIRS}")
1+
################################################################################
2+
# RapidJSON source dir
3+
set( RapidJSON_SOURCE_DIR "@CONFIG_SOURCE_DIR@")
4+
5+
################################################################################
6+
# RapidJSON build dir
7+
set( RapidJSON_DIR "@CONFIG_DIR@")
8+
9+
################################################################################
10+
# Compute paths
11+
get_filename_component(RapidJSON_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
12+
13+
set( RapidJSON_INCLUDE_DIR "@RapidJSON_INCLUDE_DIR@" )
14+
set( RapidJSON_INCLUDE_DIRS "@RapidJSON_INCLUDE_DIR@" )
15+
message(STATUS "RapidJSON found. Headers: ${RapidJSON_INCLUDE_DIRS}")

example/lookaheadparser/lookaheadparser.cpp

Lines changed: 83 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@
1919
//
2020
// After calling EnterObject, you retrieve keys via NextObjectKey() and values via
2121
// the normal getters. When NextObjectKey() returns null, you have exited the
22-
// object, or you can call ExitObject() to skip to the end of the object
22+
// object, or you can call SkipObject() to skip to the end of the object
2323
// immediately. If you fetch the entire object (i.e. NextObjectKey() returned null),
24-
// you should not call ExitObject().
24+
// you should not call SkipObject().
2525
//
2626
// After calling EnterArray(), you must alternate between calling NextArrayValue()
2727
// to see if the array has more data, and then retrieving values via the normal
28-
// getters. You can call ExitArray() to skip to the end of the array immediately.
28+
// getters. You can call SkipArray() to skip to the end of the array immediately.
2929
// If you fetch the entire array (i.e. NextArrayValue() returned null),
30-
// you should not call ExitArray().
30+
// you should not call SkipArray().
3131
//
3232
// This parser uses in-situ strings, so the JSON buffer will be altered during the
3333
// parse.
@@ -37,15 +37,15 @@ using namespace rapidjson;
3737

3838
class LookaheadParserHandler {
3939
public:
40-
bool Null() { st_ = kHasValue; v_.SetNull(); return true; }
41-
bool Bool(bool b) { st_ = kHasValue; v_.SetBool(b); return true; }
42-
bool Int(int i) { st_ = kHasValue; v_.SetInt(i); return true; }
43-
bool Uint(unsigned u) { st_ = kHasValue; v_.SetUint(u); return true; }
44-
bool Int64(int64_t i) { st_ = kHasValue; v_.SetInt64(i); return true; }
45-
bool Uint64(uint64_t u) { st_ = kHasValue; v_.SetUint64(u); return true; }
46-
bool Double(double d) { st_ = kHasValue; v_.SetDouble(d); return true; }
40+
bool Null() { st_ = kHasNull; v_.SetNull(); return true; }
41+
bool Bool(bool b) { st_ = kHasBool; v_.SetBool(b); return true; }
42+
bool Int(int i) { st_ = kHasNumber; v_.SetInt(i); return true; }
43+
bool Uint(unsigned u) { st_ = kHasNumber; v_.SetUint(u); return true; }
44+
bool Int64(int64_t i) { st_ = kHasNumber; v_.SetInt64(i); return true; }
45+
bool Uint64(uint64_t u) { st_ = kHasNumber; v_.SetUint64(u); return true; }
46+
bool Double(double d) { st_ = kHasNumber; v_.SetDouble(d); return true; }
4747
bool RawNumber(const char*, SizeType, bool) { return false; }
48-
bool String(const char* str, SizeType length, bool) { st_ = kHasValue; v_.SetString(str, length); return true; }
48+
bool String(const char* str, SizeType length, bool) { st_ = kHasString; v_.SetString(str, length); return true; }
4949
bool StartObject() { st_ = kEnteringObject; return true; }
5050
bool Key(const char* str, SizeType length, bool) { st_ = kHasKey; v_.SetString(str, length); return true; }
5151
bool EndObject(SizeType) { st_ = kExitingObject; return true; }
@@ -58,8 +58,12 @@ class LookaheadParserHandler {
5858

5959
protected:
6060
enum LookaheadParsingState {
61+
kInit,
6162
kError,
62-
kHasValue,
63+
kHasNull,
64+
kHasBool,
65+
kHasNumber,
66+
kHasString,
6367
kHasKey,
6468
kEnteringObject,
6569
kExitingObject,
@@ -75,7 +79,7 @@ class LookaheadParserHandler {
7579
static const int parseFlags = kParseDefaultFlags | kParseInsituFlag;
7680
};
7781

78-
LookaheadParserHandler::LookaheadParserHandler(char* str) : ss_(str) {
82+
LookaheadParserHandler::LookaheadParserHandler(char* str) : v_(), st_(kInit), r_(), ss_(str) {
7983
r_.IterativeParseInit();
8084
ParseNext();
8185
}
@@ -93,10 +97,8 @@ class LookaheadParser : protected LookaheadParserHandler {
9397
public:
9498
LookaheadParser(char* str) : LookaheadParserHandler(str) {}
9599

96-
void EnterObject();
97-
void EnterArray();
98-
void ExitObject();
99-
void ExitArray();
100+
bool EnterObject();
101+
bool EnterArray();
100102
const char* NextObjectKey();
101103
bool NextArrayValue();
102104
int GetInt();
@@ -105,57 +107,52 @@ class LookaheadParser : protected LookaheadParserHandler {
105107
bool GetBool();
106108
void GetNull();
107109

110+
void SkipObject();
111+
void SkipArray();
108112
void SkipValue();
109113
Value* PeekValue();
110114
int PeekType(); // returns a rapidjson::Type, or -1 for no value (at end of object/array)
111115

112116
bool IsValid() { return st_ != kError; }
117+
118+
protected:
119+
void SkipOut(int depth);
113120
};
114121

115-
void LookaheadParser::EnterObject() {
122+
bool LookaheadParser::EnterObject() {
116123
if (st_ != kEnteringObject) {
117124
st_ = kError;
118-
return;
125+
return false;
119126
}
120127

121128
ParseNext();
129+
return true;
122130
}
123131

124-
void LookaheadParser::EnterArray() {
132+
bool LookaheadParser::EnterArray() {
125133
if (st_ != kEnteringArray) {
126134
st_ = kError;
127-
return;
135+
return false;
128136
}
129137

130138
ParseNext();
131-
}
132-
133-
void LookaheadParser::ExitObject() {
134-
while (NextObjectKey()) {
135-
SkipValue();
136-
}
137-
}
138-
139-
void LookaheadParser::ExitArray() {
140-
while (NextArrayValue()) {
141-
SkipValue();
142-
}
139+
return true;
143140
}
144141

145142
const char* LookaheadParser::NextObjectKey() {
146-
if (st_ == kExitingObject) {
143+
if (st_ == kHasKey) {
144+
const char* result = v_.GetString();
147145
ParseNext();
148-
return 0;
146+
return result;
149147
}
150-
151-
if (st_ != kHasKey || !v_.IsString()) {
148+
149+
if (st_ != kExitingObject) {
152150
st_ = kError;
153151
return 0;
154152
}
155153

156-
const char* result = v_.GetString();
157154
ParseNext();
158-
return result;
155+
return 0;
159156
}
160157

161158
bool LookaheadParser::NextArrayValue() {
@@ -164,11 +161,16 @@ bool LookaheadParser::NextArrayValue() {
164161
return false;
165162
}
166163

164+
if (st_ == kError || st_ == kExitingObject || st_ == kHasKey) {
165+
st_ = kError;
166+
return false;
167+
}
168+
167169
return true;
168170
}
169171

170172
int LookaheadParser::GetInt() {
171-
if (st_ != kHasValue || !v_.IsInt()) {
173+
if (st_ != kHasNumber || !v_.IsInt()) {
172174
st_ = kError;
173175
return 0;
174176
}
@@ -179,7 +181,7 @@ int LookaheadParser::GetInt() {
179181
}
180182

181183
double LookaheadParser::GetDouble() {
182-
if (st_ != kHasValue || !v_.IsNumber()) {
184+
if (st_ != kHasNumber) {
183185
st_ = kError;
184186
return 0.;
185187
}
@@ -190,7 +192,7 @@ double LookaheadParser::GetDouble() {
190192
}
191193

192194
bool LookaheadParser::GetBool() {
193-
if (st_ != kHasValue || !v_.IsBool()) {
195+
if (st_ != kHasBool) {
194196
st_ = kError;
195197
return false;
196198
}
@@ -201,7 +203,7 @@ bool LookaheadParser::GetBool() {
201203
}
202204

203205
void LookaheadParser::GetNull() {
204-
if (st_ != kHasValue || !v_.IsNull()) {
206+
if (st_ != kHasNull) {
205207
st_ = kError;
206208
return;
207209
}
@@ -210,7 +212,7 @@ void LookaheadParser::GetNull() {
210212
}
211213

212214
const char* LookaheadParser::GetString() {
213-
if (st_ != kHasValue || !v_.IsString()) {
215+
if (st_ != kHasString) {
214216
st_ = kError;
215217
return 0;
216218
}
@@ -220,58 +222,57 @@ const char* LookaheadParser::GetString() {
220222
return result;
221223
}
222224

223-
void LookaheadParser::SkipValue() {
224-
int depth = 0;
225+
void LookaheadParser::SkipOut(int depth) {
225226
do {
226-
switch (st_) {
227-
case kEnteringArray:
228-
case kEnteringObject:
229-
++depth;
230-
break;
231-
232-
case kExitingArray:
233-
case kExitingObject:
234-
--depth;
235-
break;
236-
237-
case kError:
238-
return;
239-
240-
case kHasKey:
241-
case kHasValue:
242-
break;
227+
if (st_ == kEnteringArray || st_ == kEnteringObject) {
228+
++depth;
243229
}
230+
else if (st_ == kExitingArray || st_ == kExitingObject) {
231+
--depth;
232+
}
233+
else if (st_ == kError) {
234+
return;
235+
}
236+
244237
ParseNext();
245238
}
246239
while (depth > 0);
247240
}
248241

242+
void LookaheadParser::SkipValue() {
243+
SkipOut(0);
244+
}
245+
246+
void LookaheadParser::SkipArray() {
247+
SkipOut(1);
248+
}
249+
250+
void LookaheadParser::SkipObject() {
251+
SkipOut(1);
252+
}
253+
249254
Value* LookaheadParser::PeekValue() {
250-
if (st_ == kHasValue || st_ == kHasKey) {
255+
if (st_ >= kHasNull && st_ <= kHasKey) {
251256
return &v_;
252257
}
253258

254259
return 0;
255260
}
256261

257262
int LookaheadParser::PeekType() {
258-
switch (st_) {
259-
case kHasValue:
260-
case kHasKey:
261-
return v_.GetType();
262-
263-
case kEnteringArray:
264-
return kArrayType;
265-
266-
case kEnteringObject:
267-
return kObjectType;
268-
269-
case kExitingArray:
270-
case kExitingObject:
271-
case kError:
272-
default:
273-
return -1;
263+
if (st_ >= kHasNull && st_ <= kHasKey) {
264+
return v_.GetType();
274265
}
266+
267+
if (st_ == kEnteringArray) {
268+
return kArrayType;
269+
}
270+
271+
if (st_ == kEnteringObject) {
272+
return kObjectType;
273+
}
274+
275+
return -1;
275276
}
276277

277278
//-------------------------------------------------------------------------
@@ -325,7 +326,7 @@ int main() {
325326
cout << r.GetString() << " ";
326327
}
327328
else {
328-
r.ExitArray();
329+
r.SkipArray();
329330
break;
330331
}
331332
}

include/rapidjson/document.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2564,7 +2564,7 @@ class GenericObject {
25642564
GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
25652565
GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
25662566
template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2567-
void RemoveAllMembers() { return value_.RemoveAllMembers(); }
2567+
void RemoveAllMembers() { value_.RemoveAllMembers(); }
25682568
bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); }
25692569
#if RAPIDJSON_HAS_STDSTRING
25702570
bool RemoveMember(const std::basic_string<Ch>& name) const { return value_.RemoveMember(name); }

0 commit comments

Comments
 (0)