Merge branch 'master' into fix-czstring
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index a875d28..640c7a2 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -253,20 +253,29 @@
cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != nullptr
? 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 (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_;
+ } else {
+ index_ = other.index_;
+ }
}
-Value::CZString::CZString(CZString&& other) noexcept
- : cstr_(other.cstr_), index_(other.index_) {
+Value::CZString::CZString(CZString&& other) noexcept : cstr_(other.cstr_) {
+ if (other.cstr_) {
+ storage_.policy_ = other.storage_.policy_;
+ storage_.length_ = other.storage_.length_;
+ } else {
+ index_ = other.index_;
+ }
other.cstr_ = nullptr;
}
@@ -293,7 +302,12 @@
Value::CZString& Value::CZString::operator=(CZString&& other) noexcept {
cstr_ = other.cstr_;
- index_ = other.index_;
+ if (other.cstr_) {
+ storage_.policy_ = other.storage_.policy_;
+ storage_.length_ = other.storage_.length_;
+ } else {
+ index_ = other.index_;
+ }
other.cstr_ = nullptr;
return *this;
}
diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp
index 5d5b971..ca49ed5 100644
--- a/src/test_lib_json/main.cpp
+++ b/src/test_lib_json/main.cpp
@@ -449,6 +449,24 @@
}
}
+JSONTEST_FIXTURE_LOCAL(ValueTest, copyMoveArray) {
+ Json::Value array;
+ array.append("item1");
+ array.append("item2");
+
+ // Test Copy Constructor (covers CZString(const CZString&) with index)
+ Json::Value copy(array);
+ JSONTEST_ASSERT_EQUAL(copy.size(), 2);
+ JSONTEST_ASSERT_EQUAL(Json::Value("item1"), copy[0]);
+ JSONTEST_ASSERT_EQUAL(Json::Value("item2"), copy[1]);
+
+ // Test Move Constructor (covers CZString(CZString&&) with index)
+ Json::Value moved(std::move(copy));
+ JSONTEST_ASSERT_EQUAL(moved.size(), 2);
+ JSONTEST_ASSERT_EQUAL(Json::Value("item1"), moved[0]);
+ JSONTEST_ASSERT_EQUAL(Json::Value("item2"), moved[1]);
+}
+
JSONTEST_FIXTURE_LOCAL(ValueTest, resizePopulatesAllMissingElements) {
Json::ArrayIndex n = 10;
Json::Value v;