From 96af95c945970d935e5f9fdd57e6ece5d071e880 Mon Sep 17 00:00:00 2001 From: "Philipp A. Hartmann" Date: Thu, 31 Jul 2014 12:47:02 +0200 Subject: [PATCH] GenericValue: add Erase function for object members --- include/rapidjson/document.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index a52d986..e7413eb 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -850,6 +850,7 @@ public: /*! \param m member iterator (obtained by FindMember() or MemberBegin()). \return the new iterator after removal. \note Removing member is implemented by moving the last member. So the ordering of members is changed. + \note Use \ref Erase(ConstMemberIterator) instead, if you need to rely on a stable member ordering. */ MemberIterator RemoveMember(MemberIterator m) { RAPIDJSON_ASSERT(IsObject()); @@ -870,6 +871,40 @@ public: return m; } + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note Other than \ref RemoveMember(MemberIterator), this function preserves the ordering of the members. + */ + MemberIterator Erase(ConstMemberIterator pos) { + return Erase(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note Other than \ref RemoveMember(MemberIterator), this function preserves the ordering of the members. + */ + MemberIterator Erase(ConstMemberIterator first, ConstMemberIterator last) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(data_.o.members != 0); + RAPIDJSON_ASSERT(first >= MemberBegin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= MemberEnd()); + + MemberIterator pos = MemberBegin() + (first - MemberBegin()); + for (MemberIterator itr = pos; ConstMemberIterator(itr) != last; ++itr) + itr->~Member(); + memmove(&*pos, &*last, (ConstMemberIterator(MemberEnd()) - last) * sizeof(Member)); + data_.o.size -= (last - first); + return pos; + } + //@} //!@name Array