diff --git a/med/field.hpp b/med/field.hpp index 7fdeedd..d1bfc59 100644 --- a/med/field.hpp +++ b/med/field.hpp @@ -179,19 +179,31 @@ class multi_field : public detail::define_meta_info { --m_count; it.m_curr->value.clear(); - if (it == prev) //1st - { - m_head = m_head->next; - return begin(); - } + iterator ret; + if (!m_count) { ret = iterator(m_head = m_tail = nullptr); } else { - prev.m_curr->next = it.m_curr->next; - return ++prev; + if (it == prev) //1st + { + m_head = m_head->next; + ret = begin(); + } + else + { + prev.m_curr->next = it.m_curr->next; + ret = std::next(prev); + } + if (m_tail == it.m_curr) //last + { + m_tail = prev.m_curr; + } } + CODEC_TRACE("%s(%s=%p) count=%zu head=%p tail=%p", __FUNCTION__, name(), it.get(), count(), m_head, m_tail); + return ret; } prev = it; } + CODEC_TRACE("%s: %s[%c]", __FUNCTION__, name(), '-'); return end(); } @@ -208,7 +220,7 @@ class multi_field : public detail::define_meta_info { for (auto& f : m_fields) { - //CODEC_TRACE("%s: %s=%p[%c]", __FUNCTION__, name(), (void*)&f, f.value.is_set()?'+':'-'); + CODEC_TRACE("%s: %s=%p[%c]", __FUNCTION__, name(), (void*)&f, f.value.is_set()?'+':'-'); if (!f.value.is_set()) return &f; } } @@ -219,11 +231,11 @@ class multi_field : public detail::define_meta_info { if (!pf) { MED_THROW_EXCEPTION(out_of_memory, name(), sizeof(field_type)) } - //CODEC_TRACE("%s(%s=%p) count=%zu", __FUNCTION__, name(), (void*)pf, count()); if (m_count++) { m_tail->next = pf; } else { m_head = m_tail = pf; } pf->next = nullptr; m_tail = pf; + CODEC_TRACE("%s(%s=%p) count=%zu head=%p tail=%p", __FUNCTION__, name(), (void*)pf, count(), m_head, m_tail); return &m_tail->value; } diff --git a/ut/multi.cpp b/ut/multi.cpp index 84b50f6..8b55527 100644 --- a/ut/multi.cpp +++ b/ut/multi.cpp @@ -113,6 +113,11 @@ TEST(multi, erase) EXPECT_EQ(3, mie.count()); //(1,2,3) EXPECT_EQ(3, std::distance(mie.begin(), mie.end())); + mie.erase(std::next(std::next(mie.begin()))); //erase last (1,2) + EXPECT_EQ(2, mie.count()); + EXPECT_EQ(2, std::distance(mie.begin(), mie.end())); + mie.push_back()->set(3); // get back (1,2,3) + mie.erase(mie.begin()); //erase 1st (2,3) EXPECT_EQ(2, mie.count()); EXPECT_EQ(2, std::distance(mie.begin(), mie.end()));