Commit 831d03d1 authored by Milo Yip's avatar Milo Yip

Merge pull request #110 from pah/fixes/memberiterator-comparisons

GenericMemberIterator: fix comparisons/differences for mixed-constness expressions
parents ca5000ba 889f3fa9
...@@ -118,9 +118,9 @@ public: ...@@ -118,9 +118,9 @@ public:
//! Iterator type itself //! Iterator type itself
typedef GenericMemberIterator Iterator; typedef GenericMemberIterator Iterator;
//! Constant iterator type //! Constant iterator type
typedef GenericMemberIterator<true,Encoding,Allocator> ConstType; typedef GenericMemberIterator<true,Encoding,Allocator> ConstIterator;
//! Non-constant iterator type //! Non-constant iterator type
typedef GenericMemberIterator<false,Encoding,Allocator> NonConstType; typedef GenericMemberIterator<false,Encoding,Allocator> NonConstIterator;
//! Pointer to (const) GenericMember //! Pointer to (const) GenericMember
typedef typename BaseType::pointer Pointer; typedef typename BaseType::pointer Pointer;
...@@ -151,7 +151,7 @@ public: ...@@ -151,7 +151,7 @@ public:
constructor effectively defines a regular copy-constructor. constructor effectively defines a regular copy-constructor.
Otherwise, the copy constructor is implicitly defined. Otherwise, the copy constructor is implicitly defined.
*/ */
GenericMemberIterator(const NonConstType & it) : ptr_( it.ptr_ ) {} GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {}
//! @name stepping //! @name stepping
//@{ //@{
...@@ -172,12 +172,12 @@ public: ...@@ -172,12 +172,12 @@ public:
//! @name relations //! @name relations
//@{ //@{
bool operator==(Iterator that) const { return ptr_ == that.ptr_; } bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; }
bool operator!=(Iterator that) const { return ptr_ != that.ptr_; } bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; }
bool operator<=(Iterator that) const { return ptr_ <= that.ptr_; } bool operator<=(ConstIterator that) const { return ptr_ <= that.ptr_; }
bool operator>=(Iterator that) const { return ptr_ >= that.ptr_; } bool operator>=(ConstIterator that) const { return ptr_ >= that.ptr_; }
bool operator< (Iterator that) const { return ptr_ < that.ptr_; } bool operator< (ConstIterator that) const { return ptr_ < that.ptr_; }
bool operator> (Iterator that) const { return ptr_ > that.ptr_; } bool operator> (ConstIterator that) const { return ptr_ > that.ptr_; }
//@} //@}
//! @name dereference //! @name dereference
...@@ -188,7 +188,7 @@ public: ...@@ -188,7 +188,7 @@ public:
//@} //@}
//! Distance //! Distance
DifferenceType operator-(Iterator that) const { return ptr_-that.ptr_; } DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; }
private: private:
//! Internal constructor from plain pointer //! Internal constructor from plain pointer
...@@ -1012,9 +1012,9 @@ public: ...@@ -1012,9 +1012,9 @@ public:
RAPIDJSON_ASSERT(last <= MemberEnd()); RAPIDJSON_ASSERT(last <= MemberEnd());
MemberIterator pos = MemberBegin() + (first - MemberBegin()); MemberIterator pos = MemberBegin() + (first - MemberBegin());
for (MemberIterator itr = pos; ConstMemberIterator(itr) != last; ++itr) for (MemberIterator itr = pos; itr != last; ++itr)
itr->~Member(); itr->~Member();
memmove(&*pos, &*last, (ConstMemberIterator(MemberEnd()) - last) * sizeof(Member)); memmove(&*pos, &*last, (MemberEnd() - last) * sizeof(Member));
data_.o.size -= (last - first); data_.o.size -= (last - first);
return pos; return pos;
} }
......
...@@ -852,6 +852,31 @@ TEST(Value, Object) { ...@@ -852,6 +852,31 @@ TEST(Value, Object) {
++citr; ++citr;
EXPECT_FALSE(citr != y.MemberEnd()); EXPECT_FALSE(citr != y.MemberEnd());
// member iterator conversions/relations
itr = x.MemberBegin();
citr = x.MemberBegin(); // const conversion
TestEqual(itr, citr);
EXPECT_TRUE(itr < x.MemberEnd());
EXPECT_FALSE(itr > y.MemberEnd());
EXPECT_TRUE(citr < x.MemberEnd());
EXPECT_FALSE(citr > y.MemberEnd());
++citr;
TestUnequal(itr, citr);
EXPECT_FALSE(itr < itr);
EXPECT_TRUE(itr < citr);
EXPECT_FALSE(itr > itr);
EXPECT_TRUE(citr > itr);
EXPECT_EQ(1, citr - x.MemberBegin());
EXPECT_EQ(0, itr - y.MemberBegin());
itr += citr - x.MemberBegin();
EXPECT_EQ(1, itr - y.MemberBegin());
TestEqual(citr, itr);
EXPECT_TRUE(itr <= citr);
EXPECT_TRUE(citr <= itr);
itr++;
EXPECT_TRUE(itr >= citr);
EXPECT_FALSE(citr >= itr);
// RemoveMember() // RemoveMember()
x.RemoveMember("A"); x.RemoveMember("A");
EXPECT_FALSE(x.HasMember("A")); EXPECT_FALSE(x.HasMember("A"));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment