Home | History | Annotate | Download | only in forwardlist.ops
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <forward_list>
     11 
     12 // void splice_after(const_iterator p, forward_list&& x, const_iterator i);
     13 
     14 #include <forward_list>
     15 #include <cassert>
     16 #include <iterator>
     17 #include <cstddef>
     18 
     19 #include "test_macros.h"
     20 #include "min_allocator.h"
     21 
     22 typedef int T;
     23 const T t1[] = {0, 1, 2, 3, 4, 5, 6, 7};
     24 const T t2[] = {10, 11, 12};
     25 const std::ptrdiff_t size_t1 = std::end(t1) - std::begin(t1);
     26 const std::ptrdiff_t size_t2 = std::end(t2) - std::begin(t2);
     27 
     28 template <class C>
     29 void
     30 testd(const C& c, int p, int f)
     31 {
     32     typename C::const_iterator i = c.begin();
     33     int n1 = 0;
     34     for (; n1 < p; ++n1, ++i)
     35         assert(*i == t1[n1]);
     36     for (int n2 = f; n2 < f+1; ++n2, ++i)
     37         assert(*i == t2[n2]);
     38     for (; n1 < size_t1; ++n1, ++i)
     39         assert(*i == t1[n1]);
     40     assert(distance(c.begin(), c.end()) == size_t1 + 1);
     41 }
     42 
     43 template <class C>
     44 void
     45 tests(const C& c, int p, int f)
     46 {
     47     typename C::const_iterator i = c.begin();
     48     int n = 0;
     49     if (p == f || p == f+1)
     50     {
     51         for (n = 0; n < size_t1; ++n, ++i)
     52             assert(*i == t1[n]);
     53     }
     54     else if (p < f)
     55     {
     56         for (n = 0; n < p; ++n, ++i)
     57             assert(*i == t1[n]);
     58         for (n = f; n < f+1; ++n, ++i)
     59             assert(*i == t1[n]);
     60         for (n = p; n < f; ++n, ++i)
     61             assert(*i == t1[n]);
     62         for (n = f+1; n < size_t1; ++n, ++i)
     63             assert(*i == t1[n]);
     64     }
     65     else // p > f+1
     66     {
     67         for (n = 0; n < f; ++n, ++i)
     68             assert(*i == t1[n]);
     69         for (n = f+1; n < p; ++n, ++i)
     70             assert(*i == t1[n]);
     71         for (n = f; n < f+1; ++n, ++i)
     72             assert(*i == t1[n]);
     73         for (n = p; n < size_t1; ++n, ++i)
     74             assert(*i == t1[n]);
     75     }
     76     assert(distance(c.begin(), c.end()) == size_t1);
     77 }
     78 
     79 int main()
     80 {
     81     {
     82     // splicing different containers
     83     typedef std::forward_list<T> C;
     84     for (int f = 0; f <= size_t2-1; ++f)
     85     {
     86         for (int p = 0; p <= size_t1; ++p)
     87         {
     88             C c1(std::begin(t1), std::end(t1));
     89             C c2(std::begin(t2), std::end(t2));
     90 
     91             c1.splice_after(next(c1.cbefore_begin(), p), std::move(c2),
     92                   next(c2.cbefore_begin(), f));
     93             testd(c1, p, f);
     94         }
     95     }
     96 
     97     // splicing within same container
     98     for (int f = 0; f <= size_t1-1; ++f)
     99     {
    100         for (int p = 0; p <= size_t1; ++p)
    101         {
    102             C c1(std::begin(t1), std::end(t1));
    103 
    104             c1.splice_after(next(c1.cbefore_begin(), p), std::move(c1),
    105                   next(c1.cbefore_begin(), f));
    106             tests(c1, p, f);
    107         }
    108     }
    109     }
    110 #if TEST_STD_VER >= 11
    111     {
    112     // splicing different containers
    113     typedef std::forward_list<T, min_allocator<T>> C;
    114     for (int f = 0; f <= size_t2-1; ++f)
    115     {
    116         for (int p = 0; p <= size_t1; ++p)
    117         {
    118             C c1(std::begin(t1), std::end(t1));
    119             C c2(std::begin(t2), std::end(t2));
    120 
    121             c1.splice_after(next(c1.cbefore_begin(), p), std::move(c2),
    122                   next(c2.cbefore_begin(), f));
    123             testd(c1, p, f);
    124         }
    125     }
    126 
    127     // splicing within same container
    128     for (int f = 0; f <= size_t1-1; ++f)
    129     {
    130         for (int p = 0; p <= size_t1; ++p)
    131         {
    132             C c1(std::begin(t1), std::end(t1));
    133 
    134             c1.splice_after(next(c1.cbefore_begin(), p), std::move(c1),
    135                   next(c1.cbefore_begin(), f));
    136             tests(c1, p, f);
    137         }
    138     }
    139     }
    140 #endif
    141 }
    142