Skip to content

Commit 40810fe

Browse files
committed
Merge pull request #127 from cdunn2001/removeIndex
`Value::removeIndex()` See issue #28.
2 parents 7956ccd + 59167d8 commit 40810fe

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

include/json/value.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,14 @@ Json::Value obj_value(Json::objectValue); // {}
395395
Value removeMember(const char* key);
396396
/// Same as removeMember(const char*)
397397
Value removeMember(const std::string& key);
398+
/** \brief Remove the indexed array element.
399+
400+
O(n) expensive operations.
401+
Update 'removed' iff removed.
402+
(This is a better pattern than removeMember().)
403+
\return true iff removed (no exceptions)
404+
*/
405+
bool removeIndex(ArrayIndex i, Value* removed);
398406

399407
/// Return true if the object has a member named key.
400408
bool isMember(const char* key) const;

src/lib_json/json_value.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,6 +1018,34 @@ Value Value::removeMember(const std::string& key) {
10181018
return removeMember(key.c_str());
10191019
}
10201020

1021+
bool Value::removeIndex(ArrayIndex index, Value* removed) {
1022+
if (type_ != arrayValue) {
1023+
return false;
1024+
}
1025+
#ifdef JSON_VALUE_USE_INTERNAL_MAP
1026+
JSON_FAIL_MESSAGE("removeIndex is not implemented for ValueInternalArray.");
1027+
return false;
1028+
#else
1029+
CZString key(index);
1030+
ObjectValues::iterator it = value_.map_->find(key);
1031+
if (it == value_.map_->end()) {
1032+
return false;
1033+
}
1034+
*removed = it->second;
1035+
ArrayIndex oldSize = size();
1036+
// shift left all items left, into the place of the "removed"
1037+
for (ArrayIndex i = index; i < (oldSize - 1); ++i){
1038+
CZString key(i);
1039+
(*value_.map_)[key] = (*this)[i + 1];
1040+
}
1041+
// erase the last one ("leftover")
1042+
CZString keyLast(oldSize - 1);
1043+
ObjectValues::iterator itLast = value_.map_->find(keyLast);
1044+
value_.map_->erase(itLast);
1045+
return true;
1046+
#endif
1047+
}
1048+
10211049
#ifdef JSON_USE_CPPTL
10221050
Value Value::get(const CppTL::ConstString& key,
10231051
const Value& defaultValue) const {

src/test_lib_json/main.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,14 @@ JSONTEST_FIXTURE(ValueTest, objects) {
198198

199199
object1_["some other id"] = "foo";
200200
JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
201+
JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
202+
203+
// Remove.
204+
Json::Value got;
205+
got = object1_.removeMember("some other id");
206+
JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
207+
got = object1_.removeMember("some other id");
208+
JSONTEST_ASSERT_EQUAL(Json::nullValue, got);
201209
}
202210

203211
JSONTEST_FIXTURE(ValueTest, arrays) {
@@ -240,6 +248,10 @@ JSONTEST_FIXTURE(ValueTest, arrays) {
240248
array1_[2] = Json::Value(17);
241249
JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
242250
JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
251+
Json::Value got;
252+
JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
253+
JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
254+
JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
243255
}
244256

245257
JSONTEST_FIXTURE(ValueTest, null) {

0 commit comments

Comments
 (0)