| @@ -193,12 +193,13 @@ public: | |||||
| { | { | ||||
| T tmp = x; | T tmp = x; | ||||
| Reserve(m_count * 13 / 8 + 8); | Reserve(m_count * 13 / 8 + 8); | ||||
| new (&m_data[m_count++]) Element(tmp); | |||||
| new (&m_data[m_count]) Element(tmp); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| new (&m_data[m_count++]) Element(x); | |||||
| new (&m_data[m_count]) Element(x); | |||||
| } | } | ||||
| ++m_count; | |||||
| return *this; | return *this; | ||||
| } | } | ||||
| @@ -246,14 +247,19 @@ public: | |||||
| inline void Insert(T const &x, int pos) | inline void Insert(T const &x, int pos) | ||||
| { | { | ||||
| ArrayBase<T, ARRAY> tmp; | |||||
| for (int i = 0; i < m_count; i++) | |||||
| ASSERT(pos >= 0); | |||||
| ASSERT(pos <= m_count); | |||||
| if (m_count >= m_reserved) | |||||
| Reserve(m_count * 13 / 8 + 8); | |||||
| for (int i = m_count; i > pos; --i) | |||||
| { | { | ||||
| if (i == pos) | |||||
| tmp.Push(x); | |||||
| tmp.Push(m_data[i]); | |||||
| new (&m_data[i]) Element(m_data[i - 1]); | |||||
| m_data[i - 1].~Element(); | |||||
| } | } | ||||
| *this = tmp; | |||||
| new (&m_data[pos]) Element(x); | |||||
| ++m_count; | |||||
| } | } | ||||
| inline int Find(T const &x) | inline int Find(T const &x) | ||||
| @@ -147,6 +147,30 @@ LOLUNIT_FIXTURE(ArrayTest) | |||||
| LOLUNIT_ASSERT_EQUAL(20, a[1].m2); | LOLUNIT_ASSERT_EQUAL(20, a[1].m2); | ||||
| } | } | ||||
| LOLUNIT_TEST(ArrayInsert) | |||||
| { | |||||
| Array<int> a; | |||||
| a << 1 << 2; | |||||
| a.Insert(5, 0); | |||||
| LOLUNIT_ASSERT_EQUAL(5, a[0]); | |||||
| LOLUNIT_ASSERT_EQUAL(1, a[1]); | |||||
| LOLUNIT_ASSERT_EQUAL(2, a[2]); | |||||
| a.Insert(6, 3); | |||||
| LOLUNIT_ASSERT_EQUAL(5, a[0]); | |||||
| LOLUNIT_ASSERT_EQUAL(1, a[1]); | |||||
| LOLUNIT_ASSERT_EQUAL(2, a[2]); | |||||
| LOLUNIT_ASSERT_EQUAL(6, a[3]); | |||||
| a.Insert(7, 2); | |||||
| LOLUNIT_ASSERT_EQUAL(5, a[0]); | |||||
| LOLUNIT_ASSERT_EQUAL(1, a[1]); | |||||
| LOLUNIT_ASSERT_EQUAL(7, a[2]); | |||||
| LOLUNIT_ASSERT_EQUAL(2, a[3]); | |||||
| LOLUNIT_ASSERT_EQUAL(6, a[4]); | |||||
| } | |||||
| LOLUNIT_TEST(ArrayConcat) | LOLUNIT_TEST(ArrayConcat) | ||||
| { | { | ||||
| Array<int> a, b; | Array<int> a, b; | ||||