use SwapPayload() to retain comments
All tests pass, but we might be missing coverage.
issue #47
diff --git a/include/json/value.h b/include/json/value.h
index 3473c7e..93112d1 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -235,23 +235,26 @@
Value(const CppTL::ConstString& value);
#endif
Value(bool value);
+ /// Deep copy.
Value(const Value& other);
~Value();
+ // Deep copy, then swap(other).
Value& operator=(Value other);
- /// Swap values.
+ /// Swap everything.
void swap(Value& other);
+ /// Swap values but leave comments and source offsets in place.
+ void swapPayload(Value& other);
ValueType type() const;
+ /// Compare payload only, not comments etc.
bool operator<(const Value& other) const;
bool operator<=(const Value& other) const;
bool operator>=(const Value& other) const;
bool operator>(const Value& other) const;
-
bool operator==(const Value& other) const;
bool operator!=(const Value& other) const;
-
int compare(const Value& other) const;
const char* asCString() const;
@@ -442,9 +445,6 @@
Value& resolveReference(const char* key, bool isStatic);
- /// Swap values but leave comments and source offsets in place.
- void swapPayload(Value& other);
-
#ifdef JSON_VALUE_USE_INTERNAL_MAP
inline bool isItemAvailable() const { return itemIsUsed_ == 0; }
diff --git a/src/lib_json/json_reader.cpp b/src/lib_json/json_reader.cpp
index 2e587ab..be22343 100644
--- a/src/lib_json/json_reader.cpp
+++ b/src/lib_json/json_reader.cpp
@@ -173,9 +173,12 @@
currentValue().setOffsetLimit(token.end_ - begin_);
break;
case tokenNull:
- currentValue() = Value();
+ {
+ Value v;
+ currentValue().swapPayload(v);
currentValue().setOffsetStart(token.start_ - begin_);
currentValue().setOffsetLimit(token.end_ - begin_);
+ }
break;
case tokenArraySeparator:
if (features_.allowDroppedNullPlaceholders_) {
@@ -393,7 +396,8 @@
bool Reader::readObject(Token& tokenStart) {
Token tokenName;
std::string name;
- currentValue() = Value(objectValue);
+ Value init(objectValue);
+ currentValue().swapPayload(init);
currentValue().setOffsetStart(tokenStart.start_ - begin_);
while (readToken(tokenName)) {
bool initialTokenOk = true;
@@ -486,7 +490,7 @@
Value decoded;
if (!decodeNumber(token, decoded))
return false;
- currentValue() = decoded;
+ currentValue().swapPayload(decoded);
currentValue().setOffsetStart(token.start_ - begin_);
currentValue().setOffsetLimit(token.end_ - begin_);
return true;
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index 85b26ce..0a7fb85 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -406,7 +406,7 @@
}
Value& Value::operator=(Value other) {
- swapPayload(other);
+ swap(other);
return *this;
}