Changeset 2809


Ignore:
Timestamp:
Jul 23, 2013, 8:14:41 AM (4 years ago)
Author:
sam
Message:

base: Array::Remove(int) now accepts a negative index to remove elements
from the end. Also added Array::RemoveSwap() for faster removes at the
expense of element ordering.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lol/base/array.h

    r2780 r2809  
    188188    void Remove(int pos, int todelete = 1)
    189189    {
    190         ASSERT(pos >= 0);
    191190        ASSERT(todelete >= 0);
     191        ASSERT(pos - todelete >= -m_count - 1);
    192192        ASSERT(pos + todelete <= m_count);
     193        if (pos < 0)
     194            pos = m_count + pos;
     195
    193196        for (int i = pos; i + todelete < m_count; i++)
    194197            m_data[i] = m_data[i + todelete];
    195198        for (int i = m_count - todelete; i < m_count; i++)
    196199            m_data[i].~Element();
     200        m_count -= todelete;
     201    }
     202
     203    void RemoveSwap(int pos, int todelete = 1)
     204    {
     205        ASSERT(todelete >= 0);
     206        ASSERT(pos - todelete >= -m_count - 1);
     207        ASSERT(pos + todelete <= m_count);
     208        if (pos < 0)
     209            pos = m_count + pos;
     210
     211        for (int i = 0; i < todelete; i++)
     212        {
     213            if (pos + i < m_count - 1 - i)
     214                m_data[pos + i] = m_data[m_count - 1 - i];
     215            m_data[m_count - 1 - i].~Element();
     216        }
    197217        m_count -= todelete;
    198218    }
  • trunk/test/unit/array.cpp

    r2532 r2809  
    8484        a.Remove(1);
    8585
     86        LOLUNIT_ASSERT_EQUAL(a.Count(), 3);
    8687        LOLUNIT_ASSERT_EQUAL(a[0], 0);
    8788        LOLUNIT_ASSERT_EQUAL(a[1], 2);
    8889        LOLUNIT_ASSERT_EQUAL(a[2], 3);
     90
     91        Array<int> b;
     92        b << 0 << 1 << 2 << 3;
     93        b.Remove(-2);
     94
     95        LOLUNIT_ASSERT_EQUAL(b.Count(), 3);
     96        LOLUNIT_ASSERT_EQUAL(b[0], 0);
     97        LOLUNIT_ASSERT_EQUAL(b[1], 1);
     98        LOLUNIT_ASSERT_EQUAL(b[2], 3);
     99    }
     100
     101    LOLUNIT_TEST(ArrayRemoveSwap)
     102    {
     103        Array<int> a;
     104        a << 0 << 1 << 2 << 3;
     105        a.RemoveSwap(1);
     106
     107        LOLUNIT_ASSERT_EQUAL(a.Count(), 3);
     108        LOLUNIT_ASSERT_EQUAL(a[0], 0);
     109        LOLUNIT_ASSERT_EQUAL(a[1], 3);
     110        LOLUNIT_ASSERT_EQUAL(a[2], 2);
     111
     112        Array<int> b;
     113        b << 0 << 1 << 2 << 3;
     114        b.Remove(1, 2);
     115
     116        LOLUNIT_ASSERT_EQUAL(b.Count(), 2);
     117        LOLUNIT_ASSERT_EQUAL(b[0], 0);
     118        LOLUNIT_ASSERT_EQUAL(b[1], 3);
    89119    }
    90120#endif
Note: See TracChangeset for help on using the changeset viewer.