From dc834c9c03361eecbb808a9ebb4502031b70a374 Mon Sep 17 00:00:00 2001 From: Milo Yip Date: Wed, 27 Aug 2014 23:14:17 +0800 Subject: [PATCH 1/2] Add Value::MemberCount(), MemberEmpty(), RemoveAllMembers() --- include/rapidjson/document.h | 20 ++++++++++++++++++-- test/unittest/valuetest.cpp | 13 +++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index 2079b23..6421311 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -534,9 +534,8 @@ public: break; case kObjectFlag: - for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) m->~Member(); - } Allocator::Free(data_.o.members); break; @@ -745,6 +744,12 @@ public: /*! \post IsObject() == true */ GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + //! Get the number of members in the object. + SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Check whether the object is empty. + bool MemberEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + //! Get the value associated with the name. /*! \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. @@ -936,6 +941,17 @@ public: return AddMember(n, v, allocator); } + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + RAPIDJSON_ASSERT(IsObject()); + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + //! Remove a member in object by its name. /*! \param name Name of member to be removed. \return Whether the member existed. diff --git a/test/unittest/valuetest.cpp b/test/unittest/valuetest.cpp index c9241d4..e22b696 100644 --- a/test/unittest/valuetest.cpp +++ b/test/unittest/valuetest.cpp @@ -763,14 +763,21 @@ TEST(Value, Object) { EXPECT_EQ(kObjectType, x.GetType()); EXPECT_TRUE(x.IsObject()); + EXPECT_TRUE(x.MemberEmpty()); + EXPECT_EQ(0u, x.MemberCount()); EXPECT_EQ(kObjectType, y.GetType()); EXPECT_TRUE(y.IsObject()); + EXPECT_TRUE(y.MemberEmpty()); + EXPECT_EQ(0u, y.MemberCount()); // AddMember() x.AddMember("A", "Apple", allocator); + EXPECT_FALSE(x.MemberEmpty()); + EXPECT_EQ(1u, x.MemberCount()); Value value("Banana", 6); x.AddMember("B", "Banana", allocator); + EXPECT_EQ(2u, x.MemberCount()); // AddMember(StringRefType, T, Allocator) { @@ -791,6 +798,7 @@ TEST(Value, Object) { EXPECT_EQ(INT64_C(-4294967296), o["int64"].GetInt64()); EXPECT_EQ(UINT64_C(4294967296), o["uint64"].GetUint64()); EXPECT_STREQ("Jelly",o["string"].GetString()); + EXPECT_EQ(8u, o.MemberCount()); } // Tests a member with null character @@ -955,6 +963,11 @@ TEST(Value, Object) { } } + // RemoveAllMembers() + x.RemoveAllMembers(); + EXPECT_TRUE(x.MemberEmpty()); + EXPECT_EQ(0u, x.MemberCount()); + // SetObject() Value z; z.SetObject(); From 284dcf3dc52d91970466e296eddd3ac995a1fefb Mon Sep 17 00:00:00 2001 From: Milo Yip Date: Thu, 28 Aug 2014 20:25:41 +0800 Subject: [PATCH 2/2] Change MemberEmpty() to ObjectEmpty() --- include/rapidjson/document.h | 2 +- test/unittest/valuetest.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index 6421311..614f391 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -748,7 +748,7 @@ public: SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } //! Check whether the object is empty. - bool MemberEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } //! Get the value associated with the name. /*! diff --git a/test/unittest/valuetest.cpp b/test/unittest/valuetest.cpp index e22b696..a234e1f 100644 --- a/test/unittest/valuetest.cpp +++ b/test/unittest/valuetest.cpp @@ -763,16 +763,16 @@ TEST(Value, Object) { EXPECT_EQ(kObjectType, x.GetType()); EXPECT_TRUE(x.IsObject()); - EXPECT_TRUE(x.MemberEmpty()); + EXPECT_TRUE(x.ObjectEmpty()); EXPECT_EQ(0u, x.MemberCount()); EXPECT_EQ(kObjectType, y.GetType()); EXPECT_TRUE(y.IsObject()); - EXPECT_TRUE(y.MemberEmpty()); + EXPECT_TRUE(y.ObjectEmpty()); EXPECT_EQ(0u, y.MemberCount()); // AddMember() x.AddMember("A", "Apple", allocator); - EXPECT_FALSE(x.MemberEmpty()); + EXPECT_FALSE(x.ObjectEmpty()); EXPECT_EQ(1u, x.MemberCount()); Value value("Banana", 6); @@ -965,7 +965,7 @@ TEST(Value, Object) { // RemoveAllMembers() x.RemoveAllMembers(); - EXPECT_TRUE(x.MemberEmpty()); + EXPECT_TRUE(x.ObjectEmpty()); EXPECT_EQ(0u, x.MemberCount()); // SetObject()