From 57e1c875534eb2e2c183c62e4421ad1a0bf8bf73 Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 15:14:18 +0200 Subject: [PATCH 01/11] add `Key()` method to the `Handler` concept For more details see: https://github.com/miloyip/rapidjson/issues/132 This commit tries to minimize the required code changes and forwards the `Handler::Key()` calls to `Handler::String()` wherever possible in order to not break existing code; or at least not code deriving from `BaseReaderHandler` when implementing a custom `Handler`. --- include/rapidjson/document.h | 4 +++- include/rapidjson/reader.h | 40 ++++++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index 13acb38..310fc71 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -1386,7 +1386,7 @@ int z = a[0u].GetInt(); // This works too. if (!handler.StartObject()) return false; for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { - if (!handler.String(m->name.GetString(), m->name.GetStringLength(), (m->name.flags_ & kCopyFlag) != 0)) + if (!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.flags_ & kCopyFlag) != 0)) return false; if (!m->value.Accept(handler)) return false; @@ -1794,6 +1794,8 @@ private: bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + bool EndObject(SizeType memberCount) { typename ValueType::Member* members = stack_.template Pop(memberCount); stack_.template Top()->SetObjectRaw(members, (SizeType)memberCount, GetAllocator()); diff --git a/include/rapidjson/reader.h b/include/rapidjson/reader.h index 701255f..f02dd16 100644 --- a/include/rapidjson/reader.h +++ b/include/rapidjson/reader.h @@ -152,6 +152,7 @@ concept Handler { bool Double(double d); bool String(const Ch* str, SizeType length, bool copy); bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); bool EndObject(SizeType memberCount); bool StartArray(); bool EndArray(SizeType elementCount); @@ -181,6 +182,7 @@ struct BaseReaderHandler { bool Double(double) { return static_cast(*this).Default(); } bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } bool StartObject() { return static_cast(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } bool EndObject(SizeType) { return static_cast(*this).Default(); } bool StartArray() { return static_cast(*this).Default(); } bool EndArray(SizeType) { return static_cast(*this).Default(); } @@ -471,7 +473,7 @@ private: if (is.Peek() != '"') RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); - ParseString(is, handler); + ParseKey(is, handler); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; SkipWhitespace(is); @@ -576,7 +578,7 @@ private: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1); } - // Helper function to parse four hexidecimal digits in \uXXXX in ParseString(). + // Helper function to parse four hexidecimal digits in \uXXXX in ParseStringOrKey(). template unsigned ParseHex4(InputStream& is) { unsigned codepoint = 0; @@ -616,8 +618,8 @@ private: }; // Parse string and generate String event. Different code paths for kParseInsituFlag. - template - void ParseString(InputStream& is, Handler& handler) { + template + void ParseStringOrKey(InputStream& is, Handler& handler) { internal::StreamLocalCopy copy(is); InputStream& s(copy.s); @@ -627,18 +629,38 @@ private: RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; size_t length = s.PutEnd(head) - 1; RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); - if (!handler.String((typename TargetEncoding::Ch*)head, SizeType(length), false)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + if (isKey) { + if (!handler.Key((typename TargetEncoding::Ch*)head, SizeType(length), false)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } else { + if (!handler.String((typename TargetEncoding::Ch*)head, SizeType(length), false)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } } else { StackStream stackStream(stack_); ParseStringToStream(s, stackStream); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - if (!handler.String(stack_.template Pop(stackStream.length_), stackStream.length_ - 1, true)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + if (isKey) { + if (!handler.Key(stack_.template Pop(stackStream.length_), stackStream.length_ - 1, true)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } else { + if (!handler.String(stack_.template Pop(stackStream.length_), stackStream.length_ - 1, true)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } } } + template + void ParseKey(InputStream& is, Handler& handler) { + return ParseStringOrKey(is, handler); + } + + template + void ParseString(InputStream& is, Handler& handler) { + return ParseStringOrKey(is, handler); + } + // Parse string to an output is // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. template @@ -1194,7 +1216,7 @@ private: } case IterativeParsingMemberKeyState: - ParseString(is, handler); + ParseKey(is, handler); if (HasParseError()) return IterativeParsingErrorState; else From 17b1a14d622f396838fd52ba8d4fac2407a37e75 Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 15:20:05 +0200 Subject: [PATCH 02/11] add `Key()` method to `Writer` and `PrettyWriter` --- include/rapidjson/prettywriter.h | 2 ++ include/rapidjson/writer.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/include/rapidjson/prettywriter.h b/include/rapidjson/prettywriter.h index f89be1b..2fc9b75 100644 --- a/include/rapidjson/prettywriter.h +++ b/include/rapidjson/prettywriter.h @@ -88,6 +88,8 @@ public: return Base::WriteStartObject(); } + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + bool EndObject(SizeType memberCount = 0) { (void)memberCount; RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); diff --git a/include/rapidjson/writer.h b/include/rapidjson/writer.h index 73e4aff..2f46b66 100644 --- a/include/rapidjson/writer.h +++ b/include/rapidjson/writer.h @@ -131,6 +131,8 @@ public: return WriteStartObject(); } + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + bool EndObject(SizeType memberCount = 0) { (void)memberCount; RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); From 23b3d24355cf8c30593c747ad97bd4ee5a65e83c Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 15:24:52 +0200 Subject: [PATCH 03/11] add `Key()` to IterativeParsingReaderHandler` in `readertest.cpp` --- test/unittest/readertest.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/unittest/readertest.cpp b/test/unittest/readertest.cpp index 09560d8..4c3011c 100644 --- a/test/unittest/readertest.cpp +++ b/test/unittest/readertest.cpp @@ -848,6 +848,8 @@ struct IterativeParsingReaderHandler { bool StartObject() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTOBJECT; return true; } + bool Key (const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool EndObject(SizeType c) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_ENDOBJECT; From 0f4071046f73466efae6b0808e364de5e59ceb62 Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 15:30:44 +0200 Subject: [PATCH 04/11] fix `simplereader.cpp` and the `Key()->String()` forwarding in `BaseReaderHandler` --- example/simplereader/simplereader.cpp | 1 + include/rapidjson/reader.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/example/simplereader/simplereader.cpp b/example/simplereader/simplereader.cpp index 9914253..83b3f1d 100644 --- a/example/simplereader/simplereader.cpp +++ b/example/simplereader/simplereader.cpp @@ -17,6 +17,7 @@ struct MyHandler { return true; } bool StartObject() { cout << "StartObject()" << endl; return true; } + bool Key(const char* str, SizeType length, bool copy) { return String(str, length, copy); } bool EndObject(SizeType memberCount) { cout << "EndObject(" << memberCount << ")" << endl; return true; } bool StartArray() { cout << "StartArray()" << endl; return true; } bool EndArray(SizeType elementCount) { cout << "EndArray(" << elementCount << ")" << endl; return true; } diff --git a/include/rapidjson/reader.h b/include/rapidjson/reader.h index f02dd16..92fd781 100644 --- a/include/rapidjson/reader.h +++ b/include/rapidjson/reader.h @@ -182,7 +182,7 @@ struct BaseReaderHandler { bool Double(double) { return static_cast(*this).Default(); } bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } bool StartObject() { return static_cast(*this).Default(); } - bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } bool EndObject(SizeType) { return static_cast(*this).Default(); } bool StartArray() { return static_cast(*this).Default(); } bool EndArray(SizeType) { return static_cast(*this).Default(); } From c8da4d86fc691429dd42bfbf2db27e67d06c4d3f Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 15:35:01 +0200 Subject: [PATCH 05/11] add `Key()->String()` forwarding to the `capitalize` example --- example/capitalize/capitalize.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/example/capitalize/capitalize.cpp b/example/capitalize/capitalize.cpp index b8d6086..dd94d24 100644 --- a/example/capitalize/capitalize.cpp +++ b/example/capitalize/capitalize.cpp @@ -31,6 +31,7 @@ struct CapitalizeFilter { return out_.String(&buffer_.front(), length, true); // true = output handler need to copy the string } bool StartObject() { return out_.StartObject(); } + bool Key(const char* str, SizeType length, bool copy) { return String(str, length, copy); } bool EndObject(SizeType memberCount) { return out_.EndObject(memberCount); } bool StartArray() { return out_.StartArray(); } bool EndArray(SizeType elementCount) { return out_.EndArray(elementCount); } From 8b2faff9818aca4be10589d31088ea1c1bae3bb2 Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 15:51:09 +0200 Subject: [PATCH 06/11] enhance `IterativeParsingReaderHandler` to check for `Key()` events --- test/unittest/readertest.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/test/unittest/readertest.cpp b/test/unittest/readertest.cpp index 4c3011c..d7c8edb 100644 --- a/test/unittest/readertest.cpp +++ b/test/unittest/readertest.cpp @@ -819,9 +819,10 @@ struct IterativeParsingReaderHandler { const static int LOG_DOUBLE = -7; const static int LOG_STRING = -8; const static int LOG_STARTOBJECT = -9; - const static int LOG_ENDOBJECT = -10; - const static int LOG_STARTARRAY = -11; - const static int LOG_ENDARRAY = -12; + const static int LOG_KEY = -10; + const static int LOG_ENDOBJECT = -11; + const static int LOG_STARTARRAY = -12; + const static int LOG_ENDARRAY = -13; const static size_t LogCapacity = 256; int Logs[LogCapacity]; @@ -848,7 +849,7 @@ struct IterativeParsingReaderHandler { bool StartObject() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTOBJECT; return true; } - bool Key (const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool Key (const Ch* str, SizeType len, bool copy) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_KEY; return true; } bool EndObject(SizeType c) { RAPIDJSON_ASSERT(LogCount < LogCapacity); @@ -882,7 +883,7 @@ TEST(Reader, IterativeParsing_General) { handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_STARTOBJECT, - handler.LOG_STRING, + handler.LOG_KEY, handler.LOG_STARTARRAY, handler.LOG_INT, handler.LOG_INT, @@ -920,7 +921,7 @@ TEST(Reader, IterativeParsing_Count) { handler.LOG_STARTOBJECT, handler.LOG_ENDOBJECT, 0, handler.LOG_STARTOBJECT, - handler.LOG_STRING, + handler.LOG_KEY, handler.LOG_INT, handler.LOG_ENDOBJECT, 1, handler.LOG_STARTARRAY, From 25f4892aa1552259112c6a2bbbc93181f1287a43 Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 15:56:21 +0200 Subject: [PATCH 07/11] removed unused argument names --- test/unittest/readertest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/readertest.cpp b/test/unittest/readertest.cpp index d7c8edb..b42d832 100644 --- a/test/unittest/readertest.cpp +++ b/test/unittest/readertest.cpp @@ -849,7 +849,7 @@ struct IterativeParsingReaderHandler { bool StartObject() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTOBJECT; return true; } - bool Key (const Ch* str, SizeType len, bool copy) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_KEY; return true; } + bool Key (const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_KEY; return true; } bool EndObject(SizeType c) { RAPIDJSON_ASSERT(LogCount < LogCapacity); From 4a71dc6d584ac90870906de9a477af24eb5e1bde Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 16:54:01 +0200 Subject: [PATCH 08/11] reunified `ParseKey`, `ParseString`, and `ParseStringOrKey` again --- include/rapidjson/reader.h | 42 +++++++++++++------------------------- 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/include/rapidjson/reader.h b/include/rapidjson/reader.h index 92fd781..d93c8c2 100644 --- a/include/rapidjson/reader.h +++ b/include/rapidjson/reader.h @@ -473,7 +473,7 @@ private: if (is.Peek() != '"') RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); - ParseKey(is, handler); + ParseString(is, handler, true); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; SkipWhitespace(is); @@ -578,7 +578,7 @@ private: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1); } - // Helper function to parse four hexidecimal digits in \uXXXX in ParseStringOrKey(). + // Helper function to parse four hexidecimal digits in \uXXXX in ParseString(). template unsigned ParseHex4(InputStream& is) { unsigned codepoint = 0; @@ -618,47 +618,33 @@ private: }; // Parse string and generate String event. Different code paths for kParseInsituFlag. - template - void ParseStringOrKey(InputStream& is, Handler& handler) { + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { internal::StreamLocalCopy copy(is); InputStream& s(copy.s); + const typename TargetEncoding::Ch* str = NULL; + SizeType len = 0; + if (parseFlags & kParseInsituFlag) { typename InputStream::Ch *head = s.PutBegin(); ParseStringToStream(s, s); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; size_t length = s.PutEnd(head) - 1; RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); - if (isKey) { - if (!handler.Key((typename TargetEncoding::Ch*)head, SizeType(length), false)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); - } else { - if (!handler.String((typename TargetEncoding::Ch*)head, SizeType(length), false)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); - } + str = (const typename TargetEncoding::Ch*)head; + len = SizeType(length); } else { StackStream stackStream(stack_); ParseStringToStream(s, stackStream); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - if (isKey) { - if (!handler.Key(stack_.template Pop(stackStream.length_), stackStream.length_ - 1, true)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); - } else { - if (!handler.String(stack_.template Pop(stackStream.length_), stackStream.length_ - 1, true)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); - } + str = stack_.template Pop(stackStream.length_); + len = stackStream.length_ - 1; } - } - template - void ParseKey(InputStream& is, Handler& handler) { - return ParseStringOrKey(is, handler); - } - - template - void ParseString(InputStream& is, Handler& handler) { - return ParseStringOrKey(is, handler); + if(!(isKey ? handler.Key(str, len, false) : handler.String(str, len, false))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); } // Parse string to an output is @@ -1216,7 +1202,7 @@ private: } case IterativeParsingMemberKeyState: - ParseKey(is, handler); + ParseString(is, handler, true); if (HasParseError()) return IterativeParsingErrorState; else From e70494bc00a60e47be06cb625889b09fe63342ea Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 17:29:52 +0200 Subject: [PATCH 09/11] fix for `Reader::ParseString()` implementation plus some minor code cleanups and additions --- example/capitalize/capitalize.cpp | 3 +-- example/simplereader/simplereader.cpp | 7 +++++-- include/rapidjson/prettywriter.h | 1 + include/rapidjson/reader.h | 14 ++++++-------- include/rapidjson/writer.h | 1 + 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/example/capitalize/capitalize.cpp b/example/capitalize/capitalize.cpp index dd94d24..230bc28 100644 --- a/example/capitalize/capitalize.cpp +++ b/example/capitalize/capitalize.cpp @@ -14,7 +14,7 @@ using namespace rapidjson; template -struct CapitalizeFilter { +struct CapitalizeFilter : public BaseReaderHandler, OutputHandler> { CapitalizeFilter(OutputHandler& out) : out_(out), buffer_() {} bool Null() { return out_.Null(); } @@ -31,7 +31,6 @@ struct CapitalizeFilter { return out_.String(&buffer_.front(), length, true); // true = output handler need to copy the string } bool StartObject() { return out_.StartObject(); } - bool Key(const char* str, SizeType length, bool copy) { return String(str, length, copy); } bool EndObject(SizeType memberCount) { return out_.EndObject(memberCount); } bool StartArray() { return out_.StartArray(); } bool EndArray(SizeType elementCount) { return out_.EndArray(elementCount); } diff --git a/example/simplereader/simplereader.cpp b/example/simplereader/simplereader.cpp index 83b3f1d..b47d9b2 100644 --- a/example/simplereader/simplereader.cpp +++ b/example/simplereader/simplereader.cpp @@ -4,7 +4,7 @@ using namespace rapidjson; using namespace std; -struct MyHandler { +struct MyHandler : public BaseReaderHandler, MyHandler> { bool Null() { cout << "Null()" << endl; return true; } bool Bool(bool b) { cout << "Bool(" << boolalpha << b << ")" << endl; return true; } bool Int(int i) { cout << "Int(" << i << ")" << endl; return true; } @@ -17,7 +17,10 @@ struct MyHandler { return true; } bool StartObject() { cout << "StartObject()" << endl; return true; } - bool Key(const char* str, SizeType length, bool copy) { return String(str, length, copy); } + bool Key(const char* str, SizeType length, bool copy) { + cout << "Key(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl; + return true; + } bool EndObject(SizeType memberCount) { cout << "EndObject(" << memberCount << ")" << endl; return true; } bool StartArray() { cout << "StartArray()" << endl; return true; } bool EndArray(SizeType elementCount) { cout << "EndArray(" << elementCount << ")" << endl; return true; } diff --git a/include/rapidjson/prettywriter.h b/include/rapidjson/prettywriter.h index 2fc9b75..4eac8d7 100644 --- a/include/rapidjson/prettywriter.h +++ b/include/rapidjson/prettywriter.h @@ -137,6 +137,7 @@ public: //! Simpler but slower overload. bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } //@} protected: diff --git a/include/rapidjson/reader.h b/include/rapidjson/reader.h index d93c8c2..e853bea 100644 --- a/include/rapidjson/reader.h +++ b/include/rapidjson/reader.h @@ -623,27 +623,25 @@ private: internal::StreamLocalCopy copy(is); InputStream& s(copy.s); - const typename TargetEncoding::Ch* str = NULL; - SizeType len = 0; - + bool success = false; if (parseFlags & kParseInsituFlag) { typename InputStream::Ch *head = s.PutBegin(); ParseStringToStream(s, s); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; size_t length = s.PutEnd(head) - 1; RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); - str = (const typename TargetEncoding::Ch*)head; - len = SizeType(length); + const typename TargetEncoding::Ch* const str = (const typename TargetEncoding::Ch*)head; + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); } else { StackStream stackStream(stack_); ParseStringToStream(s, stackStream); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - str = stack_.template Pop(stackStream.length_); - len = stackStream.length_ - 1; + const typename TargetEncoding::Ch* const str = stack_.template Pop(stackStream.length_); + success = (isKey ? handler.Key(str, stackStream.length_ - 1, false) : handler.String(str, stackStream.length_ - 1, false)); } - if(!(isKey ? handler.Key(str, len, false) : handler.String(str, len, false))) + if(!success) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); } diff --git a/include/rapidjson/writer.h b/include/rapidjson/writer.h index 2f46b66..fb6601e 100644 --- a/include/rapidjson/writer.h +++ b/include/rapidjson/writer.h @@ -167,6 +167,7 @@ public: //! Simpler but slower overload. bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } //@} From 00ac1024eee997815f422f67055415cc1b3ccb3b Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 17:37:13 +0200 Subject: [PATCH 10/11] more changes --- example/simplereader/simplereader.cpp | 2 +- include/rapidjson/reader.h | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/example/simplereader/simplereader.cpp b/example/simplereader/simplereader.cpp index b47d9b2..edbdb63 100644 --- a/example/simplereader/simplereader.cpp +++ b/example/simplereader/simplereader.cpp @@ -4,7 +4,7 @@ using namespace rapidjson; using namespace std; -struct MyHandler : public BaseReaderHandler, MyHandler> { +struct MyHandler { bool Null() { cout << "Null()" << endl; return true; } bool Bool(bool b) { cout << "Bool(" << boolalpha << b << ")" << endl; return true; } bool Int(int i) { cout << "Int(" << i << ")" << endl; return true; } diff --git a/include/rapidjson/reader.h b/include/rapidjson/reader.h index e853bea..885fe22 100644 --- a/include/rapidjson/reader.h +++ b/include/rapidjson/reader.h @@ -637,8 +637,10 @@ private: StackStream stackStream(stack_); ParseStringToStream(s, stackStream); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - const typename TargetEncoding::Ch* const str = stack_.template Pop(stackStream.length_); - success = (isKey ? handler.Key(str, stackStream.length_ - 1, false) : handler.String(str, stackStream.length_ - 1, false)); + success = (isKey + ? handler.Key( stack_.template Pop(stackStream.length_), stackStream.length_ - 1, false) + : handler.String(stack_.template Pop(stackStream.length_), stackStream.length_ - 1, false) + ); } if(!success) From f0d9ab4ec93034f66485c70f851b8872c8d6fde0 Mon Sep 17 00:00:00 2001 From: Kosta Date: Thu, 4 Sep 2014 18:00:05 +0200 Subject: [PATCH 11/11] finally fixing `Reader::ParseString()` It was a copy-n-paste error for the last argument of `Key()` and `String()`... --- example/capitalize/capitalize.cpp | 3 ++- include/rapidjson/reader.h | 11 ++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/example/capitalize/capitalize.cpp b/example/capitalize/capitalize.cpp index 230bc28..dd94d24 100644 --- a/example/capitalize/capitalize.cpp +++ b/example/capitalize/capitalize.cpp @@ -14,7 +14,7 @@ using namespace rapidjson; template -struct CapitalizeFilter : public BaseReaderHandler, OutputHandler> { +struct CapitalizeFilter { CapitalizeFilter(OutputHandler& out) : out_(out), buffer_() {} bool Null() { return out_.Null(); } @@ -31,6 +31,7 @@ struct CapitalizeFilter : public BaseReaderHandler, OutputHandler> { return out_.String(&buffer_.front(), length, true); // true = output handler need to copy the string } bool StartObject() { return out_.StartObject(); } + bool Key(const char* str, SizeType length, bool copy) { return String(str, length, copy); } bool EndObject(SizeType memberCount) { return out_.EndObject(memberCount); } bool StartArray() { return out_.StartArray(); } bool EndArray(SizeType elementCount) { return out_.EndArray(elementCount); } diff --git a/include/rapidjson/reader.h b/include/rapidjson/reader.h index 885fe22..f41ba2f 100644 --- a/include/rapidjson/reader.h +++ b/include/rapidjson/reader.h @@ -630,20 +630,17 @@ private: RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; size_t length = s.PutEnd(head) - 1; RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); - const typename TargetEncoding::Ch* const str = (const typename TargetEncoding::Ch*)head; + const typename TargetEncoding::Ch* const str = (typename TargetEncoding::Ch*)head; success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); } else { StackStream stackStream(stack_); ParseStringToStream(s, stackStream); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - success = (isKey - ? handler.Key( stack_.template Pop(stackStream.length_), stackStream.length_ - 1, false) - : handler.String(stack_.template Pop(stackStream.length_), stackStream.length_ - 1, false) - ); + const typename TargetEncoding::Ch* const str = stack_.template Pop(stackStream.length_); + success = (isKey ? handler.Key(str, stackStream.length_ - 1, true) : handler.String(str, stackStream.length_ - 1, true)); } - - if(!success) + if (!success) RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); }