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);
+}
+