summaryrefslogtreecommitdiff
path: root/Utilities/cmjsoncpp
diff options
context:
space:
mode:
authorKitware Robot <kwrobot@kitware.com>2021-06-03 14:32:45 -0400
committerBrad King <brad.king@kitware.com>2021-06-03 14:59:42 -0400
commit82584b99e32a8fc7ac46a73ee1966b973fe0c0e1 (patch)
tree70c77af1d1f7d44129bbf12944c6548611aaae56 /Utilities/cmjsoncpp
parent9c33ff4dda643f8a93d55f9895e31dce9056134f (diff)
downloadcmake-82584b99e32a8fc7ac46a73ee1966b973fe0c0e1.tar.gz
jsoncpp: Revert "Code style: add missed explicit 'this->'"
Revert the part of commit 209daa20b2 (Code style: add missed explicit 'this->', 2021-01-05, v3.20.0-rc1~213^2) that updated third-party code.
Diffstat (limited to 'Utilities/cmjsoncpp')
-rw-r--r--Utilities/cmjsoncpp/src/lib_json/json_reader.cpp2027
-rw-r--r--Utilities/cmjsoncpp/src/lib_json/json_value.cpp1847
-rw-r--r--Utilities/cmjsoncpp/src/lib_json/json_writer.cpp1420
3 files changed, 2411 insertions, 2883 deletions
diff --git a/Utilities/cmjsoncpp/src/lib_json/json_reader.cpp b/Utilities/cmjsoncpp/src/lib_json/json_reader.cpp
index 8362fc4cb9..6eeba0e65e 100644
--- a/Utilities/cmjsoncpp/src/lib_json/json_reader.cpp
+++ b/Utilities/cmjsoncpp/src/lib_json/json_reader.cpp
@@ -2,88 +2,74 @@
// Copyright (C) 2016 InfoTeCS JSC. All rights reserved.
// Distributed under MIT license, or public domain if desired and
// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at
-// http://jsoncpp.sourceforge.net/LICENSE
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
#if !defined(JSON_IS_AMALGAMATION)
-# include <json/assertions.h>
-# include <json/reader.h>
-# include <json/value.h>
-
-# include "json_tool.h"
+#include <json/assertions.h>
+#include <json/reader.h>
+#include <json/value.h>
+#include "json_tool.h"
#endif // if !defined(JSON_IS_AMALGAMATION)
-#include <istream>
-#include <limits>
-#include <memory>
-#include <set>
-#include <sstream>
#include <utility>
-
-#include <assert.h>
#include <stdio.h>
+#include <assert.h>
#include <string.h>
+#include <istream>
+#include <sstream>
+#include <memory>
+#include <set>
+#include <limits>
#if defined(_MSC_VER)
-# if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && \
- _MSC_VER >= 1500 // VC++ 9.0 and above
-# define snprintf sprintf_s
-# elif _MSC_VER >= 1900 // VC++ 14.0 and above
-# define snprintf std::snprintf
-# else
-# define snprintf _snprintf
-# endif
+#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above
+#define snprintf sprintf_s
+#elif _MSC_VER >= 1900 // VC++ 14.0 and above
+#define snprintf std::snprintf
+#else
+#define snprintf _snprintf
+#endif
#elif defined(__ANDROID__) || defined(__QNXNTO__)
-# define snprintf snprintf
+#define snprintf snprintf
#elif __cplusplus >= 201103L
-# if !defined(__MINGW32__) && !defined(__CYGWIN__)
-# define snprintf std::snprintf
-# endif
+#if !defined(__MINGW32__) && !defined(__CYGWIN__)
+#define snprintf std::snprintf
+#endif
#endif
#if defined(__QNXNTO__)
-# define sscanf std::sscanf
+#define sscanf std::sscanf
#endif
#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0
// Disable warning about strdup being deprecated.
-# pragma warning(disable : 4996)
+#pragma warning(disable : 4996)
#endif
-// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile
-// time to change the stack limit
+// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile time to change the stack limit
#if !defined(JSONCPP_DEPRECATED_STACK_LIMIT)
-# define JSONCPP_DEPRECATED_STACK_LIMIT 1000
+#define JSONCPP_DEPRECATED_STACK_LIMIT 1000
#endif
-static size_t const stackLimit_g =
- JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue()
+static size_t const stackLimit_g = JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue()
namespace Json {
#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520)
typedef std::unique_ptr<CharReader> CharReaderPtr;
#else
-typedef std::auto_ptr<CharReader> CharReaderPtr;
+typedef std::auto_ptr<CharReader> CharReaderPtr;
#endif
// Implementation of class Features
// ////////////////////////////////
Features::Features()
- : allowComments_(true)
- , strictRoot_(false)
- , allowDroppedNullPlaceholders_(false)
- , allowNumericKeys_(false)
-{
-}
+ : allowComments_(true), strictRoot_(false),
+ allowDroppedNullPlaceholders_(false), allowNumericKeys_(false) {}
-Features Features::all()
-{
- return Features();
-}
+Features Features::all() { return Features(); }
-Features Features::strictMode()
-{
+Features Features::strictMode() {
Features features;
features.allowComments_ = false;
features.strictRoot_ = true;
@@ -95,8 +81,7 @@ Features Features::strictMode()
// Implementation of class Reader
// ////////////////////////////////
-bool Reader::containsNewLine(Reader::Location begin, Reader::Location end)
-{
+bool Reader::containsNewLine(Reader::Location begin, Reader::Location end) {
for (; begin < end; ++begin)
if (*begin == '\n' || *begin == '\r')
return true;
@@ -107,44 +92,24 @@ bool Reader::containsNewLine(Reader::Location begin, Reader::Location end)
// //////////////////////////////////////////////////////////////////
Reader::Reader()
- : errors_()
- , document_()
- , begin_()
- , end_()
- , current_()
- , lastValueEnd_()
- , lastValue_()
- , commentsBefore_()
- , features_(Features::all())
- , collectComments_()
-{
-}
+ : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(),
+ lastValue_(), commentsBefore_(), features_(Features::all()),
+ collectComments_() {}
Reader::Reader(const Features& features)
- : errors_()
- , document_()
- , begin_()
- , end_()
- , current_()
- , lastValueEnd_()
- , lastValue_()
- , commentsBefore_()
- , features_(features)
- , collectComments_()
-{
+ : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(),
+ lastValue_(), commentsBefore_(), features_(features), collectComments_() {
}
-bool Reader::parse(const std::string& document, Value& root,
- bool collectComments)
-{
- this->document_.assign(document.begin(), document.end());
- const char* begin = this->document_.c_str();
- const char* end = begin + this->document_.length();
- return this->parse(begin, end, root, collectComments);
+bool
+Reader::parse(const std::string& document, Value& root, bool collectComments) {
+ document_.assign(document.begin(), document.end());
+ const char* begin = document_.c_str();
+ const char* end = begin + document_.length();
+ return parse(begin, end, root, collectComments);
}
-bool Reader::parse(std::istream& sin, Value& root, bool collectComments)
-{
+bool Reader::parse(std::istream& sin, Value& root, bool collectComments) {
// std::istream_iterator<char> begin(sin);
// std::istream_iterator<char> end;
// Those would allow streamed input from a file, if parse() were a
@@ -154,263 +119,257 @@ bool Reader::parse(std::istream& sin, Value& root, bool collectComments)
// create an extra copy.
JSONCPP_STRING doc;
std::getline(sin, doc, (char)EOF);
- return this->parse(doc.data(), doc.data() + doc.size(), root,
- collectComments);
+ return parse(doc.data(), doc.data() + doc.size(), root, collectComments);
}
-bool Reader::parse(const char* beginDoc, const char* endDoc, Value& root,
- bool collectComments)
-{
- if (!this->features_.allowComments_) {
+bool Reader::parse(const char* beginDoc,
+ const char* endDoc,
+ Value& root,
+ bool collectComments) {
+ if (!features_.allowComments_) {
collectComments = false;
}
- this->begin_ = beginDoc;
- this->end_ = endDoc;
- this->collectComments_ = collectComments;
- this->current_ = this->begin_;
- this->lastValueEnd_ = 0;
- this->lastValue_ = 0;
- this->commentsBefore_.clear();
- this->errors_.clear();
- while (!this->nodes_.empty())
- this->nodes_.pop();
- this->nodes_.push(&root);
-
- bool successful = this->readValue();
+ begin_ = beginDoc;
+ end_ = endDoc;
+ collectComments_ = collectComments;
+ current_ = begin_;
+ lastValueEnd_ = 0;
+ lastValue_ = 0;
+ commentsBefore_.clear();
+ errors_.clear();
+ while (!nodes_.empty())
+ nodes_.pop();
+ nodes_.push(&root);
+
+ bool successful = readValue();
Token token;
- this->skipCommentTokens(token);
- if (this->collectComments_ && !this->commentsBefore_.empty())
- root.setComment(this->commentsBefore_, commentAfter);
- if (this->features_.strictRoot_) {
+ skipCommentTokens(token);
+ if (collectComments_ && !commentsBefore_.empty())
+ root.setComment(commentsBefore_, commentAfter);
+ if (features_.strictRoot_) {
if (!root.isArray() && !root.isObject()) {
- // Set error location to start of doc, ideally should be first token
- // found in doc
+ // Set error location to start of doc, ideally should be first token found
+ // in doc
token.type_ = tokenError;
token.start_ = beginDoc;
token.end_ = endDoc;
- this->addError(
- "A valid JSON document must be either an array or an object value.",
- token);
+ addError(
+ "A valid JSON document must be either an array or an object value.",
+ token);
return false;
}
}
return successful;
}
-bool Reader::readValue()
-{
+bool Reader::readValue() {
// readValue() may call itself only if it calls readObject() or ReadArray().
- // These methods execute nodes_.push() just before and nodes_.pop)() just
- // after calling readValue(). parse() executes one nodes_.push(), so >
- // instead of >=.
- if (this->nodes_.size() > stackLimit_g)
- throwRuntimeError("Exceeded stackLimit in readValue().");
+ // These methods execute nodes_.push() just before and nodes_.pop)() just after calling readValue().
+ // parse() executes one nodes_.push(), so > instead of >=.
+ if (nodes_.size() > stackLimit_g) throwRuntimeError("Exceeded stackLimit in readValue().");
Token token;
- this->skipCommentTokens(token);
+ skipCommentTokens(token);
bool successful = true;
- if (this->collectComments_ && !this->commentsBefore_.empty()) {
- this->currentValue().setComment(this->commentsBefore_, commentBefore);
- this->commentsBefore_.clear();
+ if (collectComments_ && !commentsBefore_.empty()) {
+ currentValue().setComment(commentsBefore_, commentBefore);
+ commentsBefore_.clear();
}
switch (token.type_) {
- case tokenObjectBegin:
- successful = this->readObject(token);
- this->currentValue().setOffsetLimit(this->current_ - this->begin_);
- break;
- case tokenArrayBegin:
- successful = this->readArray(token);
- this->currentValue().setOffsetLimit(this->current_ - this->begin_);
- break;
- case tokenNumber:
- successful = this->decodeNumber(token);
- break;
- case tokenString:
- successful = this->decodeString(token);
- break;
- case tokenTrue: {
- Value v(true);
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- } break;
- case tokenFalse: {
- Value v(false);
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- } break;
- case tokenNull: {
+ case tokenObjectBegin:
+ successful = readObject(token);
+ currentValue().setOffsetLimit(current_ - begin_);
+ break;
+ case tokenArrayBegin:
+ successful = readArray(token);
+ currentValue().setOffsetLimit(current_ - begin_);
+ break;
+ case tokenNumber:
+ successful = decodeNumber(token);
+ break;
+ case tokenString:
+ successful = decodeString(token);
+ break;
+ case tokenTrue:
+ {
+ Value v(true);
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ }
+ break;
+ case tokenFalse:
+ {
+ Value v(false);
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ }
+ break;
+ case tokenNull:
+ {
+ Value v;
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ }
+ break;
+ case tokenArraySeparator:
+ case tokenObjectEnd:
+ case tokenArrayEnd:
+ if (features_.allowDroppedNullPlaceholders_) {
+ // "Un-read" the current token and mark the current value as a null
+ // token.
+ current_--;
Value v;
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- } break;
- case tokenArraySeparator:
- case tokenObjectEnd:
- case tokenArrayEnd:
- if (this->features_.allowDroppedNullPlaceholders_) {
- // "Un-read" the current token and mark the current value as a null
- // token.
- this->current_--;
- Value v;
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(this->current_ - this->begin_ - 1);
- this->currentValue().setOffsetLimit(this->current_ - this->begin_);
- break;
- } // Else, fall through...
- default:
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- return this->addError("Syntax error: value, object or array expected.",
- token);
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(current_ - begin_ - 1);
+ currentValue().setOffsetLimit(current_ - begin_);
+ break;
+ } // Else, fall through...
+ default:
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ return addError("Syntax error: value, object or array expected.", token);
}
- if (this->collectComments_) {
- this->lastValueEnd_ = this->current_;
- this->lastValue_ = &this->currentValue();
+ if (collectComments_) {
+ lastValueEnd_ = current_;
+ lastValue_ = &currentValue();
}
return successful;
}
-void Reader::skipCommentTokens(Token& token)
-{
- if (this->features_.allowComments_) {
+void Reader::skipCommentTokens(Token& token) {
+ if (features_.allowComments_) {
do {
- this->readToken(token);
+ readToken(token);
} while (token.type_ == tokenComment);
} else {
- this->readToken(token);
+ readToken(token);
}
}
-bool Reader::readToken(Token& token)
-{
- this->skipSpaces();
- token.start_ = this->current_;
- Char c = this->getNextChar();
+bool Reader::readToken(Token& token) {
+ skipSpaces();
+ token.start_ = current_;
+ Char c = getNextChar();
bool ok = true;
switch (c) {
- case '{':
- token.type_ = tokenObjectBegin;
- break;
- case '}':
- token.type_ = tokenObjectEnd;
- break;
- case '[':
- token.type_ = tokenArrayBegin;
- break;
- case ']':
- token.type_ = tokenArrayEnd;
- break;
- case '"':
- token.type_ = tokenString;
- ok = this->readString();
- break;
- case '/':
- token.type_ = tokenComment;
- ok = this->readComment();
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case '-':
- token.type_ = tokenNumber;
- this->readNumber();
- break;
- case 't':
- token.type_ = tokenTrue;
- ok = this->match("rue", 3);
- break;
- case 'f':
- token.type_ = tokenFalse;
- ok = this->match("alse", 4);
- break;
- case 'n':
- token.type_ = tokenNull;
- ok = this->match("ull", 3);
- break;
- case ',':
- token.type_ = tokenArraySeparator;
- break;
- case ':':
- token.type_ = tokenMemberSeparator;
- break;
- case 0:
- token.type_ = tokenEndOfStream;
- break;
- default:
- ok = false;
- break;
+ case '{':
+ token.type_ = tokenObjectBegin;
+ break;
+ case '}':
+ token.type_ = tokenObjectEnd;
+ break;
+ case '[':
+ token.type_ = tokenArrayBegin;
+ break;
+ case ']':
+ token.type_ = tokenArrayEnd;
+ break;
+ case '"':
+ token.type_ = tokenString;
+ ok = readString();
+ break;
+ case '/':
+ token.type_ = tokenComment;
+ ok = readComment();
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ case '-':
+ token.type_ = tokenNumber;
+ readNumber();
+ break;
+ case 't':
+ token.type_ = tokenTrue;
+ ok = match("rue", 3);
+ break;
+ case 'f':
+ token.type_ = tokenFalse;
+ ok = match("alse", 4);
+ break;
+ case 'n':
+ token.type_ = tokenNull;
+ ok = match("ull", 3);
+ break;
+ case ',':
+ token.type_ = tokenArraySeparator;
+ break;
+ case ':':
+ token.type_ = tokenMemberSeparator;
+ break;
+ case 0:
+ token.type_ = tokenEndOfStream;
+ break;
+ default:
+ ok = false;
+ break;
}
if (!ok)
token.type_ = tokenError;
- token.end_ = this->current_;
+ token.end_ = current_;
return true;
}
-void Reader::skipSpaces()
-{
- while (this->current_ != this->end_) {
- Char c = *this->current_;
+void Reader::skipSpaces() {
+ while (current_ != end_) {
+ Char c = *current_;
if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
- ++this->current_;
+ ++current_;
else
break;
}
}
-bool Reader::match(Location pattern, int patternLength)
-{
- if (this->end_ - this->current_ < patternLength)
+bool Reader::match(Location pattern, int patternLength) {
+ if (end_ - current_ < patternLength)
return false;
int index = patternLength;
while (index--)
- if (this->current_[index] != pattern[index])
+ if (current_[index] != pattern[index])
return false;
- this->current_ += patternLength;
+ current_ += patternLength;
return true;
}
-bool Reader::readComment()
-{
- Location commentBegin = this->current_ - 1;
- Char c = this->getNextChar();
+bool Reader::readComment() {
+ Location commentBegin = current_ - 1;
+ Char c = getNextChar();
bool successful = false;
if (c == '*')
- successful = this->readCStyleComment();
+ successful = readCStyleComment();
else if (c == '/')
- successful = this->readCppStyleComment();
+ successful = readCppStyleComment();
if (!successful)
return false;
- if (this->collectComments_) {
+ if (collectComments_) {
CommentPlacement placement = commentBefore;
- if (this->lastValueEnd_ &&
- !containsNewLine(this->lastValueEnd_, commentBegin)) {
- if (c != '*' || !containsNewLine(commentBegin, this->current_))
+ if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) {
+ if (c != '*' || !containsNewLine(commentBegin, current_))
placement = commentAfterOnSameLine;
}
- this->addComment(commentBegin, this->current_, placement);
+ addComment(commentBegin, current_, placement);
}
return true;
}
-JSONCPP_STRING Reader::normalizeEOL(Reader::Location begin,
- Reader::Location end)
-{
+JSONCPP_STRING Reader::normalizeEOL(Reader::Location begin, Reader::Location end) {
JSONCPP_STRING normalized;
normalized.reserve(static_cast<size_t>(end - begin));
Reader::Location current = begin;
@@ -418,8 +377,8 @@ JSONCPP_STRING Reader::normalizeEOL(Reader::Location begin,
char c = *current++;
if (c == '\r') {
if (current != end && *current == '\n')
- // convert dos EOL
- ++current;
+ // convert dos EOL
+ ++current;
// convert Mac EOL
normalized += '\n';
} else {
@@ -429,39 +388,36 @@ JSONCPP_STRING Reader::normalizeEOL(Reader::Location begin,
return normalized;
}
-void Reader::addComment(Location begin, Location end,
- CommentPlacement placement)
-{
- assert(this->collectComments_);
+void
+Reader::addComment(Location begin, Location end, CommentPlacement placement) {
+ assert(collectComments_);
const JSONCPP_STRING& normalized = normalizeEOL(begin, end);
if (placement == commentAfterOnSameLine) {
- assert(this->lastValue_ != 0);
- this->lastValue_->setComment(normalized, placement);
+ assert(lastValue_ != 0);
+ lastValue_->setComment(normalized, placement);
} else {
- this->commentsBefore_ += normalized;
+ commentsBefore_ += normalized;
}
}
-bool Reader::readCStyleComment()
-{
- while ((this->current_ + 1) < this->end_) {
- Char c = this->getNextChar();
- if (c == '*' && *this->current_ == '/')
+bool Reader::readCStyleComment() {
+ while ((current_ + 1) < end_) {
+ Char c = getNextChar();
+ if (c == '*' && *current_ == '/')
break;
}
- return this->getNextChar() == '/';
+ return getNextChar() == '/';
}
-bool Reader::readCppStyleComment()
-{
- while (this->current_ != this->end_) {
- Char c = this->getNextChar();
+bool Reader::readCppStyleComment() {
+ while (current_ != end_) {
+ Char c = getNextChar();
if (c == '\n')
break;
if (c == '\r') {
// Consume DOS EOL. It will be normalized in addComment.
- if (this->current_ != this->end_ && *this->current_ == '\n')
- this->getNextChar();
+ if (current_ != end_ && *current_ == '\n')
+ getNextChar();
// Break on Moc OS 9 EOL.
break;
}
@@ -469,132 +425,127 @@ bool Reader::readCppStyleComment()
return true;
}
-void Reader::readNumber()
-{
- const char* p = this->current_;
+void Reader::readNumber() {
+ const char *p = current_;
char c = '0'; // stopgap for already consumed character
// integral part
while (c >= '0' && c <= '9')
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
// fractional part
if (c == '.') {
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
while (c >= '0' && c <= '9')
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
}
// exponential part
if (c == 'e' || c == 'E') {
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
if (c == '+' || c == '-')
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
while (c >= '0' && c <= '9')
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
}
}
-bool Reader::readString()
-{
+bool Reader::readString() {
Char c = '\0';
- while (this->current_ != this->end_) {
- c = this->getNextChar();
+ while (current_ != end_) {
+ c = getNextChar();
if (c == '\\')
- this->getNextChar();
+ getNextChar();
else if (c == '"')
break;
}
return c == '"';
}
-bool Reader::readObject(Token& tokenStart)
-{
+bool Reader::readObject(Token& tokenStart) {
Token tokenName;
JSONCPP_STRING name;
Value init(objectValue);
- this->currentValue().swapPayload(init);
- this->currentValue().setOffsetStart(tokenStart.start_ - this->begin_);
- while (this->readToken(tokenName)) {
+ currentValue().swapPayload(init);
+ currentValue().setOffsetStart(tokenStart.start_ - begin_);
+ while (readToken(tokenName)) {
bool initialTokenOk = true;
while (tokenName.type_ == tokenComment && initialTokenOk)
- initialTokenOk = this->readToken(tokenName);
+ initialTokenOk = readToken(tokenName);
if (!initialTokenOk)
break;
if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object
return true;
name.clear();
if (tokenName.type_ == tokenString) {
- if (!this->decodeString(tokenName, name))
- return this->recoverFromError(tokenObjectEnd);
- } else if (tokenName.type_ == tokenNumber &&
- this->features_.allowNumericKeys_) {
+ if (!decodeString(tokenName, name))
+ return recoverFromError(tokenObjectEnd);
+ } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) {
Value numberName;
- if (!this->decodeNumber(tokenName, numberName))
- return this->recoverFromError(tokenObjectEnd);
+ if (!decodeNumber(tokenName, numberName))
+ return recoverFromError(tokenObjectEnd);
name = JSONCPP_STRING(numberName.asCString());
} else {
break;
}
Token colon;
- if (!this->readToken(colon) || colon.type_ != tokenMemberSeparator) {
- return this->addErrorAndRecover("Missing ':' after object member name",
- colon, tokenObjectEnd);
+ if (!readToken(colon) || colon.type_ != tokenMemberSeparator) {
+ return addErrorAndRecover(
+ "Missing ':' after object member name", colon, tokenObjectEnd);
}
- Value& value = this->currentValue()[name];
- this->nodes_.push(&value);
- bool ok = this->readValue();
- this->nodes_.pop();
+ Value& value = currentValue()[name];
+ nodes_.push(&value);
+ bool ok = readValue();
+ nodes_.pop();
if (!ok) // error already set
- return this->recoverFromError(tokenObjectEnd);
+ return recoverFromError(tokenObjectEnd);
Token comma;
- if (!this->readToken(comma) ||
+ if (!readToken(comma) ||
(comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator &&
comma.type_ != tokenComment)) {
- return this->addErrorAndRecover(
- "Missing ',' or '}' in object declaration", comma, tokenObjectEnd);
+ return addErrorAndRecover(
+ "Missing ',' or '}' in object declaration", comma, tokenObjectEnd);
}
bool finalizeTokenOk = true;
while (comma.type_ == tokenComment && finalizeTokenOk)
- finalizeTokenOk = this->readToken(comma);
+ finalizeTokenOk = readToken(comma);
if (comma.type_ == tokenObjectEnd)
return true;
}
- return this->addErrorAndRecover("Missing '}' or object member name",
- tokenName, tokenObjectEnd);
+ return addErrorAndRecover(
+ "Missing '}' or object member name", tokenName, tokenObjectEnd);
}
-bool Reader::readArray(Token& tokenStart)
-{
+bool Reader::readArray(Token& tokenStart) {
Value init(arrayValue);
- this->currentValue().swapPayload(init);
- this->currentValue().setOffsetStart(tokenStart.start_ - this->begin_);
- this->skipSpaces();
- if (this->current_ != this->end_ && *this->current_ == ']') // empty array
+ currentValue().swapPayload(init);
+ currentValue().setOffsetStart(tokenStart.start_ - begin_);
+ skipSpaces();
+ if (current_ != end_ && *current_ == ']') // empty array
{
Token endArray;
- this->readToken(endArray);
+ readToken(endArray);
return true;
}
int index = 0;
for (;;) {
- Value& value = this->currentValue()[index++];
- this->nodes_.push(&value);
- bool ok = this->readValue();
- this->nodes_.pop();
+ Value& value = currentValue()[index++];
+ nodes_.push(&value);
+ bool ok = readValue();
+ nodes_.pop();
if (!ok) // error already set
- return this->recoverFromError(tokenArrayEnd);
+ return recoverFromError(tokenArrayEnd);
Token token;
// Accept Comment after last item in the array.
- ok = this->readToken(token);
+ ok = readToken(token);
while (token.type_ == tokenComment && ok) {
- ok = this->readToken(token);
+ ok = readToken(token);
}
bool badTokenType =
- (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd);
+ (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd);
if (!ok || badTokenType) {
- return this->addErrorAndRecover(
- "Missing ',' or ']' in array declaration", token, tokenArrayEnd);
+ return addErrorAndRecover(
+ "Missing ',' or ']' in array declaration", token, tokenArrayEnd);
}
if (token.type_ == tokenArrayEnd)
break;
@@ -602,19 +553,17 @@ bool Reader::readArray(Token& tokenStart)
return true;
}
-bool Reader::decodeNumber(Token& token)
-{
+bool Reader::decodeNumber(Token& token) {
Value decoded;
- if (!this->decodeNumber(token, decoded))
+ if (!decodeNumber(token, decoded))
return false;
- this->currentValue().swapPayload(decoded);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
+ currentValue().swapPayload(decoded);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
return true;
}
-bool Reader::decodeNumber(Token& token, Value& decoded)
-{
+bool Reader::decodeNumber(Token& token, Value& decoded) {
// Attempts to parse the number as an integer. If the number is
// larger than the maximum supported value of an integer then
// we decode the number as a double.
@@ -622,17 +571,16 @@ bool Reader::decodeNumber(Token& token, Value& decoded)
bool isNegative = *current == '-';
if (isNegative)
++current;
- // TODO: Help the compiler do the div and mod at compile time or get rid of
- // them.
- Value::LargestUInt maxIntegerValue = isNegative
- ? Value::LargestUInt(Value::maxLargestInt) + 1
- : Value::maxLargestUInt;
+ // TODO: Help the compiler do the div and mod at compile time or get rid of them.
+ Value::LargestUInt maxIntegerValue =
+ isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1
+ : Value::maxLargestUInt;
Value::LargestUInt threshold = maxIntegerValue / 10;
Value::LargestUInt value = 0;
while (current < token.end_) {
Char c = *current++;
if (c < '0' || c > '9')
- return this->decodeDouble(token, decoded);
+ return decodeDouble(token, decoded);
Value::UInt digit(static_cast<Value::UInt>(c - '0'));
if (value >= threshold) {
// We've hit or exceeded the max value divided by 10 (rounded down). If
@@ -641,7 +589,7 @@ bool Reader::decodeNumber(Token& token, Value& decoded)
// Otherwise treat this number as a double to avoid overflow.
if (value > threshold || current != token.end_ ||
digit > maxIntegerValue % 10) {
- return this->decodeDouble(token, decoded);
+ return decodeDouble(token, decoded);
}
}
value = value * 10 + digit;
@@ -657,44 +605,40 @@ bool Reader::decodeNumber(Token& token, Value& decoded)
return true;
}
-bool Reader::decodeDouble(Token& token)
-{
+bool Reader::decodeDouble(Token& token) {
Value decoded;
- if (!this->decodeDouble(token, decoded))
+ if (!decodeDouble(token, decoded))
return false;
- this->currentValue().swapPayload(decoded);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
+ currentValue().swapPayload(decoded);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
return true;
}
-bool Reader::decodeDouble(Token& token, Value& decoded)
-{
+bool Reader::decodeDouble(Token& token, Value& decoded) {
double value = 0;
JSONCPP_STRING buffer(token.start_, token.end_);
JSONCPP_ISTRINGSTREAM is(buffer);
if (!(is >> value))
- return this->addError("'" + JSONCPP_STRING(token.start_, token.end_) +
- "' is not a number.",
- token);
+ return addError("'" + JSONCPP_STRING(token.start_, token.end_) +
+ "' is not a number.",
+ token);
decoded = value;
return true;
}
-bool Reader::decodeString(Token& token)
-{
+bool Reader::decodeString(Token& token) {
JSONCPP_STRING decoded_string;
- if (!this->decodeString(token, decoded_string))
+ if (!decodeString(token, decoded_string))
return false;
Value decoded(decoded_string);
- this->currentValue().swapPayload(decoded);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
+ currentValue().swapPayload(decoded);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
return true;
}
-bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded)
-{
+bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded) {
decoded.reserve(static_cast<size_t>(token.end_ - token.start_ - 2));
Location current = token.start_ + 1; // skip '"'
Location end = token.end_ - 1; // do not include '"'
@@ -704,43 +648,41 @@ bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded)
break;
else if (c == '\\') {
if (current == end)
- return this->addError("Empty escape sequence in string", token,
- current);
+ return addError("Empty escape sequence in string", token, current);
Char escape = *current++;
switch (escape) {
- case '"':
- decoded += '"';
- break;
- case '/':
- decoded += '/';
- break;
- case '\\':
- decoded += '\\';
- break;
- case 'b':
- decoded += '\b';
- break;
- case 'f':
- decoded += '\f';
- break;
- case 'n':
- decoded += '\n';
- break;
- case 'r':
- decoded += '\r';
- break;
- case 't':
- decoded += '\t';
- break;
- case 'u': {
- unsigned int unicode;
- if (!this->decodeUnicodeCodePoint(token, current, end, unicode))
- return false;
- decoded += codePointToUTF8(unicode);
- } break;
- default:
- return this->addError("Bad escape sequence in string", token,
- current);
+ case '"':
+ decoded += '"';
+ break;
+ case '/':
+ decoded += '/';
+ break;
+ case '\\':
+ decoded += '\\';
+ break;
+ case 'b':
+ decoded += '\b';
+ break;
+ case 'f':
+ decoded += '\f';
+ break;
+ case 'n':
+ decoded += '\n';
+ break;
+ case 'r':
+ decoded += '\r';
+ break;
+ case 't':
+ decoded += '\t';
+ break;
+ case 'u': {
+ unsigned int unicode;
+ if (!decodeUnicodeCodePoint(token, current, end, unicode))
+ return false;
+ decoded += codePointToUTF8(unicode);
+ } break;
+ default:
+ return addError("Bad escape sequence in string", token, current);
}
} else {
decoded += c;
@@ -749,43 +691,44 @@ bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded)
return true;
}
-bool Reader::decodeUnicodeCodePoint(Token& token, Location& current,
- Location end, unsigned int& unicode)
-{
+bool Reader::decodeUnicodeCodePoint(Token& token,
+ Location& current,
+ Location end,
+ unsigned int& unicode) {
- if (!this->decodeUnicodeEscapeSequence(token, current, end, unicode))
+ if (!decodeUnicodeEscapeSequence(token, current, end, unicode))
return false;
if (unicode >= 0xD800 && unicode <= 0xDBFF) {
// surrogate pairs
if (end - current < 6)
- return this->addError(
- "additional six characters expected to parse unicode surrogate pair.",
- token, current);
+ return addError(
+ "additional six characters expected to parse unicode surrogate pair.",
+ token,
+ current);
unsigned int surrogatePair;
if (*(current++) == '\\' && *(current++) == 'u') {
- if (this->decodeUnicodeEscapeSequence(token, current, end,
- surrogatePair)) {
- unicode =
- 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
+ if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) {
+ unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
} else
return false;
} else
- return this->addError(
- "expecting another \\u token to begin the second half of "
- "a unicode surrogate pair",
- token, current);
+ return addError("expecting another \\u token to begin the second half of "
+ "a unicode surrogate pair",
+ token,
+ current);
}
return true;
}
-bool Reader::decodeUnicodeEscapeSequence(Token& token, Location& current,
+bool Reader::decodeUnicodeEscapeSequence(Token& token,
+ Location& current,
Location end,
- unsigned int& ret_unicode)
-{
+ unsigned int& ret_unicode) {
if (end - current < 4)
- return this->addError(
- "Bad unicode escape sequence in string: four digits expected.", token,
- current);
+ return addError(
+ "Bad unicode escape sequence in string: four digits expected.",
+ token,
+ current);
int unicode = 0;
for (int index = 0; index < 4; ++index) {
Char c = *current++;
@@ -797,65 +740,60 @@ bool Reader::decodeUnicodeEscapeSequence(Token& token, Location& current,
else if (c >= 'A' && c <= 'F')
unicode += c - 'A' + 10;
else
- return this->addError(
- "Bad unicode escape sequence in string: hexadecimal digit expected.",
- token, current);
+ return addError(
+ "Bad unicode escape sequence in string: hexadecimal digit expected.",
+ token,
+ current);
}
ret_unicode = static_cast<unsigned int>(unicode);
return true;
}
-bool Reader::addError(const JSONCPP_STRING& message, Token& token,
- Location extra)
-{
+bool
+Reader::addError(const JSONCPP_STRING& message, Token& token, Location extra) {
ErrorInfo info;
info.token_ = token;
info.message_ = message;
info.extra_ = extra;
- this->errors_.push_back(info);
+ errors_.push_back(info);
return false;
}
-bool Reader::recoverFromError(TokenType skipUntilToken)
-{
- size_t const errorCount = this->errors_.size();
+bool Reader::recoverFromError(TokenType skipUntilToken) {
+ size_t const errorCount = errors_.size();
Token skip;
for (;;) {
- if (!this->readToken(skip))
- this->errors_.resize(errorCount); // discard errors caused by recovery
+ if (!readToken(skip))
+ errors_.resize(errorCount); // discard errors caused by recovery
if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream)
break;
}
- this->errors_.resize(errorCount);
+ errors_.resize(errorCount);
return false;
}
-bool Reader::addErrorAndRecover(const JSONCPP_STRING& message, Token& token,
- TokenType skipUntilToken)
-{
- this->addError(message, token);
- return this->recoverFromError(skipUntilToken);
+bool Reader::addErrorAndRecover(const JSONCPP_STRING& message,
+ Token& token,
+ TokenType skipUntilToken) {
+ addError(message, token);
+ return recoverFromError(skipUntilToken);
}
-Value& Reader::currentValue()
-{
- return *(this->nodes_.top());
-}
+Value& Reader::currentValue() { return *(nodes_.top()); }
-Reader::Char Reader::getNextChar()
-{
- if (this->current_ == this->end_)
+Reader::Char Reader::getNextChar() {
+ if (current_ == end_)
return 0;
- return *this->current_++;
+ return *current_++;
}
-void Reader::getLocationLineAndColumn(Location location, int& line,
- int& column) const
-{
- Location current = this->begin_;
+void Reader::getLocationLineAndColumn(Location location,
+ int& line,
+ int& column) const {
+ Location current = begin_;
Location lastLineStart = current;
line = 0;
- while (current < location && current != this->end_) {
+ while (current < location && current != end_) {
Char c = *current++;
if (c == '\r') {
if (*current == '\n')
@@ -872,96 +810,91 @@ void Reader::getLocationLineAndColumn(Location location, int& line,
++line;
}
-JSONCPP_STRING Reader::getLocationLineAndColumn(Location location) const
-{
+JSONCPP_STRING Reader::getLocationLineAndColumn(Location location) const {
int line, column;
- this->getLocationLineAndColumn(location, line, column);
+ getLocationLineAndColumn(location, line, column);
char buffer[18 + 16 + 16 + 1];
snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column);
return buffer;
}
// Deprecated. Preserved for backward compatibility
-JSONCPP_STRING Reader::getFormatedErrorMessages() const
-{
- return this->getFormattedErrorMessages();
+JSONCPP_STRING Reader::getFormatedErrorMessages() const {
+ return getFormattedErrorMessages();
}
-JSONCPP_STRING Reader::getFormattedErrorMessages() const
-{
+JSONCPP_STRING Reader::getFormattedErrorMessages() const {
JSONCPP_STRING formattedMessage;
- for (Errors::const_iterator itError = this->errors_.begin();
- itError != this->errors_.end(); ++itError) {
+ for (Errors::const_iterator itError = errors_.begin();
+ itError != errors_.end();
+ ++itError) {
const ErrorInfo& error = *itError;
formattedMessage +=
- "* " + this->getLocationLineAndColumn(error.token_.start_) + "\n";
+ "* " + getLocationLineAndColumn(error.token_.start_) + "\n";
formattedMessage += " " + error.message_ + "\n";
if (error.extra_)
- formattedMessage += "See " +
- this->getLocationLineAndColumn(error.extra_) + " for detail.\n";
+ formattedMessage +=
+ "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n";
}
return formattedMessage;
}
-std::vector<Reader::StructuredError> Reader::getStructuredErrors() const
-{
+std::vector<Reader::StructuredError> Reader::getStructuredErrors() const {
std::vector<Reader::StructuredError> allErrors;
- for (Errors::const_iterator itError = this->errors_.begin();
- itError != this->errors_.end(); ++itError) {
+ for (Errors::const_iterator itError = errors_.begin();
+ itError != errors_.end();
+ ++itError) {
const ErrorInfo& error = *itError;
Reader::StructuredError structured;
- structured.offset_start = error.token_.start_ - this->begin_;
- structured.offset_limit = error.token_.end_ - this->begin_;
+ structured.offset_start = error.token_.start_ - begin_;
+ structured.offset_limit = error.token_.end_ - begin_;
structured.message = error.message_;
allErrors.push_back(structured);
}
return allErrors;
}
-bool Reader::pushError(const Value& value, const JSONCPP_STRING& message)
-{
- ptrdiff_t const length = this->end_ - this->begin_;
- if (value.getOffsetStart() > length || value.getOffsetLimit() > length)
+bool Reader::pushError(const Value& value, const JSONCPP_STRING& message) {
+ ptrdiff_t const length = end_ - begin_;
+ if(value.getOffsetStart() > length
+ || value.getOffsetLimit() > length)
return false;
Token token;
token.type_ = tokenError;
- token.start_ = this->begin_ + value.getOffsetStart();
- token.end_ = this->end_ + value.getOffsetLimit();
+ token.start_ = begin_ + value.getOffsetStart();
+ token.end_ = end_ + value.getOffsetLimit();
ErrorInfo info;
info.token_ = token;
info.message_ = message;
info.extra_ = 0;
- this->errors_.push_back(info);
+ errors_.push_back(info);
return true;
}
-bool Reader::pushError(const Value& value, const JSONCPP_STRING& message,
- const Value& extra)
-{
- ptrdiff_t const length = this->end_ - this->begin_;
- if (value.getOffsetStart() > length || value.getOffsetLimit() > length ||
- extra.getOffsetLimit() > length)
+bool Reader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) {
+ ptrdiff_t const length = end_ - begin_;
+ if(value.getOffsetStart() > length
+ || value.getOffsetLimit() > length
+ || extra.getOffsetLimit() > length)
return false;
Token token;
token.type_ = tokenError;
- token.start_ = this->begin_ + value.getOffsetStart();
- token.end_ = this->begin_ + value.getOffsetLimit();
+ token.start_ = begin_ + value.getOffsetStart();
+ token.end_ = begin_ + value.getOffsetLimit();
ErrorInfo info;
info.token_ = token;
info.message_ = message;
- info.extra_ = this->begin_ + extra.getOffsetStart();
- this->errors_.push_back(info);
+ info.extra_ = begin_ + extra.getOffsetStart();
+ errors_.push_back(info);
return true;
}
-bool Reader::good() const
-{
- return !this->errors_.size();
+bool Reader::good() const {
+ return !errors_.size();
}
// exact copy of Features
-class OurFeatures
-{
+class OurFeatures {
public:
static OurFeatures all();
bool allowComments_;
@@ -973,48 +906,43 @@ public:
bool rejectDupKeys_;
bool allowSpecialFloats_;
int stackLimit_;
-}; // OurFeatures
+}; // OurFeatures
// exact copy of Implementation of class Features
// ////////////////////////////////
-OurFeatures OurFeatures::all()
-{
- return OurFeatures();
-}
+OurFeatures OurFeatures::all() { return OurFeatures(); }
// Implementation of class Reader
// ////////////////////////////////
// exact copy of Reader, renamed to OurReader
-class OurReader
-{
+class OurReader {
public:
typedef char Char;
typedef const Char* Location;
- struct StructuredError
- {
+ struct StructuredError {
ptrdiff_t offset_start;
ptrdiff_t offset_limit;
JSONCPP_STRING message;
};
OurReader(OurFeatures const& features);
- bool parse(const char* beginDoc, const char* endDoc, Value& root,
+ bool parse(const char* beginDoc,
+ const char* endDoc,
+ Value& root,
bool collectComments = true);
JSONCPP_STRING getFormattedErrorMessages() const;
std::vector<StructuredError> getStructuredErrors() const;
bool pushError(const Value& value, const JSONCPP_STRING& message);
- bool pushError(const Value& value, const JSONCPP_STRING& message,
- const Value& extra);
+ bool pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra);
bool good() const;
private:
- OurReader(OurReader const&); // no impl
- void operator=(OurReader const&); // no impl
+ OurReader(OurReader const&); // no impl
+ void operator=(OurReader const&); // no impl
- enum TokenType
- {
+ enum TokenType {
tokenEndOfStream = 0,
tokenObjectBegin,
tokenObjectEnd,
@@ -1034,16 +962,14 @@ private:
tokenError
};
- class Token
- {
+ class Token {
public:
TokenType type_;
Location start_;
Location end_;
};
- class ErrorInfo
- {
+ class ErrorInfo {
public:
Token token_;
JSONCPP_STRING message_;
@@ -1070,20 +996,24 @@ private:
bool decodeString(Token& token, JSONCPP_STRING& decoded);
bool decodeDouble(Token& token);
bool decodeDouble(Token& token, Value& decoded);
- bool decodeUnicodeCodePoint(Token& token, Location& current, Location end,
+ bool decodeUnicodeCodePoint(Token& token,
+ Location& current,
+ Location end,
unsigned int& unicode);
- bool decodeUnicodeEscapeSequence(Token& token, Location& current,
- Location end, unsigned int& unicode);
- bool addError(const JSONCPP_STRING& message, Token& token,
- Location extra = 0);
+ bool decodeUnicodeEscapeSequence(Token& token,
+ Location& current,
+ Location end,
+ unsigned int& unicode);
+ bool addError(const JSONCPP_STRING& message, Token& token, Location extra = 0);
bool recoverFromError(TokenType skipUntilToken);
- bool addErrorAndRecover(const JSONCPP_STRING& message, Token& token,
+ bool addErrorAndRecover(const JSONCPP_STRING& message,
+ Token& token,
TokenType skipUntilToken);
void skipUntilSpace();
Value& currentValue();
Char getNextChar();
- void getLocationLineAndColumn(Location location, int& line,
- int& column) const;
+ void
+ getLocationLineAndColumn(Location location, int& line, int& column) const;
JSONCPP_STRING getLocationLineAndColumn(Location location) const;
void addComment(Location begin, Location end, CommentPlacement placement);
void skipCommentTokens(Token& token);
@@ -1104,13 +1034,11 @@ private:
OurFeatures const features_;
bool collectComments_;
-}; // OurReader
+}; // OurReader
// complete copy of Read impl, for OurReader
-bool OurReader::containsNewLine(OurReader::Location begin,
- OurReader::Location end)
-{
+bool OurReader::containsNewLine(OurReader::Location begin, OurReader::Location end) {
for (; begin < end; ++begin)
if (*begin == '\n' || *begin == '\r')
return true;
@@ -1118,322 +1046,315 @@ bool OurReader::containsNewLine(OurReader::Location begin,
}
OurReader::OurReader(OurFeatures const& features)
- : errors_()
- , document_()
- , begin_()
- , end_()
- , current_()
- , lastValueEnd_()
- , lastValue_()
- , commentsBefore_()
- , features_(features)
- , collectComments_()
-{
+ : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(),
+ lastValue_(), commentsBefore_(),
+ features_(features), collectComments_() {
}
-bool OurReader::parse(const char* beginDoc, const char* endDoc, Value& root,
- bool collectComments)
-{
- if (!this->features_.allowComments_) {
+bool OurReader::parse(const char* beginDoc,
+ const char* endDoc,
+ Value& root,
+ bool collectComments) {
+ if (!features_.allowComments_) {
collectComments = false;
}
- this->begin_ = beginDoc;
- this->end_ = endDoc;
- this->collectComments_ = collectComments;
- this->current_ = this->begin_;
- this->lastValueEnd_ = 0;
- this->lastValue_ = 0;
- this->commentsBefore_.clear();
- this->errors_.clear();
- while (!this->nodes_.empty())
- this->nodes_.pop();
- this->nodes_.push(&root);
-
- bool successful = this->readValue();
+ begin_ = beginDoc;
+ end_ = endDoc;
+ collectComments_ = collectComments;
+ current_ = begin_;
+ lastValueEnd_ = 0;
+ lastValue_ = 0;
+ commentsBefore_.clear();
+ errors_.clear();
+ while (!nodes_.empty())
+ nodes_.pop();
+ nodes_.push(&root);
+
+ bool successful = readValue();
Token token;
- this->skipCommentTokens(token);
- if (this->features_.failIfExtra_) {
- if ((this->features_.strictRoot_ || token.type_ != tokenError) &&
- token.type_ != tokenEndOfStream) {
- this->addError("Extra non-whitespace after JSON value.", token);
+ skipCommentTokens(token);
+ if (features_.failIfExtra_) {
+ if ((features_.strictRoot_ || token.type_ != tokenError) && token.type_ != tokenEndOfStream) {
+ addError("Extra non-whitespace after JSON value.", token);
return false;
}
}
- if (this->collectComments_ && !this->commentsBefore_.empty())
- root.setComment(this->commentsBefore_, commentAfter);
- if (this->features_.strictRoot_) {
+ if (collectComments_ && !commentsBefore_.empty())
+ root.setComment(commentsBefore_, commentAfter);
+ if (features_.strictRoot_) {
if (!root.isArray() && !root.isObject()) {
- // Set error location to start of doc, ideally should be first token
- // found in doc
+ // Set error location to start of doc, ideally should be first token found
+ // in doc
token.type_ = tokenError;
token.start_ = beginDoc;
token.end_ = endDoc;
- this->addError(
- "A valid JSON document must be either an array or an object value.",
- token);
+ addError(
+ "A valid JSON document must be either an array or an object value.",
+ token);
return false;
}
}
return successful;
}
-bool OurReader::readValue()
-{
+bool OurReader::readValue() {
// To preserve the old behaviour we cast size_t to int.
- if (static_cast<int>(this->nodes_.size()) > this->features_.stackLimit_)
- throwRuntimeError("Exceeded stackLimit in readValue().");
+ if (static_cast<int>(nodes_.size()) > features_.stackLimit_) throwRuntimeError("Exceeded stackLimit in readValue().");
Token token;
- this->skipCommentTokens(token);
+ skipCommentTokens(token);
bool successful = true;
- if (this->collectComments_ && !this->commentsBefore_.empty()) {
- this->currentValue().setComment(this->commentsBefore_, commentBefore);
- this->commentsBefore_.clear();
+ if (collectComments_ && !commentsBefore_.empty()) {
+ currentValue().setComment(commentsBefore_, commentBefore);
+ commentsBefore_.clear();
}
switch (token.type_) {
- case tokenObjectBegin:
- successful = this->readObject(token);
- this->currentValue().setOffsetLimit(this->current_ - this->begin_);
- break;
- case tokenArrayBegin:
- successful = this->readArray(token);
- this->currentValue().setOffsetLimit(this->current_ - this->begin_);
- break;
- case tokenNumber:
- successful = this->decodeNumber(token);
- break;
- case tokenString:
- successful = this->decodeString(token);
- break;
- case tokenTrue: {
- Value v(true);
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- } break;
- case tokenFalse: {
- Value v(false);
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- } break;
- case tokenNull: {
+ case tokenObjectBegin:
+ successful = readObject(token);
+ currentValue().setOffsetLimit(current_ - begin_);
+ break;
+ case tokenArrayBegin:
+ successful = readArray(token);
+ currentValue().setOffsetLimit(current_ - begin_);
+ break;
+ case tokenNumber:
+ successful = decodeNumber(token);
+ break;
+ case tokenString:
+ successful = decodeString(token);
+ break;
+ case tokenTrue:
+ {
+ Value v(true);
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ }
+ break;
+ case tokenFalse:
+ {
+ Value v(false);
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ }
+ break;
+ case tokenNull:
+ {
+ Value v;
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ }
+ break;
+ case tokenNaN:
+ {
+ Value v(std::numeric_limits<double>::quiet_NaN());
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ }
+ break;
+ case tokenPosInf:
+ {
+ Value v(std::numeric_limits<double>::infinity());
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ }
+ break;
+ case tokenNegInf:
+ {
+ Value v(-std::numeric_limits<double>::infinity());
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ }
+ break;
+ case tokenArraySeparator:
+ case tokenObjectEnd:
+ case tokenArrayEnd:
+ if (features_.allowDroppedNullPlaceholders_) {
+ // "Un-read" the current token and mark the current value as a null
+ // token.
+ current_--;
Value v;
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- } break;
- case tokenNaN: {
- Value v(std::numeric_limits<double>::quiet_NaN());
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- } break;
- case tokenPosInf: {
- Value v(std::numeric_limits<double>::infinity());
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- } break;
- case tokenNegInf: {
- Value v(-std::numeric_limits<double>::infinity());
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- } break;
- case tokenArraySeparator:
- case tokenObjectEnd:
- case tokenArrayEnd:
- if (this->features_.allowDroppedNullPlaceholders_) {
- // "Un-read" the current token and mark the current value as a null
- // token.
- this->current_--;
- Value v;
- this->currentValue().swapPayload(v);
- this->currentValue().setOffsetStart(this->current_ - this->begin_ - 1);
- this->currentValue().setOffsetLimit(this->current_ - this->begin_);
- break;
- } // else, fall through ...
- default:
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
- return this->addError("Syntax error: value, object or array expected.",
- token);
+ currentValue().swapPayload(v);
+ currentValue().setOffsetStart(current_ - begin_ - 1);
+ currentValue().setOffsetLimit(current_ - begin_);
+ break;
+ } // else, fall through ...
+ default:
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
+ return addError("Syntax error: value, object or array expected.", token);
}
- if (this->collectComments_) {
- this->lastValueEnd_ = this->current_;
- this->lastValue_ = &this->currentValue();
+ if (collectComments_) {
+ lastValueEnd_ = current_;
+ lastValue_ = &currentValue();
}
return successful;
}
-void OurReader::skipCommentTokens(Token& token)
-{
- if (this->features_.allowComments_) {
+void OurReader::skipCommentTokens(Token& token) {
+ if (features_.allowComments_) {
do {
- this->readToken(token);
+ readToken(token);
} while (token.type_ == tokenComment);
} else {
- this->readToken(token);
+ readToken(token);
}
}
-bool OurReader::readToken(Token& token)
-{
- this->skipSpaces();
- token.start_ = this->current_;
- Char c = this->getNextChar();
+bool OurReader::readToken(Token& token) {
+ skipSpaces();
+ token.start_ = current_;
+ Char c = getNextChar();
bool ok = true;
switch (c) {
- case '{':
- token.type_ = tokenObjectBegin;
- break;
- case '}':
- token.type_ = tokenObjectEnd;
- break;
- case '[':
- token.type_ = tokenArrayBegin;
- break;
- case ']':
- token.type_ = tokenArrayEnd;
- break;
- case '"':
- token.type_ = tokenString;
- ok = this->readString();
- break;
- case '\'':
- if (this->features_.allowSingleQuotes_) {
- token.type_ = tokenString;
- ok = this->readStringSingleQuote();
- break;
- } // else continue
- case '/':
- token.type_ = tokenComment;
- ok = this->readComment();
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
+ case '{':
+ token.type_ = tokenObjectBegin;
+ break;
+ case '}':
+ token.type_ = tokenObjectEnd;
+ break;
+ case '[':
+ token.type_ = tokenArrayBegin;
+ break;
+ case ']':
+ token.type_ = tokenArrayEnd;
+ break;
+ case '"':
+ token.type_ = tokenString;
+ ok = readString();
+ break;
+ case '\'':
+ if (features_.allowSingleQuotes_) {
+ token.type_ = tokenString;
+ ok = readStringSingleQuote();
+ break;
+ } // else continue
+ case '/':
+ token.type_ = tokenComment;
+ ok = readComment();
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ token.type_ = tokenNumber;
+ readNumber(false);
+ break;
+ case '-':
+ if (readNumber(true)) {
token.type_ = tokenNumber;
- this->readNumber(false);
- break;
- case '-':
- if (this->readNumber(true)) {
- token.type_ = tokenNumber;
- } else {
- token.type_ = tokenNegInf;
- ok = this->features_.allowSpecialFloats_ && this->match("nfinity", 7);
- }
- break;
- case 't':
- token.type_ = tokenTrue;
- ok = this->match("rue", 3);
- break;
- case 'f':
- token.type_ = tokenFalse;
- ok = this->match("alse", 4);
- break;
- case 'n':
- token.type_ = tokenNull;
- ok = this->match("ull", 3);
- break;
- case 'N':
- if (this->features_.allowSpecialFloats_) {
- token.type_ = tokenNaN;
- ok = this->match("aN", 2);
- } else {
- ok = false;
- }
- break;
- case 'I':
- if (this->features_.allowSpecialFloats_) {
- token.type_ = tokenPosInf;
- ok = this->match("nfinity", 7);
- } else {
- ok = false;
- }
- break;
- case ',':
- token.type_ = tokenArraySeparator;
- break;
- case ':':
- token.type_ = tokenMemberSeparator;
- break;
- case 0:
- token.type_ = tokenEndOfStream;
- break;
- default:
+ } else {
+ token.type_ = tokenNegInf;
+ ok = features_.allowSpecialFloats_ && match("nfinity", 7);
+ }
+ break;
+ case 't':
+ token.type_ = tokenTrue;
+ ok = match("rue", 3);
+ break;
+ case 'f':
+ token.type_ = tokenFalse;
+ ok = match("alse", 4);
+ break;
+ case 'n':
+ token.type_ = tokenNull;
+ ok = match("ull", 3);
+ break;
+ case 'N':
+ if (features_.allowSpecialFloats_) {
+ token.type_ = tokenNaN;
+ ok = match("aN", 2);
+ } else {
ok = false;
- break;
+ }
+ break;
+ case 'I':
+ if (features_.allowSpecialFloats_) {
+ token.type_ = tokenPosInf;
+ ok = match("nfinity", 7);
+ } else {
+ ok = false;
+ }
+ break;
+ case ',':
+ token.type_ = tokenArraySeparator;
+ break;
+ case ':':
+ token.type_ = tokenMemberSeparator;
+ break;
+ case 0:
+ token.type_ = tokenEndOfStream;
+ break;
+ default:
+ ok = false;
+ break;
}
if (!ok)
token.type_ = tokenError;
- token.end_ = this->current_;
+ token.end_ = current_;
return true;
}
-void OurReader::skipSpaces()
-{
- while (this->current_ != this->end_) {
- Char c = *this->current_;
+void OurReader::skipSpaces() {
+ while (current_ != end_) {
+ Char c = *current_;
if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
- ++this->current_;
+ ++current_;
else
break;
}
}
-bool OurReader::match(Location pattern, int patternLength)
-{
- if (this->end_ - this->current_ < patternLength)
+bool OurReader::match(Location pattern, int patternLength) {
+ if (end_ - current_ < patternLength)
return false;
int index = patternLength;
while (index--)
- if (this->current_[index] != pattern[index])
+ if (current_[index] != pattern[index])
return false;
- this->current_ += patternLength;
+ current_ += patternLength;
return true;
}
-bool OurReader::readComment()
-{
- Location commentBegin = this->current_ - 1;
- Char c = this->getNextChar();
+bool OurReader::readComment() {
+ Location commentBegin = current_ - 1;
+ Char c = getNextChar();
bool successful = false;
if (c == '*')
- successful = this->readCStyleComment();
+ successful = readCStyleComment();
else if (c == '/')
- successful = this->readCppStyleComment();
+ successful = readCppStyleComment();
if (!successful)
return false;
- if (this->collectComments_) {
+ if (collectComments_) {
CommentPlacement placement = commentBefore;
- if (this->lastValueEnd_ &&
- !containsNewLine(this->lastValueEnd_, commentBegin)) {
- if (c != '*' || !containsNewLine(commentBegin, this->current_))
+ if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) {
+ if (c != '*' || !containsNewLine(commentBegin, current_))
placement = commentAfterOnSameLine;
}
- this->addComment(commentBegin, this->current_, placement);
+ addComment(commentBegin, current_, placement);
}
return true;
}
-JSONCPP_STRING OurReader::normalizeEOL(OurReader::Location begin,
- OurReader::Location end)
-{
+JSONCPP_STRING OurReader::normalizeEOL(OurReader::Location begin, OurReader::Location end) {
JSONCPP_STRING normalized;
normalized.reserve(static_cast<size_t>(end - begin));
OurReader::Location current = begin;
@@ -1441,8 +1362,8 @@ JSONCPP_STRING OurReader::normalizeEOL(OurReader::Location begin,
char c = *current++;
if (c == '\r') {
if (current != end && *current == '\n')
- // convert dos EOL
- ++current;
+ // convert dos EOL
+ ++current;
// convert Mac EOL
normalized += '\n';
} else {
@@ -1452,39 +1373,36 @@ JSONCPP_STRING OurReader::normalizeEOL(OurReader::Location begin,
return normalized;
}
-void OurReader::addComment(Location begin, Location end,
- CommentPlacement placement)
-{
- assert(this->collectComments_);
+void
+OurReader::addComment(Location begin, Location end, CommentPlacement placement) {
+ assert(collectComments_);
const JSONCPP_STRING& normalized = normalizeEOL(begin, end);
if (placement == commentAfterOnSameLine) {
- assert(this->lastValue_ != 0);
- this->lastValue_->setComment(normalized, placement);
+ assert(lastValue_ != 0);
+ lastValue_->setComment(normalized, placement);
} else {
- this->commentsBefore_ += normalized;
+ commentsBefore_ += normalized;
}
}
-bool OurReader::readCStyleComment()
-{
- while ((this->current_ + 1) < this->end_) {
- Char c = this->getNextChar();
- if (c == '*' && *this->current_ == '/')
+bool OurReader::readCStyleComment() {
+ while ((current_ + 1) < end_) {
+ Char c = getNextChar();
+ if (c == '*' && *current_ == '/')
break;
}
- return this->getNextChar() == '/';
+ return getNextChar() == '/';
}
-bool OurReader::readCppStyleComment()
-{
- while (this->current_ != this->end_) {
- Char c = this->getNextChar();
+bool OurReader::readCppStyleComment() {
+ while (current_ != end_) {
+ Char c = getNextChar();
if (c == '\n')
break;
if (c == '\r') {
// Consume DOS EOL. It will be normalized in addComment.
- if (this->current_ != this->end_ && *this->current_ == '\n')
- this->getNextChar();
+ if (current_ != end_ && *current_ == '\n')
+ getNextChar();
// Break on Moc OS 9 EOL.
break;
}
@@ -1492,156 +1410,150 @@ bool OurReader::readCppStyleComment()
return true;
}
-bool OurReader::readNumber(bool checkInf)
-{
- const char* p = this->current_;
- if (checkInf && p != this->end_ && *p == 'I') {
- this->current_ = ++p;
+bool OurReader::readNumber(bool checkInf) {
+ const char *p = current_;
+ if (checkInf && p != end_ && *p == 'I') {
+ current_ = ++p;
return false;
}
char c = '0'; // stopgap for already consumed character
// integral part
while (c >= '0' && c <= '9')
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
// fractional part
if (c == '.') {
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
while (c >= '0' && c <= '9')
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
}
// exponential part
if (c == 'e' || c == 'E') {
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
if (c == '+' || c == '-')
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
while (c >= '0' && c <= '9')
- c = (this->current_ = p) < this->end_ ? *p++ : '\0';
+ c = (current_ = p) < end_ ? *p++ : '\0';
}
return true;
}
-bool OurReader::readString()
-{
+bool OurReader::readString() {
Char c = 0;
- while (this->current_ != this->end_) {
- c = this->getNextChar();
+ while (current_ != end_) {
+ c = getNextChar();
if (c == '\\')
- this->getNextChar();
+ getNextChar();
else if (c == '"')
break;
}
return c == '"';
}
-bool OurReader::readStringSingleQuote()
-{
+
+bool OurReader::readStringSingleQuote() {
Char c = 0;
- while (this->current_ != this->end_) {
- c = this->getNextChar();
+ while (current_ != end_) {
+ c = getNextChar();
if (c == '\\')
- this->getNextChar();
+ getNextChar();
else if (c == '\'')
break;
}
return c == '\'';
}
-bool OurReader::readObject(Token& tokenStart)
-{
+bool OurReader::readObject(Token& tokenStart) {
Token tokenName;
JSONCPP_STRING name;
Value init(objectValue);
- this->currentValue().swapPayload(init);
- this->currentValue().setOffsetStart(tokenStart.start_ - this->begin_);
- while (this->readToken(tokenName)) {
+ currentValue().swapPayload(init);
+ currentValue().setOffsetStart(tokenStart.start_ - begin_);
+ while (readToken(tokenName)) {
bool initialTokenOk = true;
while (tokenName.type_ == tokenComment && initialTokenOk)
- initialTokenOk = this->readToken(tokenName);
+ initialTokenOk = readToken(tokenName);
if (!initialTokenOk)
break;
if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object
return true;
name.clear();
if (tokenName.type_ == tokenString) {
- if (!this->decodeString(tokenName, name))
- return this->recoverFromError(tokenObjectEnd);
- } else if (tokenName.type_ == tokenNumber &&
- this->features_.allowNumericKeys_) {
+ if (!decodeString(tokenName, name))
+ return recoverFromError(tokenObjectEnd);
+ } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) {
Value numberName;
- if (!this->decodeNumber(tokenName, numberName))
- return this->recoverFromError(tokenObjectEnd);
+ if (!decodeNumber(tokenName, numberName))
+ return recoverFromError(tokenObjectEnd);
name = numberName.asString();
} else {
break;
}
Token colon;
- if (!this->readToken(colon) || colon.type_ != tokenMemberSeparator) {
- return this->addErrorAndRecover("Missing ':' after object member name",
- colon, tokenObjectEnd);
+ if (!readToken(colon) || colon.type_ != tokenMemberSeparator) {
+ return addErrorAndRecover(
+ "Missing ':' after object member name", colon, tokenObjectEnd);
}
- if (name.length() >= (1U << 30))
- throwRuntimeError("keylength >= 2^30");
- if (this->features_.rejectDupKeys_ &&
- this->currentValue().isMember(name)) {
+ if (name.length() >= (1U<<30)) throwRuntimeError("keylength >= 2^30");
+ if (features_.rejectDupKeys_ && currentValue().isMember(name)) {
JSONCPP_STRING msg = "Duplicate key: '" + name + "'";
- return this->addErrorAndRecover(msg, tokenName, tokenObjectEnd);
+ return addErrorAndRecover(
+ msg, tokenName, tokenObjectEnd);
}
- Value& value = this->currentValue()[name];
- this->nodes_.push(&value);
- bool ok = this->readValue();
- this->nodes_.pop();
+ Value& value = currentValue()[name];
+ nodes_.push(&value);
+ bool ok = readValue();
+ nodes_.pop();
if (!ok) // error already set
- return this->recoverFromError(tokenObjectEnd);
+ return recoverFromError(tokenObjectEnd);
Token comma;
- if (!this->readToken(comma) ||
+ if (!readToken(comma) ||
(comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator &&
comma.type_ != tokenComment)) {
- return this->addErrorAndRecover(
- "Missing ',' or '}' in object declaration", comma, tokenObjectEnd);
+ return addErrorAndRecover(
+ "Missing ',' or '}' in object declaration", comma, tokenObjectEnd);
}
bool finalizeTokenOk = true;
while (comma.type_ == tokenComment && finalizeTokenOk)
- finalizeTokenOk = this->readToken(comma);
+ finalizeTokenOk = readToken(comma);
if (comma.type_ == tokenObjectEnd)
return true;
}
- return this->addErrorAndRecover("Missing '}' or object member name",
- tokenName, tokenObjectEnd);
+ return addErrorAndRecover(
+ "Missing '}' or object member name", tokenName, tokenObjectEnd);
}
-bool OurReader::readArray(Token& tokenStart)
-{
+bool OurReader::readArray(Token& tokenStart) {
Value init(arrayValue);
- this->currentValue().swapPayload(init);
- this->currentValue().setOffsetStart(tokenStart.start_ - this->begin_);
- this->skipSpaces();
- if (this->current_ != this->end_ && *this->current_ == ']') // empty array
+ currentValue().swapPayload(init);
+ currentValue().setOffsetStart(tokenStart.start_ - begin_);
+ skipSpaces();
+ if (current_ != end_ && *current_ == ']') // empty array
{
Token endArray;
- this->readToken(endArray);
+ readToken(endArray);
return true;
}
int index = 0;
for (;;) {
- Value& value = this->currentValue()[index++];
- this->nodes_.push(&value);
- bool ok = this->readValue();
- this->nodes_.pop();
+ Value& value = currentValue()[index++];
+ nodes_.push(&value);
+ bool ok = readValue();
+ nodes_.pop();
if (!ok) // error already set
- return this->recoverFromError(tokenArrayEnd);
+ return recoverFromError(tokenArrayEnd);
Token token;
// Accept Comment after last item in the array.
- ok = this->readToken(token);
+ ok = readToken(token);
while (token.type_ == tokenComment && ok) {
- ok = this->readToken(token);
+ ok = readToken(token);
}
bool badTokenType =
- (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd);
+ (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd);
if (!ok || badTokenType) {
- return this->addErrorAndRecover(
- "Missing ',' or ']' in array declaration", token, tokenArrayEnd);
+ return addErrorAndRecover(
+ "Missing ',' or ']' in array declaration", token, tokenArrayEnd);
}
if (token.type_ == tokenArrayEnd)
break;
@@ -1649,19 +1561,17 @@ bool OurReader::readArray(Token& tokenStart)
return true;
}
-bool OurReader::decodeNumber(Token& token)
-{
+bool OurReader::decodeNumber(Token& token) {
Value decoded;
- if (!this->decodeNumber(token, decoded))
+ if (!decodeNumber(token, decoded))
return false;
- this->currentValue().swapPayload(decoded);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
+ currentValue().swapPayload(decoded);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
return true;
}
-bool OurReader::decodeNumber(Token& token, Value& decoded)
-{
+bool OurReader::decodeNumber(Token& token, Value& decoded) {
// Attempts to parse the number as an integer. If the number is
// larger than the maximum supported value of an integer then
// we decode the number as a double.
@@ -1669,17 +1579,16 @@ bool OurReader::decodeNumber(Token& token, Value& decoded)
bool isNegative = *current == '-';
if (isNegative)
++current;
- // TODO: Help the compiler do the div and mod at compile time or get rid of
- // them.
- Value::LargestUInt maxIntegerValue = isNegative
- ? Value::LargestUInt(Value::minLargestInt)
- : Value::maxLargestUInt;
+ // TODO: Help the compiler do the div and mod at compile time or get rid of them.
+ Value::LargestUInt maxIntegerValue =
+ isNegative ? Value::LargestUInt(Value::minLargestInt)
+ : Value::maxLargestUInt;
Value::LargestUInt threshold = maxIntegerValue / 10;
Value::LargestUInt value = 0;
while (current < token.end_) {
Char c = *current++;
if (c < '0' || c > '9')
- return this->decodeDouble(token, decoded);
+ return decodeDouble(token, decoded);
Value::UInt digit(static_cast<Value::UInt>(c - '0'));
if (value >= threshold) {
// We've hit or exceeded the max value divided by 10 (rounded down). If
@@ -1688,7 +1597,7 @@ bool OurReader::decodeNumber(Token& token, Value& decoded)
// Otherwise treat this number as a double to avoid overflow.
if (value > threshold || current != token.end_ ||
digit > maxIntegerValue % 10) {
- return this->decodeDouble(token, decoded);
+ return decodeDouble(token, decoded);
}
}
value = value * 10 + digit;
@@ -1702,19 +1611,17 @@ bool OurReader::decodeNumber(Token& token, Value& decoded)
return true;
}
-bool OurReader::decodeDouble(Token& token)
-{
+bool OurReader::decodeDouble(Token& token) {
Value decoded;
- if (!this->decodeDouble(token, decoded))
+ if (!decodeDouble(token, decoded))
return false;
- this->currentValue().swapPayload(decoded);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
+ currentValue().swapPayload(decoded);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
return true;
}
-bool OurReader::decodeDouble(Token& token, Value& decoded)
-{
+bool OurReader::decodeDouble(Token& token, Value& decoded) {
double value = 0;
const int bufferSize = 32;
int count;
@@ -1722,7 +1629,7 @@ bool OurReader::decodeDouble(Token& token, Value& decoded)
// Sanity check to avoid buffer overflow exploits.
if (length < 0) {
- return this->addError("Unable to parse token length", token);
+ return addError("Unable to parse token length", token);
}
size_t const ulength = static_cast<size_t>(length);
@@ -1745,27 +1652,25 @@ bool OurReader::decodeDouble(Token& token, Value& decoded)
}
if (count != 1)
- return this->addError("'" + JSONCPP_STRING(token.start_, token.end_) +
- "' is not a number.",
- token);
+ return addError("'" + JSONCPP_STRING(token.start_, token.end_) +
+ "' is not a number.",
+ token);
decoded = value;
return true;
}
-bool OurReader::decodeString(Token& token)
-{
+bool OurReader::decodeString(Token& token) {
JSONCPP_STRING decoded_string;
- if (!this->decodeString(token, decoded_string))
+ if (!decodeString(token, decoded_string))
return false;
Value decoded(decoded_string);
- this->currentValue().swapPayload(decoded);
- this->currentValue().setOffsetStart(token.start_ - this->begin_);
- this->currentValue().setOffsetLimit(token.end_ - this->begin_);
+ currentValue().swapPayload(decoded);
+ currentValue().setOffsetStart(token.start_ - begin_);
+ currentValue().setOffsetLimit(token.end_ - begin_);
return true;
}
-bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded)
-{
+bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded) {
decoded.reserve(static_cast<size_t>(token.end_ - token.start_ - 2));
Location current = token.start_ + 1; // skip '"'
Location end = token.end_ - 1; // do not include '"'
@@ -1775,43 +1680,41 @@ bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded)
break;
else if (c == '\\') {
if (current == end)
- return this->addError("Empty escape sequence in string", token,
- current);
+ return addError("Empty escape sequence in string", token, current);
Char escape = *current++;
switch (escape) {
- case '"':
- decoded += '"';
- break;
- case '/':
- decoded += '/';
- break;
- case '\\':
- decoded += '\\';
- break;
- case 'b':
- decoded += '\b';
- break;
- case 'f':
- decoded += '\f';
- break;
- case 'n':
- decoded += '\n';
- break;
- case 'r':
- decoded += '\r';
- break;
- case 't':
- decoded += '\t';
- break;
- case 'u': {
- unsigned int unicode;
- if (!this->decodeUnicodeCodePoint(token, current, end, unicode))
- return false;
- decoded += codePointToUTF8(unicode);
- } break;
- default:
- return this->addError("Bad escape sequence in string", token,
- current);
+ case '"':
+ decoded += '"';
+ break;
+ case '/':
+ decoded += '/';
+ break;
+ case '\\':
+ decoded += '\\';
+ break;
+ case 'b':
+ decoded += '\b';
+ break;
+ case 'f':
+ decoded += '\f';
+ break;
+ case 'n':
+ decoded += '\n';
+ break;
+ case 'r':
+ decoded += '\r';
+ break;
+ case 't':
+ decoded += '\t';
+ break;
+ case 'u': {
+ unsigned int unicode;
+ if (!decodeUnicodeCodePoint(token, current, end, unicode))
+ return false;
+ decoded += codePointToUTF8(unicode);
+ } break;
+ default:
+ return addError("Bad escape sequence in string", token, current);
}
} else {
decoded += c;
@@ -1820,44 +1723,45 @@ bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded)
return true;
}
-bool OurReader::decodeUnicodeCodePoint(Token& token, Location& current,
- Location end, unsigned int& unicode)
-{
+bool OurReader::decodeUnicodeCodePoint(Token& token,
+ Location& current,
+ Location end,
+ unsigned int& unicode) {
unicode = 0; // Convince scanbuild this is always initialized before use.
- if (!this->decodeUnicodeEscapeSequence(token, current, end, unicode))
+ if (!decodeUnicodeEscapeSequence(token, current, end, unicode))
return false;
if (unicode >= 0xD800 && unicode <= 0xDBFF) {
// surrogate pairs
if (end - current < 6)
- return this->addError(
- "additional six characters expected to parse unicode surrogate pair.",
- token, current);
+ return addError(
+ "additional six characters expected to parse unicode surrogate pair.",
+ token,
+ current);
unsigned int surrogatePair;
if (*(current++) == '\\' && *(current++) == 'u') {
- if (this->decodeUnicodeEscapeSequence(token, current, end,
- surrogatePair)) {
- unicode =
- 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
+ if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) {
+ unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
} else
return false;
} else
- return this->addError(
- "expecting another \\u token to begin the second half of "
- "a unicode surrogate pair",
- token, current);
+ return addError("expecting another \\u token to begin the second half of "
+ "a unicode surrogate pair",
+ token,
+ current);
}
return true;
}
-bool OurReader::decodeUnicodeEscapeSequence(Token& token, Location& current,
- Location end,
- unsigned int& ret_unicode)
-{
+bool OurReader::decodeUnicodeEscapeSequence(Token& token,
+ Location& current,
+ Location end,
+ unsigned int& ret_unicode) {
if (end - current < 4)
- return this->addError(
- "Bad unicode escape sequence in string: four digits expected.", token,
- current);
+ return addError(
+ "Bad unicode escape sequence in string: four digits expected.",
+ token,
+ current);
int unicode = 0;
for (int index = 0; index < 4; ++index) {
Char c = *current++;
@@ -1869,65 +1773,60 @@ bool OurReader::decodeUnicodeEscapeSequence(Token& token, Location& current,
else if (c >= 'A' && c <= 'F')
unicode += c - 'A' + 10;
else
- return this->addError(
- "Bad unicode escape sequence in string: hexadecimal digit expected.",
- token, current);
+ return addError(
+ "Bad unicode escape sequence in string: hexadecimal digit expected.",
+ token,
+ current);
}
ret_unicode = static_cast<unsigned int>(unicode);
return true;
}
-bool OurReader::addError(const JSONCPP_STRING& message, Token& token,
- Location extra)
-{
+bool
+OurReader::addError(const JSONCPP_STRING& message, Token& token, Location extra) {
ErrorInfo info;
info.token_ = token;
info.message_ = message;
info.extra_ = extra;
- this->errors_.push_back(info);
+ errors_.push_back(info);
return false;
}
-bool OurReader::recoverFromError(TokenType skipUntilToken)
-{
- size_t errorCount = this->errors_.size();
+bool OurReader::recoverFromError(TokenType skipUntilToken) {
+ size_t errorCount = errors_.size();
Token skip;
for (;;) {
- if (!this->readToken(skip))
- this->errors_.resize(errorCount); // discard errors caused by recovery
+ if (!readToken(skip))
+ errors_.resize(errorCount); // discard errors caused by recovery
if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream)
break;
}
- this->errors_.resize(errorCount);
+ errors_.resize(errorCount);
return false;
}
-bool OurReader::addErrorAndRecover(const JSONCPP_STRING& message, Token& token,
- TokenType skipUntilToken)
-{
- this->addError(message, token);
- return this->recoverFromError(skipUntilToken);
+bool OurReader::addErrorAndRecover(const JSONCPP_STRING& message,
+ Token& token,
+ TokenType skipUntilToken) {
+ addError(message, token);
+ return recoverFromError(skipUntilToken);
}
-Value& OurReader::currentValue()
-{
- return *(this->nodes_.top());
-}
+Value& OurReader::currentValue() { return *(nodes_.top()); }
-OurReader::Char OurReader::getNextChar()
-{
- if (this->current_ == this->end_)
+OurReader::Char OurReader::getNextChar() {
+ if (current_ == end_)
return 0;
- return *this->current_++;
+ return *current_++;
}
-void OurReader::getLocationLineAndColumn(Location location, int& line,
- int& column) const
-{
- Location current = this->begin_;
+void OurReader::getLocationLineAndColumn(Location location,
+ int& line,
+ int& column) const {
+ Location current = begin_;
Location lastLineStart = current;
line = 0;
- while (current < location && current != this->end_) {
+ while (current < location && current != end_) {
Char c = *current++;
if (c == '\r') {
if (*current == '\n')
@@ -1944,105 +1843,101 @@ void OurReader::getLocationLineAndColumn(Location location, int& line,
++line;
}
-JSONCPP_STRING OurReader::getLocationLineAndColumn(Location location) const
-{
+JSONCPP_STRING OurReader::getLocationLineAndColumn(Location location) const {
int line, column;
- this->getLocationLineAndColumn(location, line, column);
+ getLocationLineAndColumn(location, line, column);
char buffer[18 + 16 + 16 + 1];
snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column);
return buffer;
}
-JSONCPP_STRING OurReader::getFormattedErrorMessages() const
-{
+JSONCPP_STRING OurReader::getFormattedErrorMessages() const {
JSONCPP_STRING formattedMessage;
- for (Errors::const_iterator itError = this->errors_.begin();
- itError != this->errors_.end(); ++itError) {
+ for (Errors::const_iterator itError = errors_.begin();
+ itError != errors_.end();
+ ++itError) {
const ErrorInfo& error = *itError;
formattedMessage +=
- "* " + this->getLocationLineAndColumn(error.token_.start_) + "\n";
+ "* " + getLocationLineAndColumn(error.token_.start_) + "\n";
formattedMessage += " " + error.message_ + "\n";
if (error.extra_)
- formattedMessage += "See " +
- this->getLocationLineAndColumn(error.extra_) + " for detail.\n";
+ formattedMessage +=
+ "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n";
}
return formattedMessage;
}
-std::vector<OurReader::StructuredError> OurReader::getStructuredErrors() const
-{
+std::vector<OurReader::StructuredError> OurReader::getStructuredErrors() const {
std::vector<OurReader::StructuredError> allErrors;
- for (Errors::const_iterator itError = this->errors_.begin();
- itError != this->errors_.end(); ++itError) {
+ for (Errors::const_iterator itError = errors_.begin();
+ itError != errors_.end();
+ ++itError) {
const ErrorInfo& error = *itError;
OurReader::StructuredError structured;
- structured.offset_start = error.token_.start_ - this->begin_;
- structured.offset_limit = error.token_.end_ - this->begin_;
+ structured.offset_start = error.token_.start_ - begin_;
+ structured.offset_limit = error.token_.end_ - begin_;
structured.message = error.message_;
allErrors.push_back(structured);
}
return allErrors;
}
-bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message)
-{
- ptrdiff_t length = this->end_ - this->begin_;
- if (value.getOffsetStart() > length || value.getOffsetLimit() > length)
+bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message) {
+ ptrdiff_t length = end_ - begin_;
+ if(value.getOffsetStart() > length
+ || value.getOffsetLimit() > length)
return false;
Token token;
token.type_ = tokenError;
- token.start_ = this->begin_ + value.getOffsetStart();
- token.end_ = this->end_ + value.getOffsetLimit();
+ token.start_ = begin_ + value.getOffsetStart();
+ token.end_ = end_ + value.getOffsetLimit();
ErrorInfo info;
info.token_ = token;
info.message_ = message;
info.extra_ = 0;
- this->errors_.push_back(info);
+ errors_.push_back(info);
return true;
}
-bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message,
- const Value& extra)
-{
- ptrdiff_t length = this->end_ - this->begin_;
- if (value.getOffsetStart() > length || value.getOffsetLimit() > length ||
- extra.getOffsetLimit() > length)
+bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) {
+ ptrdiff_t length = end_ - begin_;
+ if(value.getOffsetStart() > length
+ || value.getOffsetLimit() > length
+ || extra.getOffsetLimit() > length)
return false;
Token token;
token.type_ = tokenError;
- token.start_ = this->begin_ + value.getOffsetStart();
- token.end_ = this->begin_ + value.getOffsetLimit();
+ token.start_ = begin_ + value.getOffsetStart();
+ token.end_ = begin_ + value.getOffsetLimit();
ErrorInfo info;
info.token_ = token;
info.message_ = message;
- info.extra_ = this->begin_ + extra.getOffsetStart();
- this->errors_.push_back(info);
+ info.extra_ = begin_ + extra.getOffsetStart();
+ errors_.push_back(info);
return true;
}
-bool OurReader::good() const
-{
- return !this->errors_.size();
+bool OurReader::good() const {
+ return !errors_.size();
}
-class OurCharReader : public CharReader
-{
+
+class OurCharReader : public CharReader {
bool const collectComments_;
OurReader reader_;
-
public:
- OurCharReader(bool collectComments, OurFeatures const& features)
- : collectComments_(collectComments)
- , reader_(features)
- {
- }
- bool parse(char const* beginDoc, char const* endDoc, Value* root,
- JSONCPP_STRING* errs) JSONCPP_OVERRIDE
- {
- bool ok =
- this->reader_.parse(beginDoc, endDoc, *root, this->collectComments_);
+ OurCharReader(
+ bool collectComments,
+ OurFeatures const& features)
+ : collectComments_(collectComments)
+ , reader_(features)
+ {}
+ bool parse(
+ char const* beginDoc, char const* endDoc,
+ Value* root, JSONCPP_STRING* errs) JSONCPP_OVERRIDE {
+ bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_);
if (errs) {
- *errs = this->reader_.getFormattedErrorMessages();
+ *errs = reader_.getFormattedErrorMessages();
}
return ok;
}
@@ -2050,26 +1945,23 @@ public:
CharReaderBuilder::CharReaderBuilder()
{
- setDefaults(&this->settings_);
+ setDefaults(&settings_);
}
CharReaderBuilder::~CharReaderBuilder()
-{
-}
+{}
CharReader* CharReaderBuilder::newCharReader() const
{
- bool collectComments = this->settings_["collectComments"].asBool();
+ bool collectComments = settings_["collectComments"].asBool();
OurFeatures features = OurFeatures::all();
- features.allowComments_ = this->settings_["allowComments"].asBool();
- features.strictRoot_ = this->settings_["strictRoot"].asBool();
- features.allowDroppedNullPlaceholders_ =
- this->settings_["allowDroppedNullPlaceholders"].asBool();
- features.allowNumericKeys_ = this->settings_["allowNumericKeys"].asBool();
- features.allowSingleQuotes_ = this->settings_["allowSingleQuotes"].asBool();
- features.stackLimit_ = this->settings_["stackLimit"].asInt();
- features.failIfExtra_ = this->settings_["failIfExtra"].asBool();
- features.rejectDupKeys_ = this->settings_["rejectDupKeys"].asBool();
- features.allowSpecialFloats_ =
- this->settings_["allowSpecialFloats"].asBool();
+ features.allowComments_ = settings_["allowComments"].asBool();
+ features.strictRoot_ = settings_["strictRoot"].asBool();
+ features.allowDroppedNullPlaceholders_ = settings_["allowDroppedNullPlaceholders"].asBool();
+ features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool();
+ features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool();
+ features.stackLimit_ = settings_["stackLimit"].asInt();
+ features.failIfExtra_ = settings_["failIfExtra"].asBool();
+ features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool();
+ features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool();
return new OurCharReader(collectComments, features);
}
static void getValidReaderKeys(std::set<JSONCPP_STRING>* valid_keys)
@@ -2089,29 +1981,28 @@ static void getValidReaderKeys(std::set<JSONCPP_STRING>* valid_keys)
bool CharReaderBuilder::validate(Json::Value* invalid) const
{
Json::Value my_invalid;
- if (!invalid)
- invalid = &my_invalid; // so we do not need to test for NULL
+ if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL
Json::Value& inv = *invalid;
std::set<JSONCPP_STRING> valid_keys;
getValidReaderKeys(&valid_keys);
- Value::Members keys = this->settings_.getMemberNames();
+ Value::Members keys = settings_.getMemberNames();
size_t n = keys.size();
for (size_t i = 0; i < n; ++i) {
JSONCPP_STRING const& key = keys[i];
if (valid_keys.find(key) == valid_keys.end()) {
- inv[key] = this->settings_[key];
+ inv[key] = settings_[key];
}
}
return 0u == inv.size();
}
Value& CharReaderBuilder::operator[](JSONCPP_STRING key)
{
- return this->settings_[key];
+ return settings_[key];
}
// static
void CharReaderBuilder::strictMode(Json::Value* settings)
{
- //! [CharReaderBuilderStrictMode]
+//! [CharReaderBuilderStrictMode]
(*settings)["allowComments"] = false;
(*settings)["strictRoot"] = true;
(*settings)["allowDroppedNullPlaceholders"] = false;
@@ -2121,12 +2012,12 @@ void CharReaderBuilder::strictMode(Json::Value* settings)
(*settings)["failIfExtra"] = true;
(*settings)["rejectDupKeys"] = true;
(*settings)["allowSpecialFloats"] = false;
- //! [CharReaderBuilderStrictMode]
+//! [CharReaderBuilderStrictMode]
}
// static
void CharReaderBuilder::setDefaults(Json::Value* settings)
{
- //! [CharReaderBuilderDefaults]
+//! [CharReaderBuilderDefaults]
(*settings)["collectComments"] = true;
(*settings)["allowComments"] = true;
(*settings)["strictRoot"] = false;
@@ -2137,14 +2028,15 @@ void CharReaderBuilder::setDefaults(Json::Value* settings)
(*settings)["failIfExtra"] = false;
(*settings)["rejectDupKeys"] = false;
(*settings)["allowSpecialFloats"] = false;
- //! [CharReaderBuilderDefaults]
+//! [CharReaderBuilderDefaults]
}
//////////////////////////////////
// global functions
-bool parseFromStream(CharReader::Factory const& fact, JSONCPP_ISTREAM& sin,
- Value* root, JSONCPP_STRING* errs)
+bool parseFromStream(
+ CharReader::Factory const& fact, JSONCPP_ISTREAM& sin,
+ Value* root, JSONCPP_STRING* errs)
{
JSONCPP_OSTRINGSTREAM ssin;
ssin << sin.rdbuf();
@@ -2156,13 +2048,14 @@ bool parseFromStream(CharReader::Factory const& fact, JSONCPP_ISTREAM& sin,
return reader->parse(begin, end, root, errs);
}
-JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM& sin, Value& root)
-{
+JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM& sin, Value& root) {
CharReaderBuilder b;
JSONCPP_STRING errs;
bool ok = parseFromStream(b, sin, &root, &errs);
if (!ok) {
- fprintf(stderr, "Error from reader: %s", errs.c_str());
+ fprintf(stderr,
+ "Error from reader: %s",
+ errs.c_str());
throwRuntimeError(errs);
}
diff --git a/Utilities/cmjsoncpp/src/lib_json/json_value.cpp b/Utilities/cmjsoncpp/src/lib_json/json_value.cpp
index eadb1c375e..f271e5731f 100644
--- a/Utilities/cmjsoncpp/src/lib_json/json_value.cpp
+++ b/Utilities/cmjsoncpp/src/lib_json/json_value.cpp
@@ -1,25 +1,23 @@
// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors
// Distributed under MIT license, or public domain if desired and
// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at
-// http://jsoncpp.sourceforge.net/LICENSE
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
#if !defined(JSON_IS_AMALGAMATION)
-# include <json/assertions.h>
-# include <json/value.h>
-# include <json/writer.h>
+#include <json/assertions.h>
+#include <json/value.h>
+#include <json/writer.h>
#endif // if !defined(JSON_IS_AMALGAMATION)
+#include <math.h>
#include <sstream>
#include <utility>
-
-#include <assert.h>
-#include <math.h>
#include <string.h>
+#include <assert.h>
#ifdef JSON_USE_CPPTL
-# include <cpptl/conststring.h>
+#include <cpptl/conststring.h>
#endif
+#include <cstddef> // size_t
#include <algorithm> // min()
-#include <cstddef> // size_t
#define JSON_ASSERT_UNREACHABLE assert(false)
@@ -29,24 +27,24 @@ namespace Json {
// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of
// 8 (instead of 4) as a bit of future-proofing.
#if defined(__ARMEL__)
-# define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
+#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
#else
-# define ALIGNAS(byte_alignment)
+#define ALIGNAS(byte_alignment)
#endif
-// static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 };
-// const unsigned char& kNullRef = kNull[0];
-// const Value& Value::null = reinterpret_cast<const Value&>(kNullRef);
-// const Value& Value::nullRef = null;
+//static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 };
+//const unsigned char& kNullRef = kNull[0];
+//const Value& Value::null = reinterpret_cast<const Value&>(kNullRef);
+//const Value& Value::nullRef = null;
// static
Value const& Value::nullSingleton()
{
- static Value const nullStatic;
- return nullStatic;
+ static Value const nullStatic;
+ return nullStatic;
}
-// for backwards compatibility, we'll leave these global references around, but
-// DO NOT use them in JSONCPP library code any more!
+// for backwards compatibility, we'll leave these global references around, but DO NOT
+// use them in JSONCPP library code any more!
Value const& Value::null = Value::nullSingleton();
Value const& Value::nullRef = Value::nullSingleton();
@@ -68,29 +66,23 @@ const LargestUInt Value::maxLargestUInt = LargestUInt(-1);
#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
template <typename T, typename U>
-static inline bool InRange(double d, T min, U max)
-{
+static inline bool InRange(double d, T min, U max) {
// The casts can lose precision, but we are looking only for
// an approximate range. Might fail on edge cases though. ~cdunn
- // return d >= static_cast<double>(min) && d <= static_cast<double>(max);
+ //return d >= static_cast<double>(min) && d <= static_cast<double>(max);
return d >= min && d <= max;
}
#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
-static inline double integerToDouble(Json::UInt64 value)
-{
- return static_cast<double>(Int64(value / 2)) * 2.0 +
- static_cast<double>(Int64(value & 1));
+static inline double integerToDouble(Json::UInt64 value) {
+ return static_cast<double>(Int64(value / 2)) * 2.0 + static_cast<double>(Int64(value & 1));
}
-template <typename T>
-static inline double integerToDouble(T value)
-{
+template <typename T> static inline double integerToDouble(T value) {
return static_cast<double>(value);
}
template <typename T, typename U>
-static inline bool InRange(double d, T min, U max)
-{
+static inline bool InRange(double d, T min, U max) {
return d >= integerToDouble(min) && d <= integerToDouble(max);
}
#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
@@ -102,7 +94,8 @@ static inline bool InRange(double d, T min, U max)
* computed using strlen(value).
* @return Pointer on the duplicate instance of string.
*/
-static inline char* duplicateStringValue(const char* value, size_t length)
+static inline char* duplicateStringValue(const char* value,
+ size_t length)
{
// Avoid an integer overflow in the call to malloc below by limiting length
// to a sane value.
@@ -111,8 +104,9 @@ static inline char* duplicateStringValue(const char* value, size_t length)
char* newString = static_cast<char*>(malloc(length + 1));
if (newString == NULL) {
- throwRuntimeError("in Json::Value::duplicateStringValue(): "
- "Failed to allocate string value buffer");
+ throwRuntimeError(
+ "in Json::Value::duplicateStringValue(): "
+ "Failed to allocate string value buffer");
}
memcpy(newString, value, length);
newString[length] = 0;
@@ -121,30 +115,30 @@ static inline char* duplicateStringValue(const char* value, size_t length)
/* Record the length as a prefix.
*/
-static inline char* duplicateAndPrefixStringValue(const char* value,
- unsigned int length)
+static inline char* duplicateAndPrefixStringValue(
+ const char* value,
+ unsigned int length)
{
// Avoid an integer overflow in the call to malloc below by limiting length
// to a sane value.
- JSON_ASSERT_MESSAGE(length <= static_cast<unsigned>(Value::maxInt) -
- sizeof(unsigned) - 1U,
+ JSON_ASSERT_MESSAGE(length <= static_cast<unsigned>(Value::maxInt) - sizeof(unsigned) - 1U,
"in Json::Value::duplicateAndPrefixStringValue(): "
"length too big for prefixing");
- unsigned actualLength =
- length + static_cast<unsigned>(sizeof(unsigned)) + 1U;
+ unsigned actualLength = length + static_cast<unsigned>(sizeof(unsigned)) + 1U;
char* newString = static_cast<char*>(malloc(actualLength));
if (newString == 0) {
- throwRuntimeError("in Json::Value::duplicateAndPrefixStringValue(): "
- "Failed to allocate string value buffer");
+ throwRuntimeError(
+ "in Json::Value::duplicateAndPrefixStringValue(): "
+ "Failed to allocate string value buffer");
}
*reinterpret_cast<unsigned*>(newString) = length;
memcpy(newString + sizeof(unsigned), value, length);
- newString[actualLength - 1U] =
- 0; // to avoid buffer over-run accidents by users later
+ newString[actualLength - 1U] = 0; // to avoid buffer over-run accidents by users later
return newString;
}
-inline static void decodePrefixedString(bool isPrefixed, char const* prefixed,
- unsigned* length, char const** value)
+inline static void decodePrefixedString(
+ bool isPrefixed, char const* prefixed,
+ unsigned* length, char const** value)
{
if (!isPrefixed) {
*length = static_cast<unsigned>(strlen(prefixed));
@@ -154,12 +148,10 @@ inline static void decodePrefixedString(bool isPrefixed, char const* prefixed,
*value = prefixed + sizeof(unsigned);
}
}
-/** Free the string duplicated by
- * duplicateStringValue()/duplicateAndPrefixStringValue().
+/** Free the string duplicated by duplicateStringValue()/duplicateAndPrefixStringValue().
*/
#if JSONCPP_USING_SECURE_MEMORY
-static inline void releasePrefixedStringValue(char* value)
-{
+static inline void releasePrefixedStringValue(char* value) {
unsigned length = 0;
char const* valueDecoded;
decodePrefixedString(true, value, &length, &valueDecoded);
@@ -167,20 +159,17 @@ static inline void releasePrefixedStringValue(char* value)
memset(value, 0, size);
free(value);
}
-static inline void releaseStringValue(char* value, unsigned length)
-{
+static inline void releaseStringValue(char* value, unsigned length) {
// length==0 => we allocated the strings memory
- size_t size = (length == 0) ? strlen(value) : length;
+ size_t size = (length==0) ? strlen(value) : length;
memset(value, 0, size);
free(value);
}
-#else // !JSONCPP_USING_SECURE_MEMORY
-static inline void releasePrefixedStringValue(char* value)
-{
+#else // !JSONCPP_USING_SECURE_MEMORY
+static inline void releasePrefixedStringValue(char* value) {
free(value);
}
-static inline void releaseStringValue(char* value, unsigned)
-{
+static inline void releaseStringValue(char* value, unsigned) {
free(value);
}
#endif // JSONCPP_USING_SECURE_MEMORY
@@ -196,30 +185,26 @@ static inline void releaseStringValue(char* value, unsigned)
// //////////////////////////////////////////////////////////////////
#if !defined(JSON_IS_AMALGAMATION)
-# include "json_valueiterator.inl"
+#include "json_valueiterator.inl"
#endif // if !defined(JSON_IS_AMALGAMATION)
namespace Json {
Exception::Exception(JSONCPP_STRING const& msg)
: msg_(msg)
-{
-}
+{}
Exception::~Exception() JSONCPP_NOEXCEPT
-{
-}
+{}
char const* Exception::what() const JSONCPP_NOEXCEPT
{
- return this->msg_.c_str();
+ return msg_.c_str();
}
RuntimeError::RuntimeError(JSONCPP_STRING const& msg)
: Exception(msg)
-{
-}
+{}
LogicError::LogicError(JSONCPP_STRING const& msg)
: Exception(msg)
-{
-}
+{}
JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg)
{
throw RuntimeError(msg);
@@ -237,29 +222,25 @@ JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg)
// //////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////
-Value::CommentInfo::CommentInfo()
- : comment_(0)
-{
-}
+Value::CommentInfo::CommentInfo() : comment_(0)
+{}
-Value::CommentInfo::~CommentInfo()
-{
- if (this->comment_)
- releaseStringValue(this->comment_, 0u);
+Value::CommentInfo::~CommentInfo() {
+ if (comment_)
+ releaseStringValue(comment_, 0u);
}
-void Value::CommentInfo::setComment(const char* text, size_t len)
-{
- if (this->comment_) {
- releaseStringValue(this->comment_, 0u);
- this->comment_ = 0;
+void Value::CommentInfo::setComment(const char* text, size_t len) {
+ if (comment_) {
+ releaseStringValue(comment_, 0u);
+ comment_ = 0;
}
JSON_ASSERT(text != 0);
JSON_ASSERT_MESSAGE(
- text[0] == '\0' || text[0] == '/',
- "in Json::Value::setComment(): Comments must start with /");
+ text[0] == '\0' || text[0] == '/',
+ "in Json::Value::setComment(): Comments must start with /");
// It seems that /**/ style comments are acceptable as well.
- this->comment_ = duplicateStringValue(text, len);
+ comment_ = duplicateStringValue(text, len);
}
// //////////////////////////////////////////////////////////////////
@@ -273,130 +254,91 @@ void Value::CommentInfo::setComment(const char* text, size_t len)
// Notes: policy_ indicates if the string was allocated when
// a string is stored.
-Value::CZString::CZString(ArrayIndex aindex)
- : cstr_(0)
- , index_(aindex)
-{
-}
+Value::CZString::CZString(ArrayIndex aindex) : cstr_(0), index_(aindex) {}
-Value::CZString::CZString(char const* str, unsigned ulength,
- DuplicationPolicy allocate)
- : cstr_(str)
-{
+Value::CZString::CZString(char const* str, unsigned ulength, DuplicationPolicy allocate)
+ : cstr_(str) {
// allocate != duplicate
- this->storage_.policy_ = allocate & 0x3;
- this->storage_.length_ = ulength & 0x3FFFFFFF;
+ storage_.policy_ = allocate & 0x3;
+ storage_.length_ = ulength & 0x3FFFFFFF;
}
-Value::CZString::CZString(const CZString& other)
-{
- this->cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != 0
- ? duplicateStringValue(other.cstr_, other.storage_.length_)
- : other.cstr_);
- this->storage_.policy_ =
- static_cast<unsigned>(
- other.cstr_ ? (static_cast<DuplicationPolicy>(other.storage_.policy_) ==
- noDuplication
- ? noDuplication
- : duplicate)
- : static_cast<DuplicationPolicy>(other.storage_.policy_)) &
- 3U;
- this->storage_.length_ = other.storage_.length_;
+Value::CZString::CZString(const CZString& other) {
+ cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != 0
+ ? duplicateStringValue(other.cstr_, other.storage_.length_)
+ : other.cstr_);
+ storage_.policy_ = static_cast<unsigned>(other.cstr_
+ ? (static_cast<DuplicationPolicy>(other.storage_.policy_) == noDuplication
+ ? noDuplication : duplicate)
+ : static_cast<DuplicationPolicy>(other.storage_.policy_)) & 3U;
+ storage_.length_ = other.storage_.length_;
}
#if JSON_HAS_RVALUE_REFERENCES
Value::CZString::CZString(CZString&& other)
- : cstr_(other.cstr_)
- , index_(other.index_)
-{
+ : cstr_(other.cstr_), index_(other.index_) {
other.cstr_ = nullptr;
}
#endif
-Value::CZString::~CZString()
-{
- if (this->cstr_ && this->storage_.policy_ == duplicate) {
- releaseStringValue(const_cast<char*>(this->cstr_),
- this->storage_.length_ +
- 1u); //+1 for null terminating character for sake of
- //completeness but not actually necessary
+Value::CZString::~CZString() {
+ if (cstr_ && storage_.policy_ == duplicate) {
+ releaseStringValue(const_cast<char*>(cstr_), storage_.length_ + 1u); //+1 for null terminating character for sake of completeness but not actually necessary
}
}
-void Value::CZString::swap(CZString& other)
-{
- std::swap(this->cstr_, other.cstr_);
- std::swap(this->index_, other.index_);
+void Value::CZString::swap(CZString& other) {
+ std::swap(cstr_, other.cstr_);
+ std::swap(index_, other.index_);
}
-Value::CZString& Value::CZString::operator=(const CZString& other)
-{
- this->cstr_ = other.cstr_;
- this->index_ = other.index_;
+Value::CZString& Value::CZString::operator=(const CZString& other) {
+ cstr_ = other.cstr_;
+ index_ = other.index_;
return *this;
}
#if JSON_HAS_RVALUE_REFERENCES
-Value::CZString& Value::CZString::operator=(CZString&& other)
-{
- this->cstr_ = other.cstr_;
- this->index_ = other.index_;
+Value::CZString& Value::CZString::operator=(CZString&& other) {
+ cstr_ = other.cstr_;
+ index_ = other.index_;
other.cstr_ = nullptr;
return *this;
}
#endif
-bool Value::CZString::operator<(const CZString& other) const
-{
- if (!this->cstr_)
- return this->index_ < other.index_;
- // return strcmp(cstr_, other.cstr_) < 0;
+bool Value::CZString::operator<(const CZString& other) const {
+ if (!cstr_) return index_ < other.index_;
+ //return strcmp(cstr_, other.cstr_) < 0;
// Assume both are strings.
unsigned this_len = this->storage_.length_;
unsigned other_len = other.storage_.length_;
unsigned min_len = std::min<unsigned>(this_len, other_len);
JSON_ASSERT(this->cstr_ && other.cstr_);
int comp = memcmp(this->cstr_, other.cstr_, min_len);
- if (comp < 0)
- return true;
- if (comp > 0)
- return false;
+ if (comp < 0) return true;
+ if (comp > 0) return false;
return (this_len < other_len);
}
-bool Value::CZString::operator==(const CZString& other) const
-{
- if (!this->cstr_)
- return this->index_ == other.index_;
- // return strcmp(cstr_, other.cstr_) == 0;
+bool Value::CZString::operator==(const CZString& other) const {
+ if (!cstr_) return index_ == other.index_;
+ //return strcmp(cstr_, other.cstr_) == 0;
// Assume both are strings.
unsigned this_len = this->storage_.length_;
unsigned other_len = other.storage_.length_;
- if (this_len != other_len)
- return false;
+ if (this_len != other_len) return false;
JSON_ASSERT(this->cstr_ && other.cstr_);
int comp = memcmp(this->cstr_, other.cstr_, this_len);
return comp == 0;
}
-ArrayIndex Value::CZString::index() const
-{
- return this->index_;
-}
+ArrayIndex Value::CZString::index() const { return index_; }
-// const char* Value::CZString::c_str() const { return cstr_; }
-const char* Value::CZString::data() const
-{
- return this->cstr_;
-}
-unsigned Value::CZString::length() const
-{
- return this->storage_.length_;
-}
-bool Value::CZString::isStaticString() const
-{
- return this->storage_.policy_ == noDuplication;
-}
+//const char* Value::CZString::c_str() const { return cstr_; }
+const char* Value::CZString::data() const { return cstr_; }
+unsigned Value::CZString::length() const { return storage_.length_; }
+bool Value::CZString::isStaticString() const { return storage_.policy_ == noDuplication; }
// //////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////
@@ -410,238 +352,210 @@ bool Value::CZString::isStaticString() const
* memset( this, 0, sizeof(Value) )
* This optimization is used in ValueInternalMap fast allocator.
*/
-Value::Value(ValueType vtype)
-{
+Value::Value(ValueType vtype) {
static char const emptyString[] = "";
- this->initBasic(vtype);
+ initBasic(vtype);
switch (vtype) {
- case nullValue:
- break;
- case intValue:
- case uintValue:
- this->value_.int_ = 0;
- break;
- case realValue:
- this->value_.real_ = 0.0;
- break;
- case stringValue:
- // allocated_ == false, so this is safe.
- this->value_.string_ =
- const_cast<char*>(static_cast<char const*>(emptyString));
- break;
- case arrayValue:
- case objectValue:
- this->value_.map_ = new ObjectValues();
- break;
- case booleanValue:
- this->value_.bool_ = false;
- break;
- default:
- JSON_ASSERT_UNREACHABLE;
+ case nullValue:
+ break;
+ case intValue:
+ case uintValue:
+ value_.int_ = 0;
+ break;
+ case realValue:
+ value_.real_ = 0.0;
+ break;
+ case stringValue:
+ // allocated_ == false, so this is safe.
+ value_.string_ = const_cast<char*>(static_cast<char const*>(emptyString));
+ break;
+ case arrayValue:
+ case objectValue:
+ value_.map_ = new ObjectValues();
+ break;
+ case booleanValue:
+ value_.bool_ = false;
+ break;
+ default:
+ JSON_ASSERT_UNREACHABLE;
}
}
-Value::Value(Int value)
-{
- this->initBasic(intValue);
- this->value_.int_ = value;
+Value::Value(Int value) {
+ initBasic(intValue);
+ value_.int_ = value;
}
-Value::Value(UInt value)
-{
- this->initBasic(uintValue);
- this->value_.uint_ = value;
+Value::Value(UInt value) {
+ initBasic(uintValue);
+ value_.uint_ = value;
}
#if defined(JSON_HAS_INT64)
-Value::Value(Int64 value)
-{
- this->initBasic(intValue);
- this->value_.int_ = value;
+Value::Value(Int64 value) {
+ initBasic(intValue);
+ value_.int_ = value;
}
-Value::Value(UInt64 value)
-{
- this->initBasic(uintValue);
- this->value_.uint_ = value;
+Value::Value(UInt64 value) {
+ initBasic(uintValue);
+ value_.uint_ = value;
}
#endif // defined(JSON_HAS_INT64)
-Value::Value(double value)
-{
- this->initBasic(realValue);
- this->value_.real_ = value;
+Value::Value(double value) {
+ initBasic(realValue);
+ value_.real_ = value;
}
-Value::Value(const char* value)
-{
- this->initBasic(stringValue, true);
+Value::Value(const char* value) {
+ initBasic(stringValue, true);
JSON_ASSERT_MESSAGE(value != NULL, "Null Value Passed to Value Constructor");
- this->value_.string_ =
- duplicateAndPrefixStringValue(value, static_cast<unsigned>(strlen(value)));
+ value_.string_ = duplicateAndPrefixStringValue(value, static_cast<unsigned>(strlen(value)));
}
-Value::Value(const char* beginValue, const char* endValue)
-{
- this->initBasic(stringValue, true);
- this->value_.string_ = duplicateAndPrefixStringValue(
- beginValue, static_cast<unsigned>(endValue - beginValue));
+Value::Value(const char* beginValue, const char* endValue) {
+ initBasic(stringValue, true);
+ value_.string_ =
+ duplicateAndPrefixStringValue(beginValue, static_cast<unsigned>(endValue - beginValue));
}
-Value::Value(const JSONCPP_STRING& value)
-{
- this->initBasic(stringValue, true);
- this->value_.string_ = duplicateAndPrefixStringValue(
- value.data(), static_cast<unsigned>(value.length()));
+Value::Value(const JSONCPP_STRING& value) {
+ initBasic(stringValue, true);
+ value_.string_ =
+ duplicateAndPrefixStringValue(value.data(), static_cast<unsigned>(value.length()));
}
-Value::Value(const StaticString& value)
-{
- this->initBasic(stringValue);
- this->value_.string_ = const_cast<char*>(value.c_str());
+Value::Value(const StaticString& value) {
+ initBasic(stringValue);
+ value_.string_ = const_cast<char*>(value.c_str());
}
#ifdef JSON_USE_CPPTL
-Value::Value(const CppTL::ConstString& value)
-{
+Value::Value(const CppTL::ConstString& value) {
initBasic(stringValue, true);
- value_.string_ = duplicateAndPrefixStringValue(
- value, static_cast<unsigned>(value.length()));
+ value_.string_ = duplicateAndPrefixStringValue(value, static_cast<unsigned>(value.length()));
}
#endif
-Value::Value(bool value)
-{
- this->initBasic(booleanValue);
- this->value_.bool_ = value;
+Value::Value(bool value) {
+ initBasic(booleanValue);
+ value_.bool_ = value;
}
Value::Value(Value const& other)
- : type_(other.type_)
- , allocated_(false)
- , comments_(0)
- , start_(other.start_)
- , limit_(other.limit_)
-{
- switch (this->type_) {
- case nullValue:
- case intValue:
- case uintValue:
- case realValue:
- case booleanValue:
- this->value_ = other.value_;
- break;
- case stringValue:
- if (other.value_.string_ && other.allocated_) {
- unsigned len;
- char const* str;
- decodePrefixedString(other.allocated_, other.value_.string_, &len,
- &str);
- this->value_.string_ = duplicateAndPrefixStringValue(str, len);
- this->allocated_ = true;
- } else {
- this->value_.string_ = other.value_.string_;
- this->allocated_ = false;
- }
- break;
- case arrayValue:
- case objectValue:
- this->value_.map_ = new ObjectValues(*other.value_.map_);
- break;
- default:
- JSON_ASSERT_UNREACHABLE;
+ : type_(other.type_), allocated_(false)
+ ,
+ comments_(0), start_(other.start_), limit_(other.limit_)
+{
+ switch (type_) {
+ case nullValue:
+ case intValue:
+ case uintValue:
+ case realValue:
+ case booleanValue:
+ value_ = other.value_;
+ break;
+ case stringValue:
+ if (other.value_.string_ && other.allocated_) {
+ unsigned len;
+ char const* str;
+ decodePrefixedString(other.allocated_, other.value_.string_,
+ &len, &str);
+ value_.string_ = duplicateAndPrefixStringValue(str, len);
+ allocated_ = true;
+ } else {
+ value_.string_ = other.value_.string_;
+ allocated_ = false;
+ }
+ break;
+ case arrayValue:
+ case objectValue:
+ value_.map_ = new ObjectValues(*other.value_.map_);
+ break;
+ default:
+ JSON_ASSERT_UNREACHABLE;
}
if (other.comments_) {
- this->comments_ = new CommentInfo[numberOfCommentPlacement];
+ comments_ = new CommentInfo[numberOfCommentPlacement];
for (int comment = 0; comment < numberOfCommentPlacement; ++comment) {
const CommentInfo& otherComment = other.comments_[comment];
if (otherComment.comment_)
- this->comments_[comment].setComment(otherComment.comment_,
- strlen(otherComment.comment_));
+ comments_[comment].setComment(
+ otherComment.comment_, strlen(otherComment.comment_));
}
}
}
#if JSON_HAS_RVALUE_REFERENCES
// Move constructor
-Value::Value(Value&& other)
-{
- this->initBasic(nullValue);
- this->swap(other);
+Value::Value(Value&& other) {
+ initBasic(nullValue);
+ swap(other);
}
#endif
-Value::~Value()
-{
- switch (this->type_) {
- case nullValue:
- case intValue:
- case uintValue:
- case realValue:
- case booleanValue:
- break;
- case stringValue:
- if (this->allocated_)
- releasePrefixedStringValue(this->value_.string_);
- break;
- case arrayValue:
- case objectValue:
- delete this->value_.map_;
- break;
- default:
- JSON_ASSERT_UNREACHABLE;
+Value::~Value() {
+ switch (type_) {
+ case nullValue:
+ case intValue:
+ case uintValue:
+ case realValue:
+ case booleanValue:
+ break;
+ case stringValue:
+ if (allocated_)
+ releasePrefixedStringValue(value_.string_);
+ break;
+ case arrayValue:
+ case objectValue:
+ delete value_.map_;
+ break;
+ default:
+ JSON_ASSERT_UNREACHABLE;
}
- delete[] this->comments_;
+ delete[] comments_;
- this->value_.uint_ = 0;
+ value_.uint_ = 0;
}
-Value& Value::operator=(Value other)
-{
- this->swap(other);
+Value& Value::operator=(Value other) {
+ swap(other);
return *this;
}
-void Value::swapPayload(Value& other)
-{
- ValueType temp = this->type_;
- this->type_ = other.type_;
+void Value::swapPayload(Value& other) {
+ ValueType temp = type_;
+ type_ = other.type_;
other.type_ = temp;
- std::swap(this->value_, other.value_);
- int temp2 = this->allocated_;
- this->allocated_ = other.allocated_;
+ std::swap(value_, other.value_);
+ int temp2 = allocated_;
+ allocated_ = other.allocated_;
other.allocated_ = temp2 & 0x1;
}
-void Value::copyPayload(const Value& other)
-{
- this->type_ = other.type_;
- this->value_ = other.value_;
- this->allocated_ = other.allocated_;
+void Value::copyPayload(const Value& other) {
+ type_ = other.type_;
+ value_ = other.value_;
+ allocated_ = other.allocated_;
}
-void Value::swap(Value& other)
-{
- this->swapPayload(other);
- std::swap(this->comments_, other.comments_);
- std::swap(this->start_, other.start_);
- std::swap(this->limit_, other.limit_);
+void Value::swap(Value& other) {
+ swapPayload(other);
+ std::swap(comments_, other.comments_);
+ std::swap(start_, other.start_);
+ std::swap(limit_, other.limit_);
}
-void Value::copy(const Value& other)
-{
- this->copyPayload(other);
- this->comments_ = other.comments_;
- this->start_ = other.start_;
- this->limit_ = other.limit_;
+void Value::copy(const Value& other) {
+ copyPayload(other);
+ comments_ = other.comments_;
+ start_ = other.start_;
+ limit_ = other.limit_;
}
-ValueType Value::type() const
-{
- return this->type_;
-}
+ValueType Value::type() const { return type_; }
-int Value::compare(const Value& other) const
-{
+int Value::compare(const Value& other) const {
if (*this < other)
return -1;
if (*this > other)
@@ -649,568 +563,509 @@ int Value::compare(const Value& other) const
return 0;
}
-bool Value::operator<(const Value& other) const
-{
- int typeDelta = this->type_ - other.type_;
+bool Value::operator<(const Value& other) const {
+ int typeDelta = type_ - other.type_;
if (typeDelta)
return typeDelta < 0 ? true : false;
- switch (this->type_) {
- case nullValue:
- return false;
- case intValue:
- return this->value_.int_ < other.value_.int_;
- case uintValue:
- return this->value_.uint_ < other.value_.uint_;
- case realValue:
- return this->value_.real_ < other.value_.real_;
- case booleanValue:
- return this->value_.bool_ < other.value_.bool_;
- case stringValue: {
- if ((this->value_.string_ == 0) || (other.value_.string_ == 0)) {
- if (other.value_.string_)
- return true;
- else
- return false;
- }
- unsigned this_len;
- unsigned other_len;
- char const* this_str;
- char const* other_str;
- decodePrefixedString(this->allocated_, this->value_.string_, &this_len,
- &this_str);
- decodePrefixedString(other.allocated_, other.value_.string_, &other_len,
- &other_str);
- unsigned min_len = std::min<unsigned>(this_len, other_len);
- JSON_ASSERT(this_str && other_str);
- int comp = memcmp(this_str, other_str, min_len);
- if (comp < 0)
- return true;
- if (comp > 0)
- return false;
- return (this_len < other_len);
- }
- case arrayValue:
- case objectValue: {
- int delta = int(this->value_.map_->size() - other.value_.map_->size());
- if (delta)
- return delta < 0;
- return (*this->value_.map_) < (*other.value_.map_);
+ switch (type_) {
+ case nullValue:
+ return false;
+ case intValue:
+ return value_.int_ < other.value_.int_;
+ case uintValue:
+ return value_.uint_ < other.value_.uint_;
+ case realValue:
+ return value_.real_ < other.value_.real_;
+ case booleanValue:
+ return value_.bool_ < other.value_.bool_;
+ case stringValue:
+ {
+ if ((value_.string_ == 0) || (other.value_.string_ == 0)) {
+ if (other.value_.string_) return true;
+ else return false;
}
- default:
- JSON_ASSERT_UNREACHABLE;
+ unsigned this_len;
+ unsigned other_len;
+ char const* this_str;
+ char const* other_str;
+ decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str);
+ decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str);
+ unsigned min_len = std::min<unsigned>(this_len, other_len);
+ JSON_ASSERT(this_str && other_str);
+ int comp = memcmp(this_str, other_str, min_len);
+ if (comp < 0) return true;
+ if (comp > 0) return false;
+ return (this_len < other_len);
+ }
+ case arrayValue:
+ case objectValue: {
+ int delta = int(value_.map_->size() - other.value_.map_->size());
+ if (delta)
+ return delta < 0;
+ return (*value_.map_) < (*other.value_.map_);
+ }
+ default:
+ JSON_ASSERT_UNREACHABLE;
}
return false; // unreachable
}
-bool Value::operator<=(const Value& other) const
-{
- return !(other < *this);
-}
+bool Value::operator<=(const Value& other) const { return !(other < *this); }
-bool Value::operator>=(const Value& other) const
-{
- return !(*this < other);
-}
+bool Value::operator>=(const Value& other) const { return !(*this < other); }
-bool Value::operator>(const Value& other) const
-{
- return other < *this;
-}
+bool Value::operator>(const Value& other) const { return other < *this; }
-bool Value::operator==(const Value& other) const
-{
+bool Value::operator==(const Value& other) const {
// if ( type_ != other.type_ )
// GCC 2.95.3 says:
// attempt to take address of bit-field structure member `Json::Value::type_'
// Beats me, but a temp solves the problem.
int temp = other.type_;
- if (this->type_ != temp)
+ if (type_ != temp)
return false;
- switch (this->type_) {
- case nullValue:
- return true;
- case intValue:
- return this->value_.int_ == other.value_.int_;
- case uintValue:
- return this->value_.uint_ == other.value_.uint_;
- case realValue:
- return this->value_.real_ == other.value_.real_;
- case booleanValue:
- return this->value_.bool_ == other.value_.bool_;
- case stringValue: {
- if ((this->value_.string_ == 0) || (other.value_.string_ == 0)) {
- return (this->value_.string_ == other.value_.string_);
- }
- unsigned this_len;
- unsigned other_len;
- char const* this_str;
- char const* other_str;
- decodePrefixedString(this->allocated_, this->value_.string_, &this_len,
- &this_str);
- decodePrefixedString(other.allocated_, other.value_.string_, &other_len,
- &other_str);
- if (this_len != other_len)
- return false;
- JSON_ASSERT(this_str && other_str);
- int comp = memcmp(this_str, other_str, this_len);
- return comp == 0;
+ switch (type_) {
+ case nullValue:
+ return true;
+ case intValue:
+ return value_.int_ == other.value_.int_;
+ case uintValue:
+ return value_.uint_ == other.value_.uint_;
+ case realValue:
+ return value_.real_ == other.value_.real_;
+ case booleanValue:
+ return value_.bool_ == other.value_.bool_;
+ case stringValue:
+ {
+ if ((value_.string_ == 0) || (other.value_.string_ == 0)) {
+ return (value_.string_ == other.value_.string_);
}
- case arrayValue:
- case objectValue:
- return this->value_.map_->size() == other.value_.map_->size() &&
- (*this->value_.map_) == (*other.value_.map_);
- default:
- JSON_ASSERT_UNREACHABLE;
+ unsigned this_len;
+ unsigned other_len;
+ char const* this_str;
+ char const* other_str;
+ decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str);
+ decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str);
+ if (this_len != other_len) return false;
+ JSON_ASSERT(this_str && other_str);
+ int comp = memcmp(this_str, other_str, this_len);
+ return comp == 0;
+ }
+ case arrayValue:
+ case objectValue:
+ return value_.map_->size() == other.value_.map_->size() &&
+ (*value_.map_) == (*other.value_.map_);
+ default:
+ JSON_ASSERT_UNREACHABLE;
}
return false; // unreachable
}
-bool Value::operator!=(const Value& other) const
-{
- return !(*this == other);
-}
+bool Value::operator!=(const Value& other) const { return !(*this == other); }
-const char* Value::asCString() const
-{
+const char* Value::asCString() const {
JSON_ASSERT_MESSAGE(type_ == stringValue,
"in Json::Value::asCString(): requires stringValue");
- if (this->value_.string_ == 0)
- return 0;
+ if (value_.string_ == 0) return 0;
unsigned this_len;
char const* this_str;
- decodePrefixedString(this->allocated_, this->value_.string_, &this_len,
- &this_str);
+ decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str);
return this_str;
}
#if JSONCPP_USING_SECURE_MEMORY
-unsigned Value::getCStringLength() const
-{
+unsigned Value::getCStringLength() const {
JSON_ASSERT_MESSAGE(type_ == stringValue,
- "in Json::Value::asCString(): requires stringValue");
- if (value_.string_ == 0)
- return 0;
+ "in Json::Value::asCString(): requires stringValue");
+ if (value_.string_ == 0) return 0;
unsigned this_len;
char const* this_str;
- decodePrefixedString(this->allocated_, this->value_.string_, &this_len,
- &this_str);
+ decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str);
return this_len;
}
#endif
-bool Value::getString(char const** str, char const** cend) const
-{
- if (this->type_ != stringValue)
- return false;
- if (this->value_.string_ == 0)
- return false;
+bool Value::getString(char const** str, char const** cend) const {
+ if (type_ != stringValue) return false;
+ if (value_.string_ == 0) return false;
unsigned length;
decodePrefixedString(this->allocated_, this->value_.string_, &length, str);
*cend = *str + length;
return true;
}
-JSONCPP_STRING Value::asString() const
-{
- switch (this->type_) {
- case nullValue:
- return "";
- case stringValue: {
- if (this->value_.string_ == 0)
- return "";
- unsigned this_len;
- char const* this_str;
- decodePrefixedString(this->allocated_, this->value_.string_, &this_len,
- &this_str);
- return JSONCPP_STRING(this_str, this_len);
- }
- case booleanValue:
- return this->value_.bool_ ? "true" : "false";
- case intValue:
- return valueToString(this->value_.int_);
- case uintValue:
- return valueToString(this->value_.uint_);
- case realValue:
- return valueToString(this->value_.real_);
- default:
- JSON_FAIL_MESSAGE("Type is not convertible to string");
+JSONCPP_STRING Value::asString() const {
+ switch (type_) {
+ case nullValue:
+ return "";
+ case stringValue:
+ {
+ if (value_.string_ == 0) return "";
+ unsigned this_len;
+ char const* this_str;
+ decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str);
+ return JSONCPP_STRING(this_str, this_len);
+ }
+ case booleanValue:
+ return value_.bool_ ? "true" : "false";
+ case intValue:
+ return valueToString(value_.int_);
+ case uintValue:
+ return valueToString(value_.uint_);
+ case realValue:
+ return valueToString(value_.real_);
+ default:
+ JSON_FAIL_MESSAGE("Type is not convertible to string");
}
}
#ifdef JSON_USE_CPPTL
-CppTL::ConstString Value::asConstString() const
-{
+CppTL::ConstString Value::asConstString() const {
unsigned len;
char const* str;
- decodePrefixedString(allocated_, value_.string_, &len, &str);
+ decodePrefixedString(allocated_, value_.string_,
+ &len, &str);
return CppTL::ConstString(str, len);
}
#endif
-Value::Int Value::asInt() const
-{
- switch (this->type_) {
- case intValue:
- JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range");
- return Int(this->value_.int_);
- case uintValue:
- JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range");
- return Int(this->value_.uint_);
- case realValue:
- JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt),
- "double out of Int range");
- return Int(this->value_.real_);
- case nullValue:
- return 0;
- case booleanValue:
- return this->value_.bool_ ? 1 : 0;
- default:
- break;
+Value::Int Value::asInt() const {
+ switch (type_) {
+ case intValue:
+ JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range");
+ return Int(value_.int_);
+ case uintValue:
+ JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range");
+ return Int(value_.uint_);
+ case realValue:
+ JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt),
+ "double out of Int range");
+ return Int(value_.real_);
+ case nullValue:
+ return 0;
+ case booleanValue:
+ return value_.bool_ ? 1 : 0;
+ default:
+ break;
}
JSON_FAIL_MESSAGE("Value is not convertible to Int.");
}
-Value::UInt Value::asUInt() const
-{
- switch (this->type_) {
- case intValue:
- JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range");
- return UInt(this->value_.int_);
- case uintValue:
- JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range");
- return UInt(this->value_.uint_);
- case realValue:
- JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt),
- "double out of UInt range");
- return UInt(this->value_.real_);
- case nullValue:
- return 0;
- case booleanValue:
- return this->value_.bool_ ? 1 : 0;
- default:
- break;
+Value::UInt Value::asUInt() const {
+ switch (type_) {
+ case intValue:
+ JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range");
+ return UInt(value_.int_);
+ case uintValue:
+ JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range");
+ return UInt(value_.uint_);
+ case realValue:
+ JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt),
+ "double out of UInt range");
+ return UInt(value_.real_);
+ case nullValue:
+ return 0;
+ case booleanValue:
+ return value_.bool_ ? 1 : 0;
+ default:
+ break;
}
JSON_FAIL_MESSAGE("Value is not convertible to UInt.");
}
#if defined(JSON_HAS_INT64)
-Value::Int64 Value::asInt64() const
-{
- switch (this->type_) {
- case intValue:
- return Int64(this->value_.int_);
- case uintValue:
- JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range");
- return Int64(this->value_.uint_);
- case realValue:
- JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64),
- "double out of Int64 range");
- return Int64(this->value_.real_);
- case nullValue:
- return 0;
- case booleanValue:
- return this->value_.bool_ ? 1 : 0;
- default:
- break;
+Value::Int64 Value::asInt64() const {
+ switch (type_) {
+ case intValue:
+ return Int64(value_.int_);
+ case uintValue:
+ JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range");
+ return Int64(value_.uint_);
+ case realValue:
+ JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64),
+ "double out of Int64 range");
+ return Int64(value_.real_);
+ case nullValue:
+ return 0;
+ case booleanValue:
+ return value_.bool_ ? 1 : 0;
+ default:
+ break;
}
JSON_FAIL_MESSAGE("Value is not convertible to Int64.");
}
-Value::UInt64 Value::asUInt64() const
-{
- switch (this->type_) {
- case intValue:
- JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range");
- return UInt64(this->value_.int_);
- case uintValue:
- return UInt64(this->value_.uint_);
- case realValue:
- JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64),
- "double out of UInt64 range");
- return UInt64(this->value_.real_);
- case nullValue:
- return 0;
- case booleanValue:
- return this->value_.bool_ ? 1 : 0;
- default:
- break;
+Value::UInt64 Value::asUInt64() const {
+ switch (type_) {
+ case intValue:
+ JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range");
+ return UInt64(value_.int_);
+ case uintValue:
+ return UInt64(value_.uint_);
+ case realValue:
+ JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64),
+ "double out of UInt64 range");
+ return UInt64(value_.real_);
+ case nullValue:
+ return 0;
+ case booleanValue:
+ return value_.bool_ ? 1 : 0;
+ default:
+ break;
}
JSON_FAIL_MESSAGE("Value is not convertible to UInt64.");
}
#endif // if defined(JSON_HAS_INT64)
-LargestInt Value::asLargestInt() const
-{
+LargestInt Value::asLargestInt() const {
#if defined(JSON_NO_INT64)
return asInt();
#else
- return this->asInt64();
+ return asInt64();
#endif
}
-LargestUInt Value::asLargestUInt() const
-{
+LargestUInt Value::asLargestUInt() const {
#if defined(JSON_NO_INT64)
return asUInt();
#else
- return this->asUInt64();
+ return asUInt64();
#endif
}
-double Value::asDouble() const
-{
- switch (this->type_) {
- case intValue:
- return static_cast<double>(this->value_.int_);
- case uintValue:
+double Value::asDouble() const {
+ switch (type_) {
+ case intValue:
+ return static_cast<double>(value_.int_);
+ case uintValue:
#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- return static_cast<double>(this->value_.uint_);
+ return static_cast<double>(value_.uint_);
#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- return integerToDouble(value_.uint_);
+ return integerToDouble(value_.uint_);
#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- case realValue:
- return this->value_.real_;
- case nullValue:
- return 0.0;
- case booleanValue:
- return this->value_.bool_ ? 1.0 : 0.0;
- default:
- break;
+ case realValue:
+ return value_.real_;
+ case nullValue:
+ return 0.0;
+ case booleanValue:
+ return value_.bool_ ? 1.0 : 0.0;
+ default:
+ break;
}
JSON_FAIL_MESSAGE("Value is not convertible to double.");
}
-float Value::asFloat() const
-{
- switch (this->type_) {
- case intValue:
- return static_cast<float>(this->value_.int_);
- case uintValue:
+float Value::asFloat() const {
+ switch (type_) {
+ case intValue:
+ return static_cast<float>(value_.int_);
+ case uintValue:
#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- return static_cast<float>(this->value_.uint_);
+ return static_cast<float>(value_.uint_);
#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- // This can fail (silently?) if the value is bigger than MAX_FLOAT.
- return static_cast<float>(integerToDouble(value_.uint_));
+ // This can fail (silently?) if the value is bigger than MAX_FLOAT.
+ return static_cast<float>(integerToDouble(value_.uint_));
#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
- case realValue:
- return static_cast<float>(this->value_.real_);
- case nullValue:
- return 0.0;
- case booleanValue:
- return this->value_.bool_ ? 1.0f : 0.0f;
- default:
- break;
+ case realValue:
+ return static_cast<float>(value_.real_);
+ case nullValue:
+ return 0.0;
+ case booleanValue:
+ return value_.bool_ ? 1.0f : 0.0f;
+ default:
+ break;
}
JSON_FAIL_MESSAGE("Value is not convertible to float.");
}
-bool Value::asBool() const
-{
- switch (this->type_) {
- case booleanValue:
- return this->value_.bool_;
- case nullValue:
- return false;
- case intValue:
- return this->value_.int_ ? true : false;
- case uintValue:
- return this->value_.uint_ ? true : false;
- case realValue:
- // This is kind of strange. Not recommended.
- return (this->value_.real_ != 0.0) ? true : false;
- default:
- break;
+bool Value::asBool() const {
+ switch (type_) {
+ case booleanValue:
+ return value_.bool_;
+ case nullValue:
+ return false;
+ case intValue:
+ return value_.int_ ? true : false;
+ case uintValue:
+ return value_.uint_ ? true : false;
+ case realValue:
+ // This is kind of strange. Not recommended.
+ return (value_.real_ != 0.0) ? true : false;
+ default:
+ break;
}
JSON_FAIL_MESSAGE("Value is not convertible to bool.");
}
-bool Value::isConvertibleTo(ValueType other) const
-{
+bool Value::isConvertibleTo(ValueType other) const {
switch (other) {
- case nullValue:
- return (this->isNumeric() && this->asDouble() == 0.0) ||
- (this->type_ == booleanValue && this->value_.bool_ == false) ||
- (this->type_ == stringValue && this->asString().empty()) ||
- (this->type_ == arrayValue && this->value_.map_->size() == 0) ||
- (this->type_ == objectValue && this->value_.map_->size() == 0) ||
- this->type_ == nullValue;
- case intValue:
- return this->isInt() ||
- (this->type_ == realValue &&
- InRange(this->value_.real_, minInt, maxInt)) ||
- this->type_ == booleanValue || this->type_ == nullValue;
- case uintValue:
- return this->isUInt() ||
- (this->type_ == realValue &&
- InRange(this->value_.real_, 0, maxUInt)) ||
- this->type_ == booleanValue || this->type_ == nullValue;
- case realValue:
- return this->isNumeric() || this->type_ == booleanValue ||
- this->type_ == nullValue;
- case booleanValue:
- return this->isNumeric() || this->type_ == booleanValue ||
- this->type_ == nullValue;
- case stringValue:
- return this->isNumeric() || this->type_ == booleanValue ||
- this->type_ == stringValue || this->type_ == nullValue;
- case arrayValue:
- return this->type_ == arrayValue || this->type_ == nullValue;
- case objectValue:
- return this->type_ == objectValue || this->type_ == nullValue;
+ case nullValue:
+ return (isNumeric() && asDouble() == 0.0) ||
+ (type_ == booleanValue && value_.bool_ == false) ||
+ (type_ == stringValue && asString().empty()) ||
+ (type_ == arrayValue && value_.map_->size() == 0) ||
+ (type_ == objectValue && value_.map_->size() == 0) ||
+ type_ == nullValue;
+ case intValue:
+ return isInt() ||
+ (type_ == realValue && InRange(value_.real_, minInt, maxInt)) ||
+ type_ == booleanValue || type_ == nullValue;
+ case uintValue:
+ return isUInt() ||
+ (type_ == realValue && InRange(value_.real_, 0, maxUInt)) ||
+ type_ == booleanValue || type_ == nullValue;
+ case realValue:
+ return isNumeric() || type_ == booleanValue || type_ == nullValue;
+ case booleanValue:
+ return isNumeric() || type_ == booleanValue || type_ == nullValue;
+ case stringValue:
+ return isNumeric() || type_ == booleanValue || type_ == stringValue ||
+ type_ == nullValue;
+ case arrayValue:
+ return type_ == arrayValue || type_ == nullValue;
+ case objectValue:
+ return type_ == objectValue || type_ == nullValue;
}
JSON_ASSERT_UNREACHABLE;
return false;
}
/// Number of values in array or object
-ArrayIndex Value::size() const
-{
- switch (this->type_) {
- case nullValue:
- case intValue:
- case uintValue:
- case realValue:
- case booleanValue:
- case stringValue:
- return 0;
- case arrayValue: // size of the array is highest index + 1
- if (!this->value_.map_->empty()) {
- ObjectValues::const_iterator itLast = this->value_.map_->end();
- --itLast;
- return (*itLast).first.index() + 1;
- }
- return 0;
- case objectValue:
- return ArrayIndex(this->value_.map_->size());
+ArrayIndex Value::size() const {
+ switch (type_) {
+ case nullValue:
+ case intValue:
+ case uintValue:
+ case realValue:
+ case booleanValue:
+ case stringValue:
+ return 0;
+ case arrayValue: // size of the array is highest index + 1
+ if (!value_.map_->empty()) {
+ ObjectValues::const_iterator itLast = value_.map_->end();
+ --itLast;
+ return (*itLast).first.index() + 1;
+ }
+ return 0;
+ case objectValue:
+ return ArrayIndex(value_.map_->size());
}
JSON_ASSERT_UNREACHABLE;
return 0; // unreachable;
}
-bool Value::empty() const
-{
- if (this->isNull() || this->isArray() || this->isObject())
- return this->size() == 0u;
+bool Value::empty() const {
+ if (isNull() || isArray() || isObject())
+ return size() == 0u;
else
return false;
}
-bool Value::operator!() const
-{
- return this->isNull();
-}
+bool Value::operator!() const { return isNull(); }
-void Value::clear()
-{
+void Value::clear() {
JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue ||
- type_ == objectValue,
+ type_ == objectValue,
"in Json::Value::clear(): requires complex value");
- this->start_ = 0;
- this->limit_ = 0;
- switch (this->type_) {
- case arrayValue:
- case objectValue:
- this->value_.map_->clear();
- break;
- default:
- break;
+ start_ = 0;
+ limit_ = 0;
+ switch (type_) {
+ case arrayValue:
+ case objectValue:
+ value_.map_->clear();
+ break;
+ default:
+ break;
}
}
-void Value::resize(ArrayIndex newSize)
-{
+void Value::resize(ArrayIndex newSize) {
JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue,
"in Json::Value::resize(): requires arrayValue");
- if (this->type_ == nullValue)
+ if (type_ == nullValue)
*this = Value(arrayValue);
- ArrayIndex oldSize = this->size();
+ ArrayIndex oldSize = size();
if (newSize == 0)
- this->clear();
+ clear();
else if (newSize > oldSize)
(*this)[newSize - 1];
else {
for (ArrayIndex index = newSize; index < oldSize; ++index) {
- this->value_.map_->erase(index);
+ value_.map_->erase(index);
}
JSON_ASSERT(size() == newSize);
}
}
-Value& Value::operator[](ArrayIndex index)
-{
+Value& Value::operator[](ArrayIndex index) {
JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == arrayValue,
- "in Json::Value::operator[](ArrayIndex): requires arrayValue");
- if (this->type_ == nullValue)
+ type_ == nullValue || type_ == arrayValue,
+ "in Json::Value::operator[](ArrayIndex): requires arrayValue");
+ if (type_ == nullValue)
*this = Value(arrayValue);
CZString key(index);
- ObjectValues::iterator it = this->value_.map_->lower_bound(key);
- if (it != this->value_.map_->end() && (*it).first == key)
+ ObjectValues::iterator it = value_.map_->lower_bound(key);
+ if (it != value_.map_->end() && (*it).first == key)
return (*it).second;
ObjectValues::value_type defaultValue(key, nullSingleton());
- it = this->value_.map_->insert(it, defaultValue);
+ it = value_.map_->insert(it, defaultValue);
return (*it).second;
}
-Value& Value::operator[](int index)
-{
+Value& Value::operator[](int index) {
JSON_ASSERT_MESSAGE(
- index >= 0,
- "in Json::Value::operator[](int index): index cannot be negative");
+ index >= 0,
+ "in Json::Value::operator[](int index): index cannot be negative");
return (*this)[ArrayIndex(index)];
}
-const Value& Value::operator[](ArrayIndex index) const
-{
+const Value& Value::operator[](ArrayIndex index) const {
JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == arrayValue,
- "in Json::Value::operator[](ArrayIndex)const: requires arrayValue");
- if (this->type_ == nullValue)
+ type_ == nullValue || type_ == arrayValue,
+ "in Json::Value::operator[](ArrayIndex)const: requires arrayValue");
+ if (type_ == nullValue)
return nullSingleton();
CZString key(index);
- ObjectValues::const_iterator it = this->value_.map_->find(key);
- if (it == this->value_.map_->end())
+ ObjectValues::const_iterator it = value_.map_->find(key);
+ if (it == value_.map_->end())
return nullSingleton();
return (*it).second;
}
-const Value& Value::operator[](int index) const
-{
+const Value& Value::operator[](int index) const {
JSON_ASSERT_MESSAGE(
- index >= 0,
- "in Json::Value::operator[](int index) const: index cannot be negative");
+ index >= 0,
+ "in Json::Value::operator[](int index) const: index cannot be negative");
return (*this)[ArrayIndex(index)];
}
-void Value::initBasic(ValueType vtype, bool allocated)
-{
- this->type_ = vtype;
- this->allocated_ = allocated;
- this->comments_ = 0;
- this->start_ = 0;
- this->limit_ = 0;
+void Value::initBasic(ValueType vtype, bool allocated) {
+ type_ = vtype;
+ allocated_ = allocated;
+ comments_ = 0;
+ start_ = 0;
+ limit_ = 0;
}
// Access an object value by name, create a null member if it does not exist.
// @pre Type of '*this' is object or null.
// @param key is null-terminated.
-Value& Value::resolveReference(const char* key)
-{
+Value& Value::resolveReference(const char* key) {
JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == objectValue,
- "in Json::Value::resolveReference(): requires objectValue");
- if (this->type_ == nullValue)
+ type_ == nullValue || type_ == objectValue,
+ "in Json::Value::resolveReference(): requires objectValue");
+ if (type_ == nullValue)
*this = Value(objectValue);
- CZString actualKey(key, static_cast<unsigned>(strlen(key)),
- CZString::noDuplication); // NOTE!
- ObjectValues::iterator it = this->value_.map_->lower_bound(actualKey);
- if (it != this->value_.map_->end() && (*it).first == actualKey)
+ CZString actualKey(
+ key, static_cast<unsigned>(strlen(key)), CZString::noDuplication); // NOTE!
+ ObjectValues::iterator it = value_.map_->lower_bound(actualKey);
+ if (it != value_.map_->end() && (*it).first == actualKey)
return (*it).second;
ObjectValues::value_type defaultValue(actualKey, nullSingleton());
- it = this->value_.map_->insert(it, defaultValue);
+ it = value_.map_->insert(it, defaultValue);
Value& value = (*it).second;
return value;
}
@@ -1219,223 +1074,198 @@ Value& Value::resolveReference(const char* key)
Value& Value::resolveReference(char const* key, char const* cend)
{
JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == objectValue,
- "in Json::Value::resolveReference(key, end): requires objectValue");
- if (this->type_ == nullValue)
+ type_ == nullValue || type_ == objectValue,
+ "in Json::Value::resolveReference(key, end): requires objectValue");
+ if (type_ == nullValue)
*this = Value(objectValue);
- CZString actualKey(key, static_cast<unsigned>(cend - key),
- CZString::duplicateOnCopy);
- ObjectValues::iterator it = this->value_.map_->lower_bound(actualKey);
- if (it != this->value_.map_->end() && (*it).first == actualKey)
+ CZString actualKey(
+ key, static_cast<unsigned>(cend-key), CZString::duplicateOnCopy);
+ ObjectValues::iterator it = value_.map_->lower_bound(actualKey);
+ if (it != value_.map_->end() && (*it).first == actualKey)
return (*it).second;
ObjectValues::value_type defaultValue(actualKey, nullSingleton());
- it = this->value_.map_->insert(it, defaultValue);
+ it = value_.map_->insert(it, defaultValue);
Value& value = (*it).second;
return value;
}
-Value Value::get(ArrayIndex index, const Value& defaultValue) const
-{
+Value Value::get(ArrayIndex index, const Value& defaultValue) const {
const Value* value = &((*this)[index]);
return value == &nullSingleton() ? defaultValue : *value;
}
-bool Value::isValidIndex(ArrayIndex index) const
-{
- return index < this->size();
-}
+bool Value::isValidIndex(ArrayIndex index) const { return index < size(); }
Value const* Value::find(char const* key, char const* cend) const
{
- JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == objectValue,
- "in Json::Value::find(key, end, found): requires "
- "objectValue or nullValue");
- if (this->type_ == nullValue)
- return NULL;
- CZString actualKey(key, static_cast<unsigned>(cend - key),
- CZString::noDuplication);
- ObjectValues::const_iterator it = this->value_.map_->find(actualKey);
- if (it == this->value_.map_->end())
- return NULL;
+ JSON_ASSERT_MESSAGE(
+ type_ == nullValue || type_ == objectValue,
+ "in Json::Value::find(key, end, found): requires objectValue or nullValue");
+ if (type_ == nullValue) return NULL;
+ CZString actualKey(key, static_cast<unsigned>(cend-key), CZString::noDuplication);
+ ObjectValues::const_iterator it = value_.map_->find(actualKey);
+ if (it == value_.map_->end()) return NULL;
return &(*it).second;
}
const Value& Value::operator[](const char* key) const
{
- Value const* found = this->find(key, key + strlen(key));
- if (!found)
- return nullSingleton();
+ Value const* found = find(key, key + strlen(key));
+ if (!found) return nullSingleton();
return *found;
}
Value const& Value::operator[](JSONCPP_STRING const& key) const
{
- Value const* found = this->find(key.data(), key.data() + key.length());
- if (!found)
- return nullSingleton();
+ Value const* found = find(key.data(), key.data() + key.length());
+ if (!found) return nullSingleton();
return *found;
}
-Value& Value::operator[](const char* key)
-{
- return this->resolveReference(key, key + strlen(key));
+Value& Value::operator[](const char* key) {
+ return resolveReference(key, key + strlen(key));
}
-Value& Value::operator[](const JSONCPP_STRING& key)
-{
- return this->resolveReference(key.data(), key.data() + key.length());
+Value& Value::operator[](const JSONCPP_STRING& key) {
+ return resolveReference(key.data(), key.data() + key.length());
}
-Value& Value::operator[](const StaticString& key)
-{
- return this->resolveReference(key.c_str());
+Value& Value::operator[](const StaticString& key) {
+ return resolveReference(key.c_str());
}
#ifdef JSON_USE_CPPTL
-Value& Value::operator[](const CppTL::ConstString& key)
-{
+Value& Value::operator[](const CppTL::ConstString& key) {
return resolveReference(key.c_str(), key.end_c_str());
}
Value const& Value::operator[](CppTL::ConstString const& key) const
{
Value const* found = find(key.c_str(), key.end_c_str());
- if (!found)
- return nullSingleton();
+ if (!found) return nullSingleton();
return *found;
}
#endif
-Value& Value::append(const Value& value)
-{
- return (*this)[this->size()] = value;
-}
+Value& Value::append(const Value& value) { return (*this)[size()] = value; }
#if JSON_HAS_RVALUE_REFERENCES
-Value& Value::append(Value&& value)
-{
- return (*this)[this->size()] = value;
-}
+ Value& Value::append(Value&& value) { return (*this)[size()] = value; }
#endif
-Value Value::get(char const* key, char const* cend,
- Value const& defaultValue) const
+Value Value::get(char const* key, char const* cend, Value const& defaultValue) const
{
- Value const* found = this->find(key, cend);
+ Value const* found = find(key, cend);
return !found ? defaultValue : *found;
}
Value Value::get(char const* key, Value const& defaultValue) const
{
- return this->get(key, key + strlen(key), defaultValue);
+ return get(key, key + strlen(key), defaultValue);
}
Value Value::get(JSONCPP_STRING const& key, Value const& defaultValue) const
{
- return this->get(key.data(), key.data() + key.length(), defaultValue);
+ return get(key.data(), key.data() + key.length(), defaultValue);
}
+
bool Value::removeMember(const char* key, const char* cend, Value* removed)
{
- if (this->type_ != objectValue) {
+ if (type_ != objectValue) {
return false;
}
- CZString actualKey(key, static_cast<unsigned>(cend - key),
- CZString::noDuplication);
- ObjectValues::iterator it = this->value_.map_->find(actualKey);
- if (it == this->value_.map_->end())
+ CZString actualKey(key, static_cast<unsigned>(cend-key), CZString::noDuplication);
+ ObjectValues::iterator it = value_.map_->find(actualKey);
+ if (it == value_.map_->end())
return false;
*removed = it->second;
- this->value_.map_->erase(it);
+ value_.map_->erase(it);
return true;
}
bool Value::removeMember(const char* key, Value* removed)
{
- return this->removeMember(key, key + strlen(key), removed);
+ return removeMember(key, key + strlen(key), removed);
}
bool Value::removeMember(JSONCPP_STRING const& key, Value* removed)
{
- return this->removeMember(key.data(), key.data() + key.length(), removed);
+ return removeMember(key.data(), key.data() + key.length(), removed);
}
Value Value::removeMember(const char* key)
{
JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == objectValue,
"in Json::Value::removeMember(): requires objectValue");
- if (this->type_ == nullValue)
+ if (type_ == nullValue)
return nullSingleton();
- Value removed; // null
- this->removeMember(key, key + strlen(key), &removed);
+ Value removed; // null
+ removeMember(key, key + strlen(key), &removed);
return removed; // still null if removeMember() did nothing
}
Value Value::removeMember(const JSONCPP_STRING& key)
{
- return this->removeMember(key.c_str());
+ return removeMember(key.c_str());
}
-bool Value::removeIndex(ArrayIndex index, Value* removed)
-{
- if (this->type_ != arrayValue) {
+bool Value::removeIndex(ArrayIndex index, Value* removed) {
+ if (type_ != arrayValue) {
return false;
}
CZString key(index);
- ObjectValues::iterator it = this->value_.map_->find(key);
- if (it == this->value_.map_->end()) {
+ ObjectValues::iterator it = value_.map_->find(key);
+ if (it == value_.map_->end()) {
return false;
}
*removed = it->second;
- ArrayIndex oldSize = this->size();
+ ArrayIndex oldSize = size();
// shift left all items left, into the place of the "removed"
- for (ArrayIndex i = index; i < (oldSize - 1); ++i) {
+ for (ArrayIndex i = index; i < (oldSize - 1); ++i){
CZString keey(i);
- (*this->value_.map_)[keey] = (*this)[i + 1];
+ (*value_.map_)[keey] = (*this)[i + 1];
}
// erase the last one ("leftover")
CZString keyLast(oldSize - 1);
- ObjectValues::iterator itLast = this->value_.map_->find(keyLast);
- this->value_.map_->erase(itLast);
+ ObjectValues::iterator itLast = value_.map_->find(keyLast);
+ value_.map_->erase(itLast);
return true;
}
#ifdef JSON_USE_CPPTL
Value Value::get(const CppTL::ConstString& key,
- const Value& defaultValue) const
-{
+ const Value& defaultValue) const {
return get(key.c_str(), key.end_c_str(), defaultValue);
}
#endif
bool Value::isMember(char const* key, char const* cend) const
{
- Value const* value = this->find(key, cend);
+ Value const* value = find(key, cend);
return NULL != value;
}
bool Value::isMember(char const* key) const
{
- return this->isMember(key, key + strlen(key));
+ return isMember(key, key + strlen(key));
}
bool Value::isMember(JSONCPP_STRING const& key) const
{
- return this->isMember(key.data(), key.data() + key.length());
+ return isMember(key.data(), key.data() + key.length());
}
#ifdef JSON_USE_CPPTL
-bool Value::isMember(const CppTL::ConstString& key) const
-{
+bool Value::isMember(const CppTL::ConstString& key) const {
return isMember(key.c_str(), key.end_c_str());
}
#endif
-Value::Members Value::getMemberNames() const
-{
+Value::Members Value::getMemberNames() const {
JSON_ASSERT_MESSAGE(
- type_ == nullValue || type_ == objectValue,
- "in Json::Value::getMemberNames(), value must be objectValue");
- if (this->type_ == nullValue)
+ type_ == nullValue || type_ == objectValue,
+ "in Json::Value::getMemberNames(), value must be objectValue");
+ if (type_ == nullValue)
return Value::Members();
Members members;
- members.reserve(this->value_.map_->size());
- ObjectValues::const_iterator it = this->value_.map_->begin();
- ObjectValues::const_iterator itEnd = this->value_.map_->end();
+ members.reserve(value_.map_->size());
+ ObjectValues::const_iterator it = value_.map_->begin();
+ ObjectValues::const_iterator itEnd = value_.map_->end();
for (; it != itEnd; ++it) {
- members.push_back(
- JSONCPP_STRING((*it).first.data(), (*it).first.length()));
+ members.push_back(JSONCPP_STRING((*it).first.data(),
+ (*it).first.length()));
}
return members;
}
@@ -1447,8 +1277,8 @@ Value::Members Value::getMemberNames() const
// if ( type_ == objectValue )
// {
// return CppTL::Enum::any( CppTL::Enum::transform(
-// CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>()
-// ), MemberNamesTransform() ) );
+// CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ),
+// MemberNamesTransform() ) );
// }
// return EnumMemberNames();
//}
@@ -1465,114 +1295,99 @@ Value::Members Value::getMemberNames() const
//
//# endif
-static bool IsIntegral(double d)
-{
+static bool IsIntegral(double d) {
double integral_part;
return modf(d, &integral_part) == 0.0;
}
-bool Value::isNull() const
-{
- return this->type_ == nullValue;
-}
+bool Value::isNull() const { return type_ == nullValue; }
-bool Value::isBool() const
-{
- return this->type_ == booleanValue;
-}
+bool Value::isBool() const { return type_ == booleanValue; }
-bool Value::isInt() const
-{
- switch (this->type_) {
- case intValue:
+bool Value::isInt() const {
+ switch (type_) {
+ case intValue:
#if defined(JSON_HAS_INT64)
- return this->value_.int_ >= minInt && this->value_.int_ <= maxInt;
+ return value_.int_ >= minInt && value_.int_ <= maxInt;
#else
- return true;
+ return true;
#endif
- case uintValue:
- return this->value_.uint_ <= UInt(maxInt);
- case realValue:
- return this->value_.real_ >= minInt && this->value_.real_ <= maxInt &&
- IsIntegral(this->value_.real_);
- default:
- break;
+ case uintValue:
+ return value_.uint_ <= UInt(maxInt);
+ case realValue:
+ return value_.real_ >= minInt && value_.real_ <= maxInt &&
+ IsIntegral(value_.real_);
+ default:
+ break;
}
return false;
}
-bool Value::isUInt() const
-{
- switch (this->type_) {
- case intValue:
+bool Value::isUInt() const {
+ switch (type_) {
+ case intValue:
#if defined(JSON_HAS_INT64)
- return this->value_.int_ >= 0 &&
- LargestUInt(this->value_.int_) <= LargestUInt(maxUInt);
+ return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt);
#else
- return value_.int_ >= 0;
+ return value_.int_ >= 0;
#endif
- case uintValue:
+ case uintValue:
#if defined(JSON_HAS_INT64)
- return this->value_.uint_ <= maxUInt;
+ return value_.uint_ <= maxUInt;
#else
- return true;
+ return true;
#endif
- case realValue:
- return this->value_.real_ >= 0 && this->value_.real_ <= maxUInt &&
- IsIntegral(this->value_.real_);
- default:
- break;
+ case realValue:
+ return value_.real_ >= 0 && value_.real_ <= maxUInt &&
+ IsIntegral(value_.real_);
+ default:
+ break;
}
return false;
}
-bool Value::isInt64() const
-{
+bool Value::isInt64() const {
#if defined(JSON_HAS_INT64)
- switch (this->type_) {
- case intValue:
- return true;
- case uintValue:
- return this->value_.uint_ <= UInt64(maxInt64);
- case realValue:
- // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a
- // double, so double(maxInt64) will be rounded up to 2^63. Therefore we
- // require the value to be strictly less than the limit.
- return this->value_.real_ >= double(minInt64) &&
- this->value_.real_ < double(maxInt64) &&
- IsIntegral(this->value_.real_);
- default:
- break;
+ switch (type_) {
+ case intValue:
+ return true;
+ case uintValue:
+ return value_.uint_ <= UInt64(maxInt64);
+ case realValue:
+ // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a
+ // double, so double(maxInt64) will be rounded up to 2^63. Therefore we
+ // require the value to be strictly less than the limit.
+ return value_.real_ >= double(minInt64) &&
+ value_.real_ < double(maxInt64) && IsIntegral(value_.real_);
+ default:
+ break;
}
#endif // JSON_HAS_INT64
return false;
}
-bool Value::isUInt64() const
-{
+bool Value::isUInt64() const {
#if defined(JSON_HAS_INT64)
- switch (this->type_) {
- case intValue:
- return this->value_.int_ >= 0;
- case uintValue:
- return true;
- case realValue:
- // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a
- // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we
- // require the value to be strictly less than the limit.
- return this->value_.real_ >= 0 &&
- this->value_.real_ < maxUInt64AsDouble &&
- IsIntegral(this->value_.real_);
- default:
- break;
+ switch (type_) {
+ case intValue:
+ return value_.int_ >= 0;
+ case uintValue:
+ return true;
+ case realValue:
+ // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a
+ // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we
+ // require the value to be strictly less than the limit.
+ return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble &&
+ IsIntegral(value_.real_);
+ default:
+ break;
}
#endif // JSON_HAS_INT64
return false;
}
-bool Value::isIntegral() const
-{
- switch (this->type_) {
+bool Value::isIntegral() const {
+ switch (type_) {
case intValue:
case uintValue:
return true;
@@ -1581,12 +1396,9 @@ bool Value::isIntegral() const
// Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a
// double, so double(maxUInt64) will be rounded up to 2^64. Therefore we
// require the value to be strictly less than the limit.
- return this->value_.real_ >= double(minInt64) &&
- this->value_.real_ < maxUInt64AsDouble &&
- IsIntegral(this->value_.real_);
+ return value_.real_ >= double(minInt64) && value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_);
#else
- return value_.real_ >= minInt && value_.real_ <= maxUInt &&
- IsIntegral(value_.real_);
+ return value_.real_ >= minInt && value_.real_ <= maxUInt && IsIntegral(value_.real_);
#endif // JSON_HAS_INT64
default:
break;
@@ -1594,89 +1406,53 @@ bool Value::isIntegral() const
return false;
}
-bool Value::isDouble() const
-{
- return this->type_ == intValue || this->type_ == uintValue ||
- this->type_ == realValue;
-}
+bool Value::isDouble() const { return type_ == intValue || type_ == uintValue || type_ == realValue; }
-bool Value::isNumeric() const
-{
- return this->isDouble();
-}
+bool Value::isNumeric() const { return isDouble(); }
-bool Value::isString() const
-{
- return this->type_ == stringValue;
-}
+bool Value::isString() const { return type_ == stringValue; }
-bool Value::isArray() const
-{
- return this->type_ == arrayValue;
-}
+bool Value::isArray() const { return type_ == arrayValue; }
-bool Value::isObject() const
-{
- return this->type_ == objectValue;
-}
+bool Value::isObject() const { return type_ == objectValue; }
-void Value::setComment(const char* comment, size_t len,
- CommentPlacement placement)
-{
- if (!this->comments_)
- this->comments_ = new CommentInfo[numberOfCommentPlacement];
- if ((len > 0) && (comment[len - 1] == '\n')) {
+void Value::setComment(const char* comment, size_t len, CommentPlacement placement) {
+ if (!comments_)
+ comments_ = new CommentInfo[numberOfCommentPlacement];
+ if ((len > 0) && (comment[len-1] == '\n')) {
// Always discard trailing newline, to aid indentation.
len -= 1;
}
- this->comments_[placement].setComment(comment, len);
+ comments_[placement].setComment(comment, len);
}
-void Value::setComment(const char* comment, CommentPlacement placement)
-{
- this->setComment(comment, strlen(comment), placement);
+void Value::setComment(const char* comment, CommentPlacement placement) {
+ setComment(comment, strlen(comment), placement);
}
-void Value::setComment(const JSONCPP_STRING& comment,
- CommentPlacement placement)
-{
- this->setComment(comment.c_str(), comment.length(), placement);
+void Value::setComment(const JSONCPP_STRING& comment, CommentPlacement placement) {
+ setComment(comment.c_str(), comment.length(), placement);
}
-bool Value::hasComment(CommentPlacement placement) const
-{
- return this->comments_ != 0 && this->comments_[placement].comment_ != 0;
+bool Value::hasComment(CommentPlacement placement) const {
+ return comments_ != 0 && comments_[placement].comment_ != 0;
}
-JSONCPP_STRING Value::getComment(CommentPlacement placement) const
-{
- if (this->hasComment(placement))
- return this->comments_[placement].comment_;
+JSONCPP_STRING Value::getComment(CommentPlacement placement) const {
+ if (hasComment(placement))
+ return comments_[placement].comment_;
return "";
}
-void Value::setOffsetStart(ptrdiff_t start)
-{
- this->start_ = start;
-}
+void Value::setOffsetStart(ptrdiff_t start) { start_ = start; }
-void Value::setOffsetLimit(ptrdiff_t limit)
-{
- this->limit_ = limit;
-}
+void Value::setOffsetLimit(ptrdiff_t limit) { limit_ = limit; }
-ptrdiff_t Value::getOffsetStart() const
-{
- return this->start_;
-}
+ptrdiff_t Value::getOffsetStart() const { return start_; }
-ptrdiff_t Value::getOffsetLimit() const
-{
- return this->limit_;
-}
+ptrdiff_t Value::getOffsetLimit() const { return limit_; }
-JSONCPP_STRING Value::toStyledString() const
-{
+JSONCPP_STRING Value::toStyledString() const {
StreamWriterBuilder builder;
JSONCPP_STRING out = this->hasComment(commentBefore) ? "\n" : "";
@@ -1686,58 +1462,54 @@ JSONCPP_STRING Value::toStyledString() const
return out;
}
-Value::const_iterator Value::begin() const
-{
- switch (this->type_) {
- case arrayValue:
- case objectValue:
- if (this->value_.map_)
- return const_iterator(this->value_.map_->begin());
- break;
- default:
- break;
+Value::const_iterator Value::begin() const {
+ switch (type_) {
+ case arrayValue:
+ case objectValue:
+ if (value_.map_)
+ return const_iterator(value_.map_->begin());
+ break;
+ default:
+ break;
}
return const_iterator();
}
-Value::const_iterator Value::end() const
-{
- switch (this->type_) {
- case arrayValue:
- case objectValue:
- if (this->value_.map_)
- return const_iterator(this->value_.map_->end());
- break;
- default:
- break;
+Value::const_iterator Value::end() const {
+ switch (type_) {
+ case arrayValue:
+ case objectValue:
+ if (value_.map_)
+ return const_iterator(value_.map_->end());
+ break;
+ default:
+ break;
}
return const_iterator();
}
-Value::iterator Value::begin()
-{
- switch (this->type_) {
- case arrayValue:
- case objectValue:
- if (this->value_.map_)
- return iterator(this->value_.map_->begin());
- break;
- default:
- break;
+Value::iterator Value::begin() {
+ switch (type_) {
+ case arrayValue:
+ case objectValue:
+ if (value_.map_)
+ return iterator(value_.map_->begin());
+ break;
+ default:
+ break;
}
return iterator();
}
-Value::iterator Value::end()
-{
- switch (this->type_) {
- case arrayValue:
- case objectValue:
- if (this->value_.map_)
- return iterator(this->value_.map_->end());
- break;
- default:
- break;
+Value::iterator Value::end() {
+ switch (type_) {
+ case arrayValue:
+ case objectValue:
+ if (value_.map_)
+ return iterator(value_.map_->end());
+ break;
+ default:
+ break;
}
return iterator();
}
@@ -1745,41 +1517,26 @@ Value::iterator Value::end()
// class PathArgument
// //////////////////////////////////////////////////////////////////
-PathArgument::PathArgument()
- : key_()
- , index_()
- , kind_(kindNone)
-{
-}
+PathArgument::PathArgument() : key_(), index_(), kind_(kindNone) {}
PathArgument::PathArgument(ArrayIndex index)
- : key_()
- , index_(index)
- , kind_(kindIndex)
-{
-}
+ : key_(), index_(index), kind_(kindIndex) {}
PathArgument::PathArgument(const char* key)
- : key_(key)
- , index_()
- , kind_(kindKey)
-{
-}
+ : key_(key), index_(), kind_(kindKey) {}
PathArgument::PathArgument(const JSONCPP_STRING& key)
- : key_(key.c_str())
- , index_()
- , kind_(kindKey)
-{
-}
+ : key_(key.c_str()), index_(), kind_(kindKey) {}
// class Path
// //////////////////////////////////////////////////////////////////
-Path::Path(const JSONCPP_STRING& path, const PathArgument& a1,
- const PathArgument& a2, const PathArgument& a3,
- const PathArgument& a4, const PathArgument& a5)
-{
+Path::Path(const JSONCPP_STRING& path,
+ const PathArgument& a1,
+ const PathArgument& a2,
+ const PathArgument& a3,
+ const PathArgument& a4,
+ const PathArgument& a5) {
InArgs in;
in.reserve(5);
in.push_back(&a1);
@@ -1787,11 +1544,10 @@ Path::Path(const JSONCPP_STRING& path, const PathArgument& a1,
in.push_back(&a3);
in.push_back(&a4);
in.push_back(&a5);
- this->makePath(path, in);
+ makePath(path, in);
}
-void Path::makePath(const JSONCPP_STRING& path, const InArgs& in)
-{
+void Path::makePath(const JSONCPP_STRING& path, const InArgs& in) {
const char* current = path.c_str();
const char* end = current + path.length();
InArgs::const_iterator itInArg = in.begin();
@@ -1799,17 +1555,17 @@ void Path::makePath(const JSONCPP_STRING& path, const InArgs& in)
if (*current == '[') {
++current;
if (*current == '%')
- this->addPathInArg(path, in, itInArg, PathArgument::kindIndex);
+ addPathInArg(path, in, itInArg, PathArgument::kindIndex);
else {
ArrayIndex index = 0;
for (; current != end && *current >= '0' && *current <= '9'; ++current)
index = index * 10 + ArrayIndex(*current - '0');
- this->args_.push_back(index);
+ args_.push_back(index);
}
if (current == end || *++current != ']')
- this->invalidPath(path, int(current - path.c_str()));
+ invalidPath(path, int(current - path.c_str()));
} else if (*current == '%') {
- this->addPathInArg(path, in, itInArg, PathArgument::kindKey);
+ addPathInArg(path, in, itInArg, PathArgument::kindKey);
++current;
} else if (*current == '.' || *current == ']') {
++current;
@@ -1817,34 +1573,31 @@ void Path::makePath(const JSONCPP_STRING& path, const InArgs& in)
const char* beginName = current;
while (current != end && !strchr("[.", *current))
++current;
- this->args_.push_back(JSONCPP_STRING(beginName, current));
+ args_.push_back(JSONCPP_STRING(beginName, current));
}
}
}
-void Path::addPathInArg(const JSONCPP_STRING& /*path*/, const InArgs& in,
+void Path::addPathInArg(const JSONCPP_STRING& /*path*/,
+ const InArgs& in,
InArgs::const_iterator& itInArg,
- PathArgument::Kind kind)
-{
+ PathArgument::Kind kind) {
if (itInArg == in.end()) {
// Error: missing argument %d
} else if ((*itInArg)->kind_ != kind) {
// Error: bad argument type
} else {
- this->args_.push_back(**itInArg++);
+ args_.push_back(**itInArg++);
}
}
-void Path::invalidPath(const JSONCPP_STRING& /*path*/, int /*location*/)
-{
+void Path::invalidPath(const JSONCPP_STRING& /*path*/, int /*location*/) {
// Error: invalid path.
}
-const Value& Path::resolve(const Value& root) const
-{
+const Value& Path::resolve(const Value& root) const {
const Value* node = &root;
- for (Args::const_iterator it = this->args_.begin(); it != this->args_.end();
- ++it) {
+ for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) {
const PathArgument& arg = *it;
if (arg.kind_ == PathArgument::kindIndex) {
if (!node->isArray() || !node->isValidIndex(arg.index_)) {
@@ -1868,11 +1621,9 @@ const Value& Path::resolve(const Value& root) const
return *node;
}
-Value Path::resolve(const Value& root, const Value& defaultValue) const
-{
+Value Path::resolve(const Value& root, const Value& defaultValue) const {
const Value* node = &root;
- for (Args::const_iterator it = this->args_.begin(); it != this->args_.end();
- ++it) {
+ for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) {
const PathArgument& arg = *it;
if (arg.kind_ == PathArgument::kindIndex) {
if (!node->isArray() || !node->isValidIndex(arg.index_))
@@ -1889,11 +1640,9 @@ Value Path::resolve(const Value& root, const Value& defaultValue) const
return *node;
}
-Value& Path::make(Value& root) const
-{
+Value& Path::make(Value& root) const {
Value* node = &root;
- for (Args::const_iterator it = this->args_.begin(); it != this->args_.end();
- ++it) {
+ for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) {
const PathArgument& arg = *it;
if (arg.kind_ == PathArgument::kindIndex) {
if (!node->isArray()) {
diff --git a/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp b/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
index 803cfab019..fc86505983 100644
--- a/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
+++ b/Utilities/cmjsoncpp/src/lib_json/json_writer.cpp
@@ -1,115 +1,111 @@
// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors
// Distributed under MIT license, or public domain if desired and
// recognized in your jurisdiction.
-// See file LICENSE for detail or copy at
-// http://jsoncpp.sourceforge.net/LICENSE
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
#if !defined(JSON_IS_AMALGAMATION)
-# include <json/writer.h>
-
-# include "json_tool.h"
+#include <json/writer.h>
+#include "json_tool.h"
#endif // if !defined(JSON_IS_AMALGAMATION)
-#include <cassert>
-#include <cstdio>
-#include <cstring>
#include <iomanip>
#include <memory>
-#include <set>
#include <sstream>
#include <utility>
+#include <set>
+#include <cassert>
+#include <cstring>
+#include <cstdio>
-#if defined(_MSC_VER) && _MSC_VER >= 1200 && \
- _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0
-# include <float.h>
-# define isfinite _finite
-#elif defined(__sun) && defined(__SVR4) // Solaris
-# if !defined(isfinite)
-# include <ieeefp.h>
-# define isfinite finite
-# endif
+#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0
+#include <float.h>
+#define isfinite _finite
+#elif defined(__sun) && defined(__SVR4) //Solaris
+#if !defined(isfinite)
+#include <ieeefp.h>
+#define isfinite finite
+#endif
#elif defined(_AIX)
-# if !defined(isfinite)
-# include <math.h>
-# define isfinite finite
-# endif
+#if !defined(isfinite)
+#include <math.h>
+#define isfinite finite
+#endif
#elif defined(__hpux)
-# if !defined(isfinite) && !defined(__GNUC__)
-# if defined(__ia64) && !defined(finite)
-# define isfinite(x) \
- ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _IsFinite(x)))
-# else
-# include <math.h>
-# define isfinite finite
-# endif
-# endif
+#if !defined(isfinite) && !defined(__GNUC__)
+#if defined(__ia64) && !defined(finite)
+#define isfinite(x) ((sizeof(x) == sizeof(float) ? \
+ _Isfinitef(x) : _IsFinite(x)))
#else
-# include <cmath>
-# if !(defined(__QNXNTO__)) // QNX already defines isfinite
-# define isfinite std::isfinite
-# endif
+#include <math.h>
+#define isfinite finite
+#endif
+#endif
+#else
+#include <cmath>
+#if !(defined(__QNXNTO__)) // QNX already defines isfinite
+#define isfinite std::isfinite
+#endif
#endif
#if defined(_MSC_VER)
-# if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && \
- _MSC_VER >= 1500 // VC++ 9.0 and above
-# define snprintf sprintf_s
-# elif _MSC_VER >= 1900 // VC++ 14.0 and above
-# define snprintf std::snprintf
-# else
-# define snprintf _snprintf
-# endif
+#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above
+#define snprintf sprintf_s
+#elif _MSC_VER >= 1900 // VC++ 14.0 and above
+#define snprintf std::snprintf
+#else
+#define snprintf _snprintf
+#endif
#elif defined(__ANDROID__) || defined(__QNXNTO__)
-# define snprintf snprintf
+#define snprintf snprintf
#elif __cplusplus >= 201103L
-# if !defined(__MINGW32__) && !defined(__CYGWIN__)
-# define snprintf std::snprintf
-# endif
+#if !defined(__MINGW32__) && !defined(__CYGWIN__)
+#define snprintf std::snprintf
+#endif
#endif
-#if defined(__BORLANDC__)
-# include <float.h>
-# define isfinite _finite
-# define snprintf _snprintf
+#if defined(__BORLANDC__)
+#include <float.h>
+#define isfinite _finite
+#define snprintf _snprintf
#endif
// Solaris
#if defined(__sun)
-# include <ieeefp.h>
-# if !defined(isfinite)
-# define isfinite finite
-# endif
+# include <ieeefp.h>
+# if !defined(isfinite)
+# define isfinite finite
+# endif
#endif
// AIX
#if defined(_AIX)
-# if !defined(isfinite)
-# define isfinite finite
-# endif
+# if !defined(isfinite)
+# define isfinite finite
+# endif
#endif
// HP-UX
#if defined(__hpux)
-# if !defined(isfinite)
-# if defined(__ia64) && !defined(finite) && !defined(__GNUC__)
-# define isfinite(x) \
- ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _Isfinite(x)))
-# else
-# include <math.h>
-# define isfinite finite
-# endif
+# if !defined(isfinite)
+# if defined(__ia64) && !defined(finite) && !defined(__GNUC__)
+# define isfinite(x) ((sizeof(x) == sizeof(float) ? \
+ _Isfinitef(x) : _Isfinite(x)))
+# else
+# include <math.h>
+# define isfinite finite
# endif
+# endif
#endif
// Ancient glibc
#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 2
-# if !defined(isfinite)
-# define isfinite __finite
-# endif
+# if !defined(isfinite)
+# define isfinite __finite
+# endif
#endif
#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0
// Disable warning about strdup being deprecated.
-# pragma warning(disable : 4996)
+#pragma warning(disable : 4996)
#endif
namespace Json {
@@ -117,11 +113,10 @@ namespace Json {
#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520)
typedef std::unique_ptr<StreamWriter> StreamWriterPtr;
#else
-typedef std::auto_ptr<StreamWriter> StreamWriterPtr;
+typedef std::auto_ptr<StreamWriter> StreamWriterPtr;
#endif
-static bool containsControlCharacter(const char* str)
-{
+static bool containsControlCharacter(const char* str) {
while (*str) {
if (isControlCharacter(*(str++)))
return true;
@@ -129,19 +124,17 @@ static bool containsControlCharacter(const char* str)
return false;
}
-static bool containsControlCharacter0(const char* str, unsigned len)
-{
+static bool containsControlCharacter0(const char* str, unsigned len) {
char const* end = str + len;
while (end != str) {
- if (isControlCharacter(*str) || 0 == *str)
+ if (isControlCharacter(*str) || 0==*str)
return true;
++str;
}
return false;
}
-JSONCPP_STRING valueToString(LargestInt value)
-{
+JSONCPP_STRING valueToString(LargestInt value) {
UIntToStringBuffer buffer;
char* current = buffer + sizeof(buffer);
if (value == Value::minLargestInt) {
@@ -157,8 +150,7 @@ JSONCPP_STRING valueToString(LargestInt value)
return current;
}
-JSONCPP_STRING valueToString(LargestUInt value)
-{
+JSONCPP_STRING valueToString(LargestUInt value) {
UIntToStringBuffer buffer;
char* current = buffer + sizeof(buffer);
uintToString(value, current);
@@ -168,22 +160,18 @@ JSONCPP_STRING valueToString(LargestUInt value)
#if defined(JSON_HAS_INT64)
-JSONCPP_STRING valueToString(Int value)
-{
+JSONCPP_STRING valueToString(Int value) {
return valueToString(LargestInt(value));
}
-JSONCPP_STRING valueToString(UInt value)
-{
+JSONCPP_STRING valueToString(UInt value) {
return valueToString(LargestUInt(value));
}
#endif // # if defined(JSON_HAS_INT64)
namespace {
-JSONCPP_STRING valueToString(double value, bool useSpecialFloats,
- unsigned int precision)
-{
+JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int precision) {
// Allocate a buffer that is more than large enough to store the 16 digits of
// precision requested below.
char buffer[36];
@@ -199,8 +187,7 @@ JSONCPP_STRING valueToString(double value, bool useSpecialFloats,
len = snprintf(buffer, sizeof(buffer), formatString, value);
fixNumericLocale(buffer, buffer + len);
- // try to ensure we preserve the fact that this was given to us as a double
- // on input
+ // try to ensure we preserve the fact that this was given to us as a double on input
if (!strchr(buffer, '.') && !strchr(buffer, 'e')) {
strcat(buffer, ".0");
}
@@ -208,14 +195,11 @@ JSONCPP_STRING valueToString(double value, bool useSpecialFloats,
} else {
// IEEE standard states that NaN values will not compare to themselves
if (value != value) {
- len =
- snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null");
+ len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null");
} else if (value < 0) {
- len = snprintf(buffer, sizeof(buffer),
- useSpecialFloats ? "-Infinity" : "-1e+9999");
+ len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "-Infinity" : "-1e+9999");
} else {
- len = snprintf(buffer, sizeof(buffer),
- useSpecialFloats ? "Infinity" : "1e+9999");
+ len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "Infinity" : "1e+9999");
}
}
assert(len >= 0);
@@ -223,18 +207,11 @@ JSONCPP_STRING valueToString(double value, bool useSpecialFloats,
}
}
-JSONCPP_STRING valueToString(double value)
-{
- return valueToString(value, false, 17);
-}
+JSONCPP_STRING valueToString(double value) { return valueToString(value, false, 17); }
-JSONCPP_STRING valueToString(bool value)
-{
- return value ? "true" : "false";
-}
+JSONCPP_STRING valueToString(bool value) { return value ? "true" : "false"; }
-JSONCPP_STRING valueToQuotedString(const char* value)
-{
+JSONCPP_STRING valueToQuotedString(const char* value) {
if (value == NULL)
return "";
// Not sure how to handle unicode...
@@ -245,50 +222,51 @@ JSONCPP_STRING valueToQuotedString(const char* value)
// Appending to JSONCPP_STRING is not efficient, but this should be rare.
// (Note: forward slashes are *not* rare, but I am not escaping them.)
JSONCPP_STRING::size_type maxsize =
- strlen(value) * 2 + 3; // allescaped+quotes+NULL
+ strlen(value) * 2 + 3; // allescaped+quotes+NULL
JSONCPP_STRING result;
result.reserve(maxsize); // to avoid lots of mallocs
result += "\"";
for (const char* c = value; *c != 0; ++c) {
switch (*c) {
- case '\"':
- result += "\\\"";
- break;
- case '\\':
- result += "\\\\";
- break;
- case '\b':
- result += "\\b";
- break;
- case '\f':
- result += "\\f";
- break;
- case '\n':
- result += "\\n";
- break;
- case '\r':
- result += "\\r";
- break;
- case '\t':
- result += "\\t";
- break;
- // case '/':
- // Even though \/ is considered a legal escape in JSON, a bare
- // slash is also legal, so I see no reason to escape it.
- // (I hope I am not misunderstanding something.
- // blep notes: actually escaping \/ may be useful in javascript to avoid
- // </ sequence. Should add a flag to allow this compatibility mode and
- // prevent this sequence from occurring.
- default:
- if (isControlCharacter(*c)) {
- JSONCPP_OSTRINGSTREAM oss;
- oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
- << std::setw(4) << static_cast<int>(*c);
- result += oss.str();
- } else {
- result += *c;
- }
- break;
+ case '\"':
+ result += "\\\"";
+ break;
+ case '\\':
+ result += "\\\\";
+ break;
+ case '\b':
+ result += "\\b";
+ break;
+ case '\f':
+ result += "\\f";
+ break;
+ case '\n':
+ result += "\\n";
+ break;
+ case '\r':
+ result += "\\r";
+ break;
+ case '\t':
+ result += "\\t";
+ break;
+ // case '/':
+ // Even though \/ is considered a legal escape in JSON, a bare
+ // slash is also legal, so I see no reason to escape it.
+ // (I hope I am not misunderstanding something.
+ // blep notes: actually escaping \/ may be useful in javascript to avoid </
+ // sequence.
+ // Should add a flag to allow this compatibility mode and prevent this
+ // sequence from occurring.
+ default:
+ if (isControlCharacter(*c)) {
+ JSONCPP_OSTRINGSTREAM oss;
+ oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
+ << std::setw(4) << static_cast<int>(*c);
+ result += oss.str();
+ } else {
+ result += *c;
+ }
+ break;
}
}
result += "\"";
@@ -296,8 +274,7 @@ JSONCPP_STRING valueToQuotedString(const char* value)
}
// https://github.com/upcaste/upcaste/blob/master/src/upcore/src/cstring/strnpbrk.cpp
-static char const* strnpbrk(char const* s, char const* accept, size_t n)
-{
+static char const* strnpbrk(char const* s, char const* accept, size_t n) {
assert((s || !n) && accept);
char const* const end = s + n;
@@ -311,8 +288,7 @@ static char const* strnpbrk(char const* s, char const* accept, size_t n)
}
return NULL;
}
-static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length)
-{
+static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length) {
if (value == NULL)
return "";
// Not sure how to handle unicode...
@@ -322,51 +298,53 @@ static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length)
// We have to walk value and escape any special characters.
// Appending to JSONCPP_STRING is not efficient, but this should be rare.
// (Note: forward slashes are *not* rare, but I am not escaping them.)
- JSONCPP_STRING::size_type maxsize = length * 2 + 3; // allescaped+quotes+NULL
+ JSONCPP_STRING::size_type maxsize =
+ length * 2 + 3; // allescaped+quotes+NULL
JSONCPP_STRING result;
result.reserve(maxsize); // to avoid lots of mallocs
result += "\"";
char const* end = value + length;
for (const char* c = value; c != end; ++c) {
switch (*c) {
- case '\"':
- result += "\\\"";
- break;
- case '\\':
- result += "\\\\";
- break;
- case '\b':
- result += "\\b";
- break;
- case '\f':
- result += "\\f";
- break;
- case '\n':
- result += "\\n";
- break;
- case '\r':
- result += "\\r";
- break;
- case '\t':
- result += "\\t";
- break;
- // case '/':
- // Even though \/ is considered a legal escape in JSON, a bare
- // slash is also legal, so I see no reason to escape it.
- // (I hope I am not misunderstanding something.)
- // blep notes: actually escaping \/ may be useful in javascript to avoid
- // </ sequence. Should add a flag to allow this compatibility mode and
- // prevent this sequence from occurring.
- default:
- if ((isControlCharacter(*c)) || (*c == 0)) {
- JSONCPP_OSTRINGSTREAM oss;
- oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
- << std::setw(4) << static_cast<int>(*c);
- result += oss.str();
- } else {
- result += *c;
- }
- break;
+ case '\"':
+ result += "\\\"";
+ break;
+ case '\\':
+ result += "\\\\";
+ break;
+ case '\b':
+ result += "\\b";
+ break;
+ case '\f':
+ result += "\\f";
+ break;
+ case '\n':
+ result += "\\n";
+ break;
+ case '\r':
+ result += "\\r";
+ break;
+ case '\t':
+ result += "\\t";
+ break;
+ // case '/':
+ // Even though \/ is considered a legal escape in JSON, a bare
+ // slash is also legal, so I see no reason to escape it.
+ // (I hope I am not misunderstanding something.)
+ // blep notes: actually escaping \/ may be useful in javascript to avoid </
+ // sequence.
+ // Should add a flag to allow this compatibility mode and prevent this
+ // sequence from occurring.
+ default:
+ if ((isControlCharacter(*c)) || (*c == 0)) {
+ JSONCPP_OSTRINGSTREAM oss;
+ oss << "\\u" << std::hex << std::uppercase << std::setfill('0')
+ << std::setw(4) << static_cast<int>(*c);
+ result += oss.str();
+ } else {
+ result += *c;
+ }
+ break;
}
}
result += "\"";
@@ -375,98 +353,80 @@ static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length)
// Class Writer
// //////////////////////////////////////////////////////////////////
-Writer::~Writer()
-{
-}
+Writer::~Writer() {}
// Class FastWriter
// //////////////////////////////////////////////////////////////////
FastWriter::FastWriter()
- : yamlCompatiblityEnabled_(false)
- , dropNullPlaceholders_(false)
- , omitEndingLineFeed_(false)
-{
-}
+ : yamlCompatiblityEnabled_(false), dropNullPlaceholders_(false),
+ omitEndingLineFeed_(false) {}
-void FastWriter::enableYAMLCompatibility()
-{
- this->yamlCompatiblityEnabled_ = true;
-}
+void FastWriter::enableYAMLCompatibility() { yamlCompatiblityEnabled_ = true; }
-void FastWriter::dropNullPlaceholders()
-{
- this->dropNullPlaceholders_ = true;
-}
+void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; }
-void FastWriter::omitEndingLineFeed()
-{
- this->omitEndingLineFeed_ = true;
-}
+void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; }
-JSONCPP_STRING FastWriter::write(const Value& root)
-{
- this->document_.clear();
- this->writeValue(root);
- if (!this->omitEndingLineFeed_)
- this->document_ += "\n";
- return this->document_;
+JSONCPP_STRING FastWriter::write(const Value& root) {
+ document_.clear();
+ writeValue(root);
+ if (!omitEndingLineFeed_)
+ document_ += "\n";
+ return document_;
}
-void FastWriter::writeValue(const Value& value)
-{
+void FastWriter::writeValue(const Value& value) {
switch (value.type()) {
- case nullValue:
- if (!this->dropNullPlaceholders_)
- this->document_ += "null";
- break;
- case intValue:
- this->document_ += valueToString(value.asLargestInt());
- break;
- case uintValue:
- this->document_ += valueToString(value.asLargestUInt());
- break;
- case realValue:
- this->document_ += valueToString(value.asDouble());
- break;
- case stringValue: {
- // Is NULL possible for value.string_? No.
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok)
- this->document_ +=
- valueToQuotedStringN(str, static_cast<unsigned>(end - str));
- break;
+ case nullValue:
+ if (!dropNullPlaceholders_)
+ document_ += "null";
+ break;
+ case intValue:
+ document_ += valueToString(value.asLargestInt());
+ break;
+ case uintValue:
+ document_ += valueToString(value.asLargestUInt());
+ break;
+ case realValue:
+ document_ += valueToString(value.asDouble());
+ break;
+ case stringValue:
+ {
+ // Is NULL possible for value.string_? No.
+ char const* str;
+ char const* end;
+ bool ok = value.getString(&str, &end);
+ if (ok) document_ += valueToQuotedStringN(str, static_cast<unsigned>(end-str));
+ break;
+ }
+ case booleanValue:
+ document_ += valueToString(value.asBool());
+ break;
+ case arrayValue: {
+ document_ += '[';
+ ArrayIndex size = value.size();
+ for (ArrayIndex index = 0; index < size; ++index) {
+ if (index > 0)
+ document_ += ',';
+ writeValue(value[index]);
}
- case booleanValue:
- this->document_ += valueToString(value.asBool());
- break;
- case arrayValue: {
- this->document_ += '[';
- ArrayIndex size = value.size();
- for (ArrayIndex index = 0; index < size; ++index) {
- if (index > 0)
- this->document_ += ',';
- this->writeValue(value[index]);
- }
- this->document_ += ']';
- } break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- this->document_ += '{';
- for (Value::Members::iterator it = members.begin(); it != members.end();
- ++it) {
- const JSONCPP_STRING& name = *it;
- if (it != members.begin())
- this->document_ += ',';
- this->document_ += valueToQuotedStringN(
- name.data(), static_cast<unsigned>(name.length()));
- this->document_ += this->yamlCompatiblityEnabled_ ? ": " : ":";
- this->writeValue(value[name]);
- }
- this->document_ += '}';
- } break;
+ document_ += ']';
+ } break;
+ case objectValue: {
+ Value::Members members(value.getMemberNames());
+ document_ += '{';
+ for (Value::Members::iterator it = members.begin(); it != members.end();
+ ++it) {
+ const JSONCPP_STRING& name = *it;
+ if (it != members.begin())
+ document_ += ',';
+ document_ += valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length()));
+ document_ += yamlCompatiblityEnabled_ ? ": " : ":";
+ writeValue(value[name]);
+ }
+ document_ += '}';
+ } break;
}
}
@@ -474,498 +434,454 @@ void FastWriter::writeValue(const Value& value)
// //////////////////////////////////////////////////////////////////
StyledWriter::StyledWriter()
- : rightMargin_(74)
- , indentSize_(3)
- , addChildValues_()
-{
-}
+ : rightMargin_(74), indentSize_(3), addChildValues_() {}
-JSONCPP_STRING StyledWriter::write(const Value& root)
-{
- this->document_.clear();
- this->addChildValues_ = false;
- this->indentString_.clear();
- this->writeCommentBeforeValue(root);
- this->writeValue(root);
- this->writeCommentAfterValueOnSameLine(root);
- this->document_ += "\n";
- return this->document_;
+JSONCPP_STRING StyledWriter::write(const Value& root) {
+ document_.clear();
+ addChildValues_ = false;
+ indentString_.clear();
+ writeCommentBeforeValue(root);
+ writeValue(root);
+ writeCommentAfterValueOnSameLine(root);
+ document_ += "\n";
+ return document_;
}
-void StyledWriter::writeValue(const Value& value)
-{
+void StyledWriter::writeValue(const Value& value) {
switch (value.type()) {
- case nullValue:
- this->pushValue("null");
- break;
- case intValue:
- this->pushValue(valueToString(value.asLargestInt()));
- break;
- case uintValue:
- this->pushValue(valueToString(value.asLargestUInt()));
- break;
- case realValue:
- this->pushValue(valueToString(value.asDouble()));
- break;
- case stringValue: {
- // Is NULL possible for value.string_? No.
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok)
- this->pushValue(
- valueToQuotedStringN(str, static_cast<unsigned>(end - str)));
- else
- this->pushValue("");
- break;
- }
- case booleanValue:
- this->pushValue(valueToString(value.asBool()));
- break;
- case arrayValue:
- this->writeArrayValue(value);
- break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- if (members.empty())
- this->pushValue("{}");
- else {
- this->writeWithIndent("{");
- this->indent();
- Value::Members::iterator it = members.begin();
- for (;;) {
- const JSONCPP_STRING& name = *it;
- const Value& childValue = value[name];
- this->writeCommentBeforeValue(childValue);
- this->writeWithIndent(valueToQuotedString(name.c_str()));
- this->document_ += " : ";
- this->writeValue(childValue);
- if (++it == members.end()) {
- this->writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- this->document_ += ',';
- this->writeCommentAfterValueOnSameLine(childValue);
+ case nullValue:
+ pushValue("null");
+ break;
+ case intValue:
+ pushValue(valueToString(value.asLargestInt()));
+ break;
+ case uintValue:
+ pushValue(valueToString(value.asLargestUInt()));
+ break;
+ case realValue:
+ pushValue(valueToString(value.asDouble()));
+ break;
+ case stringValue:
+ {
+ // Is NULL possible for value.string_? No.
+ char const* str;
+ char const* end;
+ bool ok = value.getString(&str, &end);
+ if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str)));
+ else pushValue("");
+ break;
+ }
+ case booleanValue:
+ pushValue(valueToString(value.asBool()));
+ break;
+ case arrayValue:
+ writeArrayValue(value);
+ break;
+ case objectValue: {
+ Value::Members members(value.getMemberNames());
+ if (members.empty())
+ pushValue("{}");
+ else {
+ writeWithIndent("{");
+ indent();
+ Value::Members::iterator it = members.begin();
+ for (;;) {
+ const JSONCPP_STRING& name = *it;
+ const Value& childValue = value[name];
+ writeCommentBeforeValue(childValue);
+ writeWithIndent(valueToQuotedString(name.c_str()));
+ document_ += " : ";
+ writeValue(childValue);
+ if (++it == members.end()) {
+ writeCommentAfterValueOnSameLine(childValue);
+ break;
}
- this->unindent();
- this->writeWithIndent("}");
+ document_ += ',';
+ writeCommentAfterValueOnSameLine(childValue);
}
- } break;
+ unindent();
+ writeWithIndent("}");
+ }
+ } break;
}
}
-void StyledWriter::writeArrayValue(const Value& value)
-{
+void StyledWriter::writeArrayValue(const Value& value) {
unsigned size = value.size();
if (size == 0)
- this->pushValue("[]");
+ pushValue("[]");
else {
- bool isArrayMultiLine = this->isMultineArray(value);
+ bool isArrayMultiLine = isMultineArray(value);
if (isArrayMultiLine) {
- this->writeWithIndent("[");
- this->indent();
- bool hasChildValue = !this->childValues_.empty();
+ writeWithIndent("[");
+ indent();
+ bool hasChildValue = !childValues_.empty();
unsigned index = 0;
for (;;) {
const Value& childValue = value[index];
- this->writeCommentBeforeValue(childValue);
+ writeCommentBeforeValue(childValue);
if (hasChildValue)
- this->writeWithIndent(this->childValues_[index]);
+ writeWithIndent(childValues_[index]);
else {
- this->writeIndent();
- this->writeValue(childValue);
+ writeIndent();
+ writeValue(childValue);
}
if (++index == size) {
- this->writeCommentAfterValueOnSameLine(childValue);
+ writeCommentAfterValueOnSameLine(childValue);
break;
}
- this->document_ += ',';
- this->writeCommentAfterValueOnSameLine(childValue);
+ document_ += ',';
+ writeCommentAfterValueOnSameLine(childValue);
}
- this->unindent();
- this->writeWithIndent("]");
+ unindent();
+ writeWithIndent("]");
} else // output on a single line
{
- assert(this->childValues_.size() == size);
- this->document_ += "[ ";
+ assert(childValues_.size() == size);
+ document_ += "[ ";
for (unsigned index = 0; index < size; ++index) {
if (index > 0)
- this->document_ += ", ";
- this->document_ += this->childValues_[index];
+ document_ += ", ";
+ document_ += childValues_[index];
}
- this->document_ += " ]";
+ document_ += " ]";
}
}
}
-bool StyledWriter::isMultineArray(const Value& value)
-{
+bool StyledWriter::isMultineArray(const Value& value) {
ArrayIndex const size = value.size();
- bool isMultiLine = size * 3 >= this->rightMargin_;
- this->childValues_.clear();
+ bool isMultiLine = size * 3 >= rightMargin_;
+ childValues_.clear();
for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) {
const Value& childValue = value[index];
isMultiLine = ((childValue.isArray() || childValue.isObject()) &&
- childValue.size() > 0);
+ childValue.size() > 0);
}
if (!isMultiLine) // check if line length > max line length
{
- this->childValues_.reserve(size);
- this->addChildValues_ = true;
+ childValues_.reserve(size);
+ addChildValues_ = true;
ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]'
for (ArrayIndex index = 0; index < size; ++index) {
- if (this->hasCommentForValue(value[index])) {
+ if (hasCommentForValue(value[index])) {
isMultiLine = true;
}
- this->writeValue(value[index]);
- lineLength +=
- static_cast<ArrayIndex>(this->childValues_[index].length());
+ writeValue(value[index]);
+ lineLength += static_cast<ArrayIndex>(childValues_[index].length());
}
- this->addChildValues_ = false;
- isMultiLine = isMultiLine || lineLength >= this->rightMargin_;
+ addChildValues_ = false;
+ isMultiLine = isMultiLine || lineLength >= rightMargin_;
}
return isMultiLine;
}
-void StyledWriter::pushValue(const JSONCPP_STRING& value)
-{
- if (this->addChildValues_)
- this->childValues_.push_back(value);
+void StyledWriter::pushValue(const JSONCPP_STRING& value) {
+ if (addChildValues_)
+ childValues_.push_back(value);
else
- this->document_ += value;
+ document_ += value;
}
-void StyledWriter::writeIndent()
-{
- if (!this->document_.empty()) {
- char last = this->document_[this->document_.length() - 1];
+void StyledWriter::writeIndent() {
+ if (!document_.empty()) {
+ char last = document_[document_.length() - 1];
if (last == ' ') // already indented
return;
if (last != '\n') // Comments may add new-line
- this->document_ += '\n';
+ document_ += '\n';
}
- this->document_ += this->indentString_;
+ document_ += indentString_;
}
-void StyledWriter::writeWithIndent(const JSONCPP_STRING& value)
-{
- this->writeIndent();
- this->document_ += value;
+void StyledWriter::writeWithIndent(const JSONCPP_STRING& value) {
+ writeIndent();
+ document_ += value;
}
-void StyledWriter::indent()
-{
- this->indentString_ += JSONCPP_STRING(this->indentSize_, ' ');
-}
+void StyledWriter::indent() { indentString_ += JSONCPP_STRING(indentSize_, ' '); }
-void StyledWriter::unindent()
-{
- assert(this->indentString_.size() >= this->indentSize_);
- this->indentString_.resize(this->indentString_.size() - this->indentSize_);
+void StyledWriter::unindent() {
+ assert(indentString_.size() >= indentSize_);
+ indentString_.resize(indentString_.size() - indentSize_);
}
-void StyledWriter::writeCommentBeforeValue(const Value& root)
-{
+void StyledWriter::writeCommentBeforeValue(const Value& root) {
if (!root.hasComment(commentBefore))
return;
- this->document_ += "\n";
- this->writeIndent();
+ document_ += "\n";
+ writeIndent();
const JSONCPP_STRING& comment = root.getComment(commentBefore);
JSONCPP_STRING::const_iterator iter = comment.begin();
while (iter != comment.end()) {
- this->document_ += *iter;
- if (*iter == '\n' && (iter != comment.end() && *(iter + 1) == '/'))
- this->writeIndent();
+ document_ += *iter;
+ if (*iter == '\n' &&
+ (iter != comment.end() && *(iter + 1) == '/'))
+ writeIndent();
++iter;
}
// Comments are stripped of trailing newlines, so add one here
- this->document_ += "\n";
+ document_ += "\n";
}
-void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root)
-{
+void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) {
if (root.hasComment(commentAfterOnSameLine))
- this->document_ += " " + root.getComment(commentAfterOnSameLine);
+ document_ += " " + root.getComment(commentAfterOnSameLine);
if (root.hasComment(commentAfter)) {
- this->document_ += "\n";
- this->document_ += root.getComment(commentAfter);
- this->document_ += "\n";
+ document_ += "\n";
+ document_ += root.getComment(commentAfter);
+ document_ += "\n";
}
}
-bool StyledWriter::hasCommentForValue(const Value& value)
-{
+bool StyledWriter::hasCommentForValue(const Value& value) {
return value.hasComment(commentBefore) ||
- value.hasComment(commentAfterOnSameLine) || value.hasComment(commentAfter);
+ value.hasComment(commentAfterOnSameLine) ||
+ value.hasComment(commentAfter);
}
// Class StyledStreamWriter
// //////////////////////////////////////////////////////////////////
StyledStreamWriter::StyledStreamWriter(JSONCPP_STRING indentation)
- : document_(NULL)
- , rightMargin_(74)
- , indentation_(indentation)
- , addChildValues_()
-{
-}
-
-void StyledStreamWriter::write(JSONCPP_OSTREAM& out, const Value& root)
-{
- this->document_ = &out;
- this->addChildValues_ = false;
- this->indentString_.clear();
- this->indented_ = true;
- this->writeCommentBeforeValue(root);
- if (!this->indented_)
- this->writeIndent();
- this->indented_ = true;
- this->writeValue(root);
- this->writeCommentAfterValueOnSameLine(root);
- *this->document_ << "\n";
- this->document_ = NULL; // Forget the stream, for safety.
-}
-
-void StyledStreamWriter::writeValue(const Value& value)
-{
+ : document_(NULL), rightMargin_(74), indentation_(indentation),
+ addChildValues_() {}
+
+void StyledStreamWriter::write(JSONCPP_OSTREAM& out, const Value& root) {
+ document_ = &out;
+ addChildValues_ = false;
+ indentString_.clear();
+ indented_ = true;
+ writeCommentBeforeValue(root);
+ if (!indented_) writeIndent();
+ indented_ = true;
+ writeValue(root);
+ writeCommentAfterValueOnSameLine(root);
+ *document_ << "\n";
+ document_ = NULL; // Forget the stream, for safety.
+}
+
+void StyledStreamWriter::writeValue(const Value& value) {
switch (value.type()) {
- case nullValue:
- this->pushValue("null");
- break;
- case intValue:
- this->pushValue(valueToString(value.asLargestInt()));
- break;
- case uintValue:
- this->pushValue(valueToString(value.asLargestUInt()));
- break;
- case realValue:
- this->pushValue(valueToString(value.asDouble()));
- break;
- case stringValue: {
- // Is NULL possible for value.string_? No.
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok)
- this->pushValue(
- valueToQuotedStringN(str, static_cast<unsigned>(end - str)));
- else
- this->pushValue("");
- break;
- }
- case booleanValue:
- this->pushValue(valueToString(value.asBool()));
- break;
- case arrayValue:
- this->writeArrayValue(value);
- break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- if (members.empty())
- this->pushValue("{}");
- else {
- this->writeWithIndent("{");
- this->indent();
- Value::Members::iterator it = members.begin();
- for (;;) {
- const JSONCPP_STRING& name = *it;
- const Value& childValue = value[name];
- this->writeCommentBeforeValue(childValue);
- this->writeWithIndent(valueToQuotedString(name.c_str()));
- *this->document_ << " : ";
- this->writeValue(childValue);
- if (++it == members.end()) {
- this->writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- *this->document_ << ",";
- this->writeCommentAfterValueOnSameLine(childValue);
+ case nullValue:
+ pushValue("null");
+ break;
+ case intValue:
+ pushValue(valueToString(value.asLargestInt()));
+ break;
+ case uintValue:
+ pushValue(valueToString(value.asLargestUInt()));
+ break;
+ case realValue:
+ pushValue(valueToString(value.asDouble()));
+ break;
+ case stringValue:
+ {
+ // Is NULL possible for value.string_? No.
+ char const* str;
+ char const* end;
+ bool ok = value.getString(&str, &end);
+ if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str)));
+ else pushValue("");
+ break;
+ }
+ case booleanValue:
+ pushValue(valueToString(value.asBool()));
+ break;
+ case arrayValue:
+ writeArrayValue(value);
+ break;
+ case objectValue: {
+ Value::Members members(value.getMemberNames());
+ if (members.empty())
+ pushValue("{}");
+ else {
+ writeWithIndent("{");
+ indent();
+ Value::Members::iterator it = members.begin();
+ for (;;) {
+ const JSONCPP_STRING& name = *it;
+ const Value& childValue = value[name];
+ writeCommentBeforeValue(childValue);
+ writeWithIndent(valueToQuotedString(name.c_str()));
+ *document_ << " : ";
+ writeValue(childValue);
+ if (++it == members.end()) {
+ writeCommentAfterValueOnSameLine(childValue);
+ break;
}
- this->unindent();
- this->writeWithIndent("}");
+ *document_ << ",";
+ writeCommentAfterValueOnSameLine(childValue);
}
- } break;
+ unindent();
+ writeWithIndent("}");
+ }
+ } break;
}
}
-void StyledStreamWriter::writeArrayValue(const Value& value)
-{
+void StyledStreamWriter::writeArrayValue(const Value& value) {
unsigned size = value.size();
if (size == 0)
- this->pushValue("[]");
+ pushValue("[]");
else {
- bool isArrayMultiLine = this->isMultineArray(value);
+ bool isArrayMultiLine = isMultineArray(value);
if (isArrayMultiLine) {
- this->writeWithIndent("[");
- this->indent();
- bool hasChildValue = !this->childValues_.empty();
+ writeWithIndent("[");
+ indent();
+ bool hasChildValue = !childValues_.empty();
unsigned index = 0;
for (;;) {
const Value& childValue = value[index];
- this->writeCommentBeforeValue(childValue);
+ writeCommentBeforeValue(childValue);
if (hasChildValue)
- this->writeWithIndent(this->childValues_[index]);
+ writeWithIndent(childValues_[index]);
else {
- if (!this->indented_)
- this->writeIndent();
- this->indented_ = true;
- this->writeValue(childValue);
- this->indented_ = false;
+ if (!indented_) writeIndent();
+ indented_ = true;
+ writeValue(childValue);
+ indented_ = false;
}
if (++index == size) {
- this->writeCommentAfterValueOnSameLine(childValue);
+ writeCommentAfterValueOnSameLine(childValue);
break;
}
- *this->document_ << ",";
- this->writeCommentAfterValueOnSameLine(childValue);
+ *document_ << ",";
+ writeCommentAfterValueOnSameLine(childValue);
}
- this->unindent();
- this->writeWithIndent("]");
+ unindent();
+ writeWithIndent("]");
} else // output on a single line
{
- assert(this->childValues_.size() == size);
- *this->document_ << "[ ";
+ assert(childValues_.size() == size);
+ *document_ << "[ ";
for (unsigned index = 0; index < size; ++index) {
if (index > 0)
- *this->document_ << ", ";
- *this->document_ << this->childValues_[index];
+ *document_ << ", ";
+ *document_ << childValues_[index];
}
- *this->document_ << " ]";
+ *document_ << " ]";
}
}
}
-bool StyledStreamWriter::isMultineArray(const Value& value)
-{
+bool StyledStreamWriter::isMultineArray(const Value& value) {
ArrayIndex const size = value.size();
- bool isMultiLine = size * 3 >= this->rightMargin_;
- this->childValues_.clear();
+ bool isMultiLine = size * 3 >= rightMargin_;
+ childValues_.clear();
for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) {
const Value& childValue = value[index];
isMultiLine = ((childValue.isArray() || childValue.isObject()) &&
- childValue.size() > 0);
+ childValue.size() > 0);
}
if (!isMultiLine) // check if line length > max line length
{
- this->childValues_.reserve(size);
- this->addChildValues_ = true;
+ childValues_.reserve(size);
+ addChildValues_ = true;
ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]'
for (ArrayIndex index = 0; index < size; ++index) {
- if (this->hasCommentForValue(value[index])) {
+ if (hasCommentForValue(value[index])) {
isMultiLine = true;
}
- this->writeValue(value[index]);
- lineLength +=
- static_cast<ArrayIndex>(this->childValues_[index].length());
+ writeValue(value[index]);
+ lineLength += static_cast<ArrayIndex>(childValues_[index].length());
}
- this->addChildValues_ = false;
- isMultiLine = isMultiLine || lineLength >= this->rightMargin_;
+ addChildValues_ = false;
+ isMultiLine = isMultiLine || lineLength >= rightMargin_;
}
return isMultiLine;
}
-void StyledStreamWriter::pushValue(const JSONCPP_STRING& value)
-{
- if (this->addChildValues_)
- this->childValues_.push_back(value);
+void StyledStreamWriter::pushValue(const JSONCPP_STRING& value) {
+ if (addChildValues_)
+ childValues_.push_back(value);
else
- *this->document_ << value;
+ *document_ << value;
}
-void StyledStreamWriter::writeIndent()
-{
+void StyledStreamWriter::writeIndent() {
// blep intended this to look at the so-far-written string
// to determine whether we are already indented, but
// with a stream we cannot do that. So we rely on some saved state.
// The caller checks indented_.
- *this->document_ << '\n' << this->indentString_;
+ *document_ << '\n' << indentString_;
}
-void StyledStreamWriter::writeWithIndent(const JSONCPP_STRING& value)
-{
- if (!this->indented_)
- this->writeIndent();
- *this->document_ << value;
- this->indented_ = false;
+void StyledStreamWriter::writeWithIndent(const JSONCPP_STRING& value) {
+ if (!indented_) writeIndent();
+ *document_ << value;
+ indented_ = false;
}
-void StyledStreamWriter::indent()
-{
- this->indentString_ += this->indentation_;
-}
+void StyledStreamWriter::indent() { indentString_ += indentation_; }
-void StyledStreamWriter::unindent()
-{
- assert(this->indentString_.size() >= this->indentation_.size());
- this->indentString_.resize(this->indentString_.size() -
- this->indentation_.size());
+void StyledStreamWriter::unindent() {
+ assert(indentString_.size() >= indentation_.size());
+ indentString_.resize(indentString_.size() - indentation_.size());
}
-void StyledStreamWriter::writeCommentBeforeValue(const Value& root)
-{
+void StyledStreamWriter::writeCommentBeforeValue(const Value& root) {
if (!root.hasComment(commentBefore))
return;
- if (!this->indented_)
- this->writeIndent();
+ if (!indented_) writeIndent();
const JSONCPP_STRING& comment = root.getComment(commentBefore);
JSONCPP_STRING::const_iterator iter = comment.begin();
while (iter != comment.end()) {
- *this->document_ << *iter;
- if (*iter == '\n' && (iter != comment.end() && *(iter + 1) == '/'))
+ *document_ << *iter;
+ if (*iter == '\n' &&
+ (iter != comment.end() && *(iter + 1) == '/'))
// writeIndent(); // would include newline
- *this->document_ << this->indentString_;
+ *document_ << indentString_;
++iter;
}
- this->indented_ = false;
+ indented_ = false;
}
-void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root)
-{
+void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) {
if (root.hasComment(commentAfterOnSameLine))
- *this->document_ << ' ' << root.getComment(commentAfterOnSameLine);
+ *document_ << ' ' << root.getComment(commentAfterOnSameLine);
if (root.hasComment(commentAfter)) {
- this->writeIndent();
- *this->document_ << root.getComment(commentAfter);
+ writeIndent();
+ *document_ << root.getComment(commentAfter);
}
- this->indented_ = false;
+ indented_ = false;
}
-bool StyledStreamWriter::hasCommentForValue(const Value& value)
-{
+bool StyledStreamWriter::hasCommentForValue(const Value& value) {
return value.hasComment(commentBefore) ||
- value.hasComment(commentAfterOnSameLine) || value.hasComment(commentAfter);
+ value.hasComment(commentAfterOnSameLine) ||
+ value.hasComment(commentAfter);
}
//////////////////////////
// BuiltStyledStreamWriter
/// Scoped enums are not available until C++11.
-struct CommentStyle
-{
+struct CommentStyle {
/// Decide whether to write comments.
- enum Enum
- {
- None, ///< Drop all comments.
- Most, ///< Recover odd behavior of previous versions (not implemented yet).
- All ///< Keep all comments.
+ enum Enum {
+ None, ///< Drop all comments.
+ Most, ///< Recover odd behavior of previous versions (not implemented yet).
+ All ///< Keep all comments.
};
};
struct BuiltStyledStreamWriter : public StreamWriter
{
- BuiltStyledStreamWriter(JSONCPP_STRING const& indentation,
- CommentStyle::Enum cs,
- JSONCPP_STRING const& colonSymbol,
- JSONCPP_STRING const& nullSymbol,
- JSONCPP_STRING const& endingLineFeedSymbol,
- bool useSpecialFloats, unsigned int precision);
+ BuiltStyledStreamWriter(
+ JSONCPP_STRING const& indentation,
+ CommentStyle::Enum cs,
+ JSONCPP_STRING const& colonSymbol,
+ JSONCPP_STRING const& nullSymbol,
+ JSONCPP_STRING const& endingLineFeedSymbol,
+ bool useSpecialFloats,
+ unsigned int precision);
int write(Value const& root, JSONCPP_OSTREAM* sout) JSONCPP_OVERRIDE;
-
private:
void writeValue(Value const& value);
void writeArrayValue(Value const& value);
@@ -995,10 +911,13 @@ private:
unsigned int precision_;
};
BuiltStyledStreamWriter::BuiltStyledStreamWriter(
- JSONCPP_STRING const& indentation, CommentStyle::Enum cs,
- JSONCPP_STRING const& colonSymbol, JSONCPP_STRING const& nullSymbol,
- JSONCPP_STRING const& endingLineFeedSymbol, bool useSpecialFloats,
- unsigned int precision)
+ JSONCPP_STRING const& indentation,
+ CommentStyle::Enum cs,
+ JSONCPP_STRING const& colonSymbol,
+ JSONCPP_STRING const& nullSymbol,
+ JSONCPP_STRING const& endingLineFeedSymbol,
+ bool useSpecialFloats,
+ unsigned int precision)
: rightMargin_(74)
, indentation_(indentation)
, cs_(cs)
@@ -1013,276 +932,247 @@ BuiltStyledStreamWriter::BuiltStyledStreamWriter(
}
int BuiltStyledStreamWriter::write(Value const& root, JSONCPP_OSTREAM* sout)
{
- this->sout_ = sout;
- this->addChildValues_ = false;
- this->indented_ = true;
- this->indentString_.clear();
- this->writeCommentBeforeValue(root);
- if (!this->indented_)
- this->writeIndent();
- this->indented_ = true;
- this->writeValue(root);
- this->writeCommentAfterValueOnSameLine(root);
- *this->sout_ << this->endingLineFeedSymbol_;
- this->sout_ = NULL;
+ sout_ = sout;
+ addChildValues_ = false;
+ indented_ = true;
+ indentString_.clear();
+ writeCommentBeforeValue(root);
+ if (!indented_) writeIndent();
+ indented_ = true;
+ writeValue(root);
+ writeCommentAfterValueOnSameLine(root);
+ *sout_ << endingLineFeedSymbol_;
+ sout_ = NULL;
return 0;
}
-void BuiltStyledStreamWriter::writeValue(Value const& value)
-{
+void BuiltStyledStreamWriter::writeValue(Value const& value) {
switch (value.type()) {
- case nullValue:
- this->pushValue(this->nullSymbol_);
- break;
- case intValue:
- this->pushValue(valueToString(value.asLargestInt()));
- break;
- case uintValue:
- this->pushValue(valueToString(value.asLargestUInt()));
- break;
- case realValue:
- this->pushValue(valueToString(value.asDouble(), this->useSpecialFloats_,
- this->precision_));
- break;
- case stringValue: {
- // Is NULL is possible for value.string_? No.
- char const* str;
- char const* end;
- bool ok = value.getString(&str, &end);
- if (ok)
- this->pushValue(
- valueToQuotedStringN(str, static_cast<unsigned>(end - str)));
- else
- this->pushValue("");
- break;
- }
- case booleanValue:
- this->pushValue(valueToString(value.asBool()));
- break;
- case arrayValue:
- this->writeArrayValue(value);
- break;
- case objectValue: {
- Value::Members members(value.getMemberNames());
- if (members.empty())
- this->pushValue("{}");
- else {
- this->writeWithIndent("{");
- this->indent();
- Value::Members::iterator it = members.begin();
- for (;;) {
- JSONCPP_STRING const& name = *it;
- Value const& childValue = value[name];
- this->writeCommentBeforeValue(childValue);
- this->writeWithIndent(valueToQuotedStringN(
- name.data(), static_cast<unsigned>(name.length())));
- *this->sout_ << this->colonSymbol_;
- this->writeValue(childValue);
- if (++it == members.end()) {
- this->writeCommentAfterValueOnSameLine(childValue);
- break;
- }
- *this->sout_ << ",";
- this->writeCommentAfterValueOnSameLine(childValue);
+ case nullValue:
+ pushValue(nullSymbol_);
+ break;
+ case intValue:
+ pushValue(valueToString(value.asLargestInt()));
+ break;
+ case uintValue:
+ pushValue(valueToString(value.asLargestUInt()));
+ break;
+ case realValue:
+ pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_));
+ break;
+ case stringValue:
+ {
+ // Is NULL is possible for value.string_? No.
+ char const* str;
+ char const* end;
+ bool ok = value.getString(&str, &end);
+ if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str)));
+ else pushValue("");
+ break;
+ }
+ case booleanValue:
+ pushValue(valueToString(value.asBool()));
+ break;
+ case arrayValue:
+ writeArrayValue(value);
+ break;
+ case objectValue: {
+ Value::Members members(value.getMemberNames());
+ if (members.empty())
+ pushValue("{}");
+ else {
+ writeWithIndent("{");
+ indent();
+ Value::Members::iterator it = members.begin();
+ for (;;) {
+ JSONCPP_STRING const& name = *it;
+ Value const& childValue = value[name];
+ writeCommentBeforeValue(childValue);
+ writeWithIndent(valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length())));
+ *sout_ << colonSymbol_;
+ writeValue(childValue);
+ if (++it == members.end()) {
+ writeCommentAfterValueOnSameLine(childValue);
+ break;
}
- this->unindent();
- this->writeWithIndent("}");
+ *sout_ << ",";
+ writeCommentAfterValueOnSameLine(childValue);
}
- } break;
+ unindent();
+ writeWithIndent("}");
+ }
+ } break;
}
}
-void BuiltStyledStreamWriter::writeArrayValue(Value const& value)
-{
+void BuiltStyledStreamWriter::writeArrayValue(Value const& value) {
unsigned size = value.size();
if (size == 0)
- this->pushValue("[]");
+ pushValue("[]");
else {
- bool isMultiLine =
- (this->cs_ == CommentStyle::All) || this->isMultineArray(value);
+ bool isMultiLine = (cs_ == CommentStyle::All) || isMultineArray(value);
if (isMultiLine) {
- this->writeWithIndent("[");
- this->indent();
- bool hasChildValue = !this->childValues_.empty();
+ writeWithIndent("[");
+ indent();
+ bool hasChildValue = !childValues_.empty();
unsigned index = 0;
for (;;) {
Value const& childValue = value[index];
- this->writeCommentBeforeValue(childValue);
+ writeCommentBeforeValue(childValue);
if (hasChildValue)
- this->writeWithIndent(this->childValues_[index]);
+ writeWithIndent(childValues_[index]);
else {
- if (!this->indented_)
- this->writeIndent();
- this->indented_ = true;
- this->writeValue(childValue);
- this->indented_ = false;
+ if (!indented_) writeIndent();
+ indented_ = true;
+ writeValue(childValue);
+ indented_ = false;
}
if (++index == size) {
- this->writeCommentAfterValueOnSameLine(childValue);
+ writeCommentAfterValueOnSameLine(childValue);
break;
}
- *this->sout_ << ",";
- this->writeCommentAfterValueOnSameLine(childValue);
+ *sout_ << ",";
+ writeCommentAfterValueOnSameLine(childValue);
}
- this->unindent();
- this->writeWithIndent("]");
+ unindent();
+ writeWithIndent("]");
} else // output on a single line
{
- assert(this->childValues_.size() == size);
- *this->sout_ << "[";
- if (!this->indentation_.empty())
- *this->sout_ << " ";
+ assert(childValues_.size() == size);
+ *sout_ << "[";
+ if (!indentation_.empty()) *sout_ << " ";
for (unsigned index = 0; index < size; ++index) {
if (index > 0)
- *this->sout_ << ((!this->indentation_.empty()) ? ", " : ",");
- *this->sout_ << this->childValues_[index];
+ *sout_ << ((!indentation_.empty()) ? ", " : ",");
+ *sout_ << childValues_[index];
}
- if (!this->indentation_.empty())
- *this->sout_ << " ";
- *this->sout_ << "]";
+ if (!indentation_.empty()) *sout_ << " ";
+ *sout_ << "]";
}
}
}
-bool BuiltStyledStreamWriter::isMultineArray(Value const& value)
-{
+bool BuiltStyledStreamWriter::isMultineArray(Value const& value) {
ArrayIndex const size = value.size();
- bool isMultiLine = size * 3 >= this->rightMargin_;
- this->childValues_.clear();
+ bool isMultiLine = size * 3 >= rightMargin_;
+ childValues_.clear();
for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) {
Value const& childValue = value[index];
isMultiLine = ((childValue.isArray() || childValue.isObject()) &&
- childValue.size() > 0);
+ childValue.size() > 0);
}
if (!isMultiLine) // check if line length > max line length
{
- this->childValues_.reserve(size);
- this->addChildValues_ = true;
+ childValues_.reserve(size);
+ addChildValues_ = true;
ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]'
for (ArrayIndex index = 0; index < size; ++index) {
if (hasCommentForValue(value[index])) {
isMultiLine = true;
}
- this->writeValue(value[index]);
- lineLength +=
- static_cast<ArrayIndex>(this->childValues_[index].length());
+ writeValue(value[index]);
+ lineLength += static_cast<ArrayIndex>(childValues_[index].length());
}
- this->addChildValues_ = false;
- isMultiLine = isMultiLine || lineLength >= this->rightMargin_;
+ addChildValues_ = false;
+ isMultiLine = isMultiLine || lineLength >= rightMargin_;
}
return isMultiLine;
}
-void BuiltStyledStreamWriter::pushValue(JSONCPP_STRING const& value)
-{
- if (this->addChildValues_)
- this->childValues_.push_back(value);
+void BuiltStyledStreamWriter::pushValue(JSONCPP_STRING const& value) {
+ if (addChildValues_)
+ childValues_.push_back(value);
else
- *this->sout_ << value;
+ *sout_ << value;
}
-void BuiltStyledStreamWriter::writeIndent()
-{
+void BuiltStyledStreamWriter::writeIndent() {
// blep intended this to look at the so-far-written string
// to determine whether we are already indented, but
// with a stream we cannot do that. So we rely on some saved state.
// The caller checks indented_.
- if (!this->indentation_.empty()) {
+ if (!indentation_.empty()) {
// In this case, drop newlines too.
- *this->sout_ << '\n' << this->indentString_;
+ *sout_ << '\n' << indentString_;
}
}
-void BuiltStyledStreamWriter::writeWithIndent(JSONCPP_STRING const& value)
-{
- if (!this->indented_)
- this->writeIndent();
- *this->sout_ << value;
- this->indented_ = false;
+void BuiltStyledStreamWriter::writeWithIndent(JSONCPP_STRING const& value) {
+ if (!indented_) writeIndent();
+ *sout_ << value;
+ indented_ = false;
}
-void BuiltStyledStreamWriter::indent()
-{
- this->indentString_ += this->indentation_;
-}
+void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; }
-void BuiltStyledStreamWriter::unindent()
-{
- assert(this->indentString_.size() >= this->indentation_.size());
- this->indentString_.resize(this->indentString_.size() -
- this->indentation_.size());
+void BuiltStyledStreamWriter::unindent() {
+ assert(indentString_.size() >= indentation_.size());
+ indentString_.resize(indentString_.size() - indentation_.size());
}
-void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root)
-{
- if (this->cs_ == CommentStyle::None)
- return;
+void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) {
+ if (cs_ == CommentStyle::None) return;
if (!root.hasComment(commentBefore))
return;
- if (!this->indented_)
- this->writeIndent();
+ if (!indented_) writeIndent();
const JSONCPP_STRING& comment = root.getComment(commentBefore);
JSONCPP_STRING::const_iterator iter = comment.begin();
while (iter != comment.end()) {
- *this->sout_ << *iter;
- if (*iter == '\n' && (iter != comment.end() && *(iter + 1) == '/'))
+ *sout_ << *iter;
+ if (*iter == '\n' &&
+ (iter != comment.end() && *(iter + 1) == '/'))
// writeIndent(); // would write extra newline
- *this->sout_ << this->indentString_;
+ *sout_ << indentString_;
++iter;
}
- this->indented_ = false;
+ indented_ = false;
}
-void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(
- Value const& root)
-{
- if (this->cs_ == CommentStyle::None)
- return;
+void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(Value const& root) {
+ if (cs_ == CommentStyle::None) return;
if (root.hasComment(commentAfterOnSameLine))
- *this->sout_ << " " + root.getComment(commentAfterOnSameLine);
+ *sout_ << " " + root.getComment(commentAfterOnSameLine);
if (root.hasComment(commentAfter)) {
- this->writeIndent();
- *this->sout_ << root.getComment(commentAfter);
+ writeIndent();
+ *sout_ << root.getComment(commentAfter);
}
}
// static
-bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value)
-{
+bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) {
return value.hasComment(commentBefore) ||
- value.hasComment(commentAfterOnSameLine) || value.hasComment(commentAfter);
+ value.hasComment(commentAfterOnSameLine) ||
+ value.hasComment(commentAfter);
}
///////////////
// StreamWriter
StreamWriter::StreamWriter()
- : sout_(NULL)
+ : sout_(NULL)
{
}
StreamWriter::~StreamWriter()
{
}
StreamWriter::Factory::~Factory()
-{
-}
+{}
StreamWriterBuilder::StreamWriterBuilder()
{
- setDefaults(&this->settings_);
+ setDefaults(&settings_);
}
StreamWriterBuilder::~StreamWriterBuilder()
-{
-}
+{}
StreamWriter* StreamWriterBuilder::newStreamWriter() const
{
- JSONCPP_STRING indentation = this->settings_["indentation"].asString();
- JSONCPP_STRING cs_str = this->settings_["commentStyle"].asString();
- bool eyc = this->settings_["enableYAMLCompatibility"].asBool();
- bool dnp = this->settings_["dropNullPlaceholders"].asBool();
- bool usf = this->settings_["useSpecialFloats"].asBool();
- unsigned int pre = this->settings_["precision"].asUInt();
+ JSONCPP_STRING indentation = settings_["indentation"].asString();
+ JSONCPP_STRING cs_str = settings_["commentStyle"].asString();
+ bool eyc = settings_["enableYAMLCompatibility"].asBool();
+ bool dnp = settings_["dropNullPlaceholders"].asBool();
+ bool usf = settings_["useSpecialFloats"].asBool();
+ unsigned int pre = settings_["precision"].asUInt();
CommentStyle::Enum cs = CommentStyle::All;
if (cs_str == "All") {
cs = CommentStyle::All;
@@ -1301,11 +1191,11 @@ StreamWriter* StreamWriterBuilder::newStreamWriter() const
if (dnp) {
nullSymbol.clear();
}
- if (pre > 17)
- pre = 17;
+ if (pre > 17) pre = 17;
JSONCPP_STRING endingLineFeedSymbol;
- return new BuiltStyledStreamWriter(indentation, cs, colonSymbol, nullSymbol,
- endingLineFeedSymbol, usf, pre);
+ return new BuiltStyledStreamWriter(
+ indentation, cs,
+ colonSymbol, nullSymbol, endingLineFeedSymbol, usf, pre);
}
static void getValidWriterKeys(std::set<JSONCPP_STRING>* valid_keys)
{
@@ -1320,24 +1210,23 @@ static void getValidWriterKeys(std::set<JSONCPP_STRING>* valid_keys)
bool StreamWriterBuilder::validate(Json::Value* invalid) const
{
Json::Value my_invalid;
- if (!invalid)
- invalid = &my_invalid; // so we do not need to test for NULL
+ if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL
Json::Value& inv = *invalid;
std::set<JSONCPP_STRING> valid_keys;
getValidWriterKeys(&valid_keys);
- Value::Members keys = this->settings_.getMemberNames();
+ Value::Members keys = settings_.getMemberNames();
size_t n = keys.size();
for (size_t i = 0; i < n; ++i) {
JSONCPP_STRING const& key = keys[i];
if (valid_keys.find(key) == valid_keys.end()) {
- inv[key] = this->settings_[key];
+ inv[key] = settings_[key];
}
}
return 0u == inv.size();
}
Value& StreamWriterBuilder::operator[](JSONCPP_STRING key)
{
- return this->settings_[key];
+ return settings_[key];
}
// static
void StreamWriterBuilder::setDefaults(Json::Value* settings)
@@ -1352,17 +1241,14 @@ void StreamWriterBuilder::setDefaults(Json::Value* settings)
//! [StreamWriterBuilderDefaults]
}
-JSONCPP_STRING writeString(StreamWriter::Factory const& builder,
- Value const& root)
-{
+JSONCPP_STRING writeString(StreamWriter::Factory const& builder, Value const& root) {
JSONCPP_OSTRINGSTREAM sout;
StreamWriterPtr const writer(builder.newStreamWriter());
writer->write(root, &sout);
return sout.str();
}
-JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM& sout, Value const& root)
-{
+JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM& sout, Value const& root) {
StreamWriterBuilder builder;
StreamWriterPtr const writer(builder.newStreamWriter());
writer->write(root, &sout);