from Itzik S; see issue #28
with minor corrections
diff --git a/include/json/value.h b/include/json/value.h
index 18355d0..c4169b4 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -400,8 +400,7 @@
O(n) expensive operations.
Update 'removed' iff removed.
(This is a better pattern than removeMember().)
- JSON_FAIL if !isValidIndex(i) or if not arrayObject
- \return true iff removed
+ \return true iff removed (no exceptions)
*/
bool removeIndex(ArrayIndex i, Value* removed);
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index aa9bfb4..f9e733f 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -1018,12 +1018,32 @@
return removeMember(key.c_str());
}
-bool Value::removeIndex(ArrayIndex i, Value* removed) {
- JSON_ASSERT_MESSAGE(this->type_ == arrayValue,
- "in Json::Value::removeIndex(): requires arrayValue");
- JSON_ASSERT_MESSAGE(this->isValidIndex(i),
- "invalid index i=" << i << " for array of size " << this->size());
+bool Value::removeIndex(ArrayIndex index, Value* removed) {
+ if (this->type_ != arrayValue) {
+ return false;
+ }
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+ JSON_FAIL_MESSAGE("removeIndex is not implemented for ValueInternalArray.");
+ return false;
+#else
+ CZString key(index);
+ ObjectValues::iterator it = this->value_.map_->find(key);
+ if (it == this->value_.map_->end()) {
+ return false;
+ }
+ *removed = it->second;
+ ArrayIndex oldSize = this->size();
+ // shift left all items left, into the place of the "removed"
+ for (ArrayIndex i=index; i<oldSize-1; i++){
+ CZString key(i);
+ (*this->value_.map_)[key] = (*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);
return true;
+#endif
}
#ifdef JSON_USE_CPPTL