from the end. Also added Array::RemoveSwap() for faster removes at the expense of element ordering.legacy
@@ -187,9 +187,12 @@ public: | |||||
void Remove(int pos, int todelete = 1) | void Remove(int pos, int todelete = 1) | ||||
{ | { | ||||
ASSERT(pos >= 0); | |||||
ASSERT(todelete >= 0); | ASSERT(todelete >= 0); | ||||
ASSERT(pos - todelete >= -m_count - 1); | |||||
ASSERT(pos + todelete <= m_count); | ASSERT(pos + todelete <= m_count); | ||||
if (pos < 0) | |||||
pos = m_count + pos; | |||||
for (int i = pos; i + todelete < m_count; i++) | for (int i = pos; i + todelete < m_count; i++) | ||||
m_data[i] = m_data[i + todelete]; | m_data[i] = m_data[i + todelete]; | ||||
for (int i = m_count - todelete; i < m_count; i++) | for (int i = m_count - todelete; i < m_count; i++) | ||||
@@ -197,6 +200,23 @@ public: | |||||
m_count -= todelete; | m_count -= todelete; | ||||
} | } | ||||
void RemoveSwap(int pos, int todelete = 1) | |||||
{ | |||||
ASSERT(todelete >= 0); | |||||
ASSERT(pos - todelete >= -m_count - 1); | |||||
ASSERT(pos + todelete <= m_count); | |||||
if (pos < 0) | |||||
pos = m_count + pos; | |||||
for (int i = 0; i < todelete; i++) | |||||
{ | |||||
if (pos + i < m_count - 1 - i) | |||||
m_data[pos + i] = m_data[m_count - 1 - i]; | |||||
m_data[m_count - 1 - i].~Element(); | |||||
} | |||||
m_count -= todelete; | |||||
} | |||||
void Resize(int count, Element e = Element()) | void Resize(int count, Element e = Element()) | ||||
{ | { | ||||
ASSERT(count > 0); | ASSERT(count > 0); | ||||
@@ -83,9 +83,39 @@ LOLUNIT_FIXTURE(ArrayTest) | |||||
a << 0 << 1 << 2 << 3; | a << 0 << 1 << 2 << 3; | ||||
a.Remove(1); | a.Remove(1); | ||||
LOLUNIT_ASSERT_EQUAL(a.Count(), 3); | |||||
LOLUNIT_ASSERT_EQUAL(a[0], 0); | LOLUNIT_ASSERT_EQUAL(a[0], 0); | ||||
LOLUNIT_ASSERT_EQUAL(a[1], 2); | LOLUNIT_ASSERT_EQUAL(a[1], 2); | ||||
LOLUNIT_ASSERT_EQUAL(a[2], 3); | LOLUNIT_ASSERT_EQUAL(a[2], 3); | ||||
Array<int> b; | |||||
b << 0 << 1 << 2 << 3; | |||||
b.Remove(-2); | |||||
LOLUNIT_ASSERT_EQUAL(b.Count(), 3); | |||||
LOLUNIT_ASSERT_EQUAL(b[0], 0); | |||||
LOLUNIT_ASSERT_EQUAL(b[1], 1); | |||||
LOLUNIT_ASSERT_EQUAL(b[2], 3); | |||||
} | |||||
LOLUNIT_TEST(ArrayRemoveSwap) | |||||
{ | |||||
Array<int> a; | |||||
a << 0 << 1 << 2 << 3; | |||||
a.RemoveSwap(1); | |||||
LOLUNIT_ASSERT_EQUAL(a.Count(), 3); | |||||
LOLUNIT_ASSERT_EQUAL(a[0], 0); | |||||
LOLUNIT_ASSERT_EQUAL(a[1], 3); | |||||
LOLUNIT_ASSERT_EQUAL(a[2], 2); | |||||
Array<int> b; | |||||
b << 0 << 1 << 2 << 3; | |||||
b.Remove(1, 2); | |||||
LOLUNIT_ASSERT_EQUAL(b.Count(), 2); | |||||
LOLUNIT_ASSERT_EQUAL(b[0], 0); | |||||
LOLUNIT_ASSERT_EQUAL(b[1], 3); | |||||
} | } | ||||
#endif | #endif | ||||