Changeset 1345


Ignore:
Timestamp:
May 6, 2012, 10:52:40 PM (9 years ago)
Author:
sam
Message:

core: allow to concatenate arrays, and add unit tests for that.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/array.h

    r1331 r1345  
    3232 */
    3333
    34 template<typename T> class ArrayBase
     34template<typename T, typename ARRAY> class ArrayBase
    3535{
    3636public:
     
    8888    }
    8989
     90    ArrayBase& operator+=(ARRAY const &that)
     91    {
     92        int todo = that.m_count;
     93        Reserve(m_count + that.m_count);
     94        for (int i = 0; i < todo; i++)
     95            *this << that[i];
     96        return *this;
     97    }
     98
     99    ARRAY operator+(ARRAY const &that) const
     100    {
     101        /* FIXME: upon return, this makes a copy of the temporary object;
     102         * use either C++11 move semantics, or add a special flag to the
     103         * object indicating we're a temporary about to be destroyed */
     104        ARRAY ret;
     105        ret.Reserve(m_count + that.m_count);
     106        for (int i = 0; i < m_count; i++)
     107            ret << (*this)[i];
     108        for (int i = 0; i < that.m_count; i++)
     109            ret << that[i];
     110        return ret;
     111    }
     112
    90113    inline Element& operator[](int n)
    91114    {
     
    108131    }
    109132
    110     inline ArrayBase<T> const& operator<<(T const &x)
     133    inline ArrayBase& operator<<(T const &x)
    111134    {
    112135        if (m_count >= m_reserved)
     
    237260         typename T4 = void, typename T5 = void, typename T6 = void,
    238261         typename T7 = void, typename T8 = void>
    239 class Array : public ArrayBase<ArrayElement<T1, T2, T3, T4, T5, T6, T7, T8> >
     262class Array : public ArrayBase<ArrayElement<T1, T2, T3, T4, T5, T6, T7, T8>,
     263                               Array<T1, T2, T3, T4, T5, T6, T7, T8> >
    240264{
    241265public:
     
    275299         typename T6, typename T7>
    276300class Array<T1, T2, T3, T4, T5, T6, T7, void>
    277   : public ArrayBase<ArrayElement<T1, T2, T3, T4, T5, T6, T7, void> >
     301  : public ArrayBase<ArrayElement<T1, T2, T3, T4, T5, T6, T7, void>,
     302                     Array<T1, T2, T3, T4, T5, T6, T7> >
    278303{
    279304public:
     
    311336         typename T6>
    312337class Array<T1, T2, T3, T4, T5, T6, void, void>
    313   : public ArrayBase<ArrayElement<T1, T2, T3, T4, T5, T6, void, void> >
     338  : public ArrayBase<ArrayElement<T1, T2, T3, T4, T5, T6, void, void>,
     339                     Array<T1, T2, T3, T4, T5, T6> >
    314340{
    315341public:
     
    344370template<typename T1, typename T2, typename T3, typename T4, typename T5>
    345371class Array<T1, T2, T3, T4, T5, void, void, void>
    346   : public ArrayBase<ArrayElement<T1, T2, T3, T4, T5, void, void, void> >
     372  : public ArrayBase<ArrayElement<T1, T2, T3, T4, T5, void, void, void>,
     373                     Array<T1, T2, T3, T4, T5> >
    347374{
    348375public:
     
    375402template<typename T1, typename T2, typename T3, typename T4>
    376403class Array<T1, T2, T3, T4, void, void, void, void>
    377   : public ArrayBase<ArrayElement<T1, T2, T3, T4, void, void, void, void> >
     404  : public ArrayBase<ArrayElement<T1, T2, T3, T4, void, void, void, void>,
     405                     Array<T1, T2, T3, T4> >
    378406{
    379407public:
     
    402430template<typename T1, typename T2, typename T3>
    403431class Array<T1, T2, T3, void, void, void, void, void>
    404   : public ArrayBase<ArrayElement<T1, T2, T3, void, void, void, void, void> >
     432  : public ArrayBase<ArrayElement<T1, T2, T3, void, void, void, void, void>,
     433                     Array<T1, T2, T3> >
    405434{
    406435public:
     
    427456template<typename T1, typename T2>
    428457class Array<T1, T2, void, void, void, void, void, void>
    429   : public ArrayBase<ArrayElement<T1, T2, void, void, void, void, void, void> >
     458  : public ArrayBase<ArrayElement<T1, T2, void, void, void, void, void, void>,
     459                     Array<T1, T2> >
    430460{
    431461public:
     
    449479
    450480template<typename T>
    451 class Array<T, void, void, void, void, void, void, void> : public ArrayBase<T>
     481class Array<T, void, void, void, void, void, void, void>
     482  : public ArrayBase<T,
     483                     Array<T> >
    452484{
    453485};
  • trunk/test/unit/array.cpp

    r1328 r1345  
    2525    void TearDown() {}
    2626
    27     LOLUNIT_TEST(ArrayFill)
     27    LOLUNIT_TEST(ArrayPush)
    2828    {
    2929        Array<int> a;
     
    3939    }
    4040
     41    LOLUNIT_TEST(ArrayPushWithShift)
     42    {
     43        Array<int> a;
     44        a << 0 << 1 << 2 << 3;
     45
     46        LOLUNIT_ASSERT_EQUAL(a[0], 0);
     47        LOLUNIT_ASSERT_EQUAL(a[1], 1);
     48        LOLUNIT_ASSERT_EQUAL(a[2], 2);
     49        LOLUNIT_ASSERT_EQUAL(a[3], 3);
     50    }
     51
    4152    LOLUNIT_TEST(ArrayCopy)
    4253    {
    4354        Array<int> a;
    44         a.Push(0);
    45         a.Push(1);
    46         a.Push(2);
    47         a.Push(3);
     55        a << 0 << 1 << 2 << 3;
    4856
    4957        Array<int> b = a;
     
    5866    {
    5967        Array<int> a;
    60         a.Push(0);
    61         a.Push(1);
    62         a.Push(2);
    63         a.Push(3);
     68        a << 0 << 1 << 2 << 3;
    6469        a.Remove(1);
    6570
     
    8388        LOLUNIT_ASSERT_EQUAL(a[0].m8, 0);
    8489    }
     90
     91    LOLUNIT_TEST(ArrayConcat)
     92    {
     93        Array<int> a, b;
     94        a << 0 << 1;
     95        b << 2 << 3;
     96
     97        Array<int> c = a + b;
     98        LOLUNIT_ASSERT_EQUAL(c[0], 0);
     99        LOLUNIT_ASSERT_EQUAL(c[1], 1);
     100        LOLUNIT_ASSERT_EQUAL(c[2], 2);
     101        LOLUNIT_ASSERT_EQUAL(c[3], 3);
     102    }
     103
     104    LOLUNIT_TEST(ArrayAppend)
     105    {
     106        Array<int> a, b;
     107        a << 0 << 1;
     108        b << 2 << 3;
     109
     110        a += b;
     111        LOLUNIT_ASSERT_EQUAL(a[0], 0);
     112        LOLUNIT_ASSERT_EQUAL(a[1], 1);
     113        LOLUNIT_ASSERT_EQUAL(a[2], 2);
     114        LOLUNIT_ASSERT_EQUAL(a[3], 3);
     115
     116        b += b;
     117        LOLUNIT_ASSERT_EQUAL(b[0], 2);
     118        LOLUNIT_ASSERT_EQUAL(b[1], 3);
     119        LOLUNIT_ASSERT_EQUAL(b[2], 2);
     120        LOLUNIT_ASSERT_EQUAL(b[3], 3);
     121    }
    85122};
    86123
Note: See TracChangeset for help on using the changeset viewer.