diff --git a/src/tl/tlReuseVector.h b/src/tl/tlReuseVector.h index 04e3a3eb7..cf734f2b2 100644 --- a/src/tl/tlReuseVector.h +++ b/src/tl/tlReuseVector.h @@ -148,7 +148,7 @@ public: { do { ++m_n; - } while (*this != mp_v->end () && ! mp_v->is_used (m_n)); + } while (! at_end () && ! mp_v->is_used (m_n)); return *this; } @@ -157,7 +157,7 @@ public: */ bool at_end () const { - return *this == mp_v->end (); + return index () >= mp_v->last (); } /** @@ -317,7 +317,7 @@ public: { do { ++m_n; - } while (*this != mp_v->end () && ! mp_v->is_used (m_n)); + } while (! at_end () && ! mp_v->is_used (m_n)); return *this; } @@ -326,7 +326,7 @@ public: */ bool at_end () const { - return *this == mp_v->end (); + return index () >= mp_v->last (); } /** diff --git a/src/unit_tests/tlReuseVector.cc b/src/unit_tests/tlReuseVector.cc index 5cd5ecdf3..c4fc14ab4 100644 --- a/src/unit_tests/tlReuseVector.cc +++ b/src/unit_tests/tlReuseVector.cc @@ -287,3 +287,103 @@ TEST(4) EXPECT_EQ (B::ccc, 22); } +// destroy while iterate +TEST(5) +{ + tl::reuse_vector v; + v.insert (A (1)); + v.insert (A (2)); + v.insert (A (3)); + + tl::reuse_vector::iterator i; + tl::reuse_vector::iterator ii; + + ii = v.end (); + for (i = v.begin (); i != ii; ++i) { + if (i->x == 2) { + v.erase (i); + } + } + + EXPECT_EQ (v.size (), size_t (2)); + i = v.begin (); + EXPECT_EQ (i->x, 1); + ++i; + EXPECT_EQ (i->x, 3); + + v = tl::reuse_vector (); + v.insert (A (1)); + v.insert (A (2)); + v.insert (A (3)); + + for (i = v.begin (); !i.at_end (); ++i) { + if (i->x == 2) { + v.erase (i); + } + } + + EXPECT_EQ (v.size (), size_t (2)); + i = v.begin (); + EXPECT_EQ (i->x, 1); + ++i; + EXPECT_EQ (i->x, 3); + + v = tl::reuse_vector (); + v.insert (A (1)); + v.insert (A (2)); + v.insert (A (3)); + + ii = v.end (); + for (i = v.begin (); i != ii; ++i) { + if (i->x == 3) { + v.erase (i); + } + } + + EXPECT_EQ (v.size (), size_t (2)); + i = v.begin (); + EXPECT_EQ (i->x, 1); + ++i; + EXPECT_EQ (i->x, 2); + + v = tl::reuse_vector (); + v.insert (A (1)); + v.insert (A (2)); + v.insert (A (3)); + + for (i = v.begin (); !i.at_end (); ++i) { + if (i->x == 3) { + v.erase (i); + } + } + + EXPECT_EQ (v.size (), size_t (2)); + i = v.begin (); + EXPECT_EQ (i->x, 1); + ++i; + EXPECT_EQ (i->x, 2); + + v = tl::reuse_vector (); + v.insert (A (1)); + v.insert (A (2)); + v.insert (A (3)); + + ii = v.end (); + for (i = v.begin (); i != ii; ++i) { + v.erase (i); + } + EXPECT_EQ (v.size (), size_t (0)); + EXPECT_EQ (v.empty (), true); + + v = tl::reuse_vector (); + v.insert (A (1)); + v.insert (A (2)); + v.insert (A (3)); + + for (i = v.begin (); !i.at_end (); ++i) { + v.erase (i); + } + EXPECT_EQ (v.size (), size_t (0)); + EXPECT_EQ (v.empty (), true); +} +