Home | History | Annotate | Download | only in list.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 // <list>
     11 
     12 // void splice(const_iterator position, list<T,Allocator>& x, iterator i);
     13 
     14 #if _LIBCPP_DEBUG >= 1
     15 #define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
     16 #endif
     17 
     18 #include <list>
     19 #include <cassert>
     20 
     21 #include "min_allocator.h"
     22 
     23 int main()
     24 {
     25     int a1[] = {1, 2, 3};
     26     int a2[] = {4, 5, 6};
     27     {
     28         std::list<int> l1;
     29         std::list<int> l2(a2, a2+1);
     30         l1.splice(l1.end(), l2, l2.begin());
     31         assert(l1.size() == 1);
     32         assert(distance(l1.begin(), l1.end()) == 1);
     33         assert(l2.size() == 0);
     34         assert(distance(l2.begin(), l2.end()) == 0);
     35         std::list<int>::const_iterator i = l1.begin();
     36         assert(*i == 4);
     37     }
     38     {
     39         std::list<int> l1;
     40         std::list<int> l2(a2, a2+2);
     41         l1.splice(l1.end(), l2, l2.begin());
     42         assert(l1.size() == 1);
     43         assert(distance(l1.begin(), l1.end()) == 1);
     44         assert(l2.size() == 1);
     45         assert(distance(l2.begin(), l2.end()) == 1);
     46         std::list<int>::const_iterator i = l1.begin();
     47         assert(*i == 4);
     48         i = l2.begin();
     49         assert(*i == 5);
     50     }
     51     {
     52         std::list<int> l1;
     53         std::list<int> l2(a2, a2+2);
     54         l1.splice(l1.end(), l2, next(l2.begin()));
     55         assert(l1.size() == 1);
     56         assert(distance(l1.begin(), l1.end()) == 1);
     57         assert(l2.size() == 1);
     58         assert(distance(l2.begin(), l2.end()) == 1);
     59         std::list<int>::const_iterator i = l1.begin();
     60         assert(*i == 5);
     61         i = l2.begin();
     62         assert(*i == 4);
     63     }
     64     {
     65         std::list<int> l1;
     66         std::list<int> l2(a2, a2+3);
     67         l1.splice(l1.end(), l2, l2.begin());
     68         assert(l1.size() == 1);
     69         assert(distance(l1.begin(), l1.end()) == 1);
     70         assert(l2.size() == 2);
     71         assert(distance(l2.begin(), l2.end()) == 2);
     72         std::list<int>::const_iterator i = l1.begin();
     73         assert(*i == 4);
     74         i = l2.begin();
     75         assert(*i == 5);
     76         ++i;
     77         assert(*i == 6);
     78     }
     79     {
     80         std::list<int> l1;
     81         std::list<int> l2(a2, a2+3);
     82         l1.splice(l1.end(), l2, next(l2.begin()));
     83         assert(l1.size() == 1);
     84         assert(distance(l1.begin(), l1.end()) == 1);
     85         assert(l2.size() == 2);
     86         assert(distance(l2.begin(), l2.end()) == 2);
     87         std::list<int>::const_iterator i = l1.begin();
     88         assert(*i == 5);
     89         i = l2.begin();
     90         assert(*i == 4);
     91         ++i;
     92         assert(*i == 6);
     93     }
     94     {
     95         std::list<int> l1;
     96         std::list<int> l2(a2, a2+3);
     97         l1.splice(l1.end(), l2, next(l2.begin(), 2));
     98         assert(l1.size() == 1);
     99         assert(distance(l1.begin(), l1.end()) == 1);
    100         assert(l2.size() == 2);
    101         assert(distance(l2.begin(), l2.end()) == 2);
    102         std::list<int>::const_iterator i = l1.begin();
    103         assert(*i == 6);
    104         i = l2.begin();
    105         assert(*i == 4);
    106         ++i;
    107         assert(*i == 5);
    108     }
    109     {
    110         std::list<int> l1(a1, a1+1);
    111         l1.splice(l1.begin(), l1, l1.begin());
    112         assert(l1.size() == 1);
    113         assert(distance(l1.begin(), l1.end()) == 1);
    114         std::list<int>::const_iterator i = l1.begin();
    115         assert(*i == 1);
    116     }
    117     {
    118         std::list<int> l1(a1, a1+1);
    119         std::list<int> l2(a2, a2+1);
    120         l1.splice(l1.begin(), l2, l2.begin());
    121         assert(l1.size() == 2);
    122         assert(distance(l1.begin(), l1.end()) == 2);
    123         assert(l2.size() == 0);
    124         assert(distance(l2.begin(), l2.end()) == 0);
    125         std::list<int>::const_iterator i = l1.begin();
    126         assert(*i == 4);
    127         ++i;
    128         assert(*i == 1);
    129     }
    130     {
    131         std::list<int> l1(a1, a1+1);
    132         std::list<int> l2(a2, a2+1);
    133         l1.splice(next(l1.begin()), l2, l2.begin());
    134         assert(l1.size() == 2);
    135         assert(distance(l1.begin(), l1.end()) == 2);
    136         assert(l2.size() == 0);
    137         assert(distance(l2.begin(), l2.end()) == 0);
    138         std::list<int>::const_iterator i = l1.begin();
    139         assert(*i == 1);
    140         ++i;
    141         assert(*i == 4);
    142     }
    143     {
    144         std::list<int> l1(a1, a1+2);
    145         l1.splice(l1.begin(), l1, l1.begin());
    146         assert(l1.size() == 2);
    147         assert(distance(l1.begin(), l1.end()) == 2);
    148         std::list<int>::const_iterator i = l1.begin();
    149         assert(*i == 1);
    150         ++i;
    151         assert(*i == 2);
    152     }
    153     {
    154         std::list<int> l1(a1, a1+2);
    155         l1.splice(l1.begin(), l1, next(l1.begin()));
    156         assert(l1.size() == 2);
    157         assert(distance(l1.begin(), l1.end()) == 2);
    158         std::list<int>::const_iterator i = l1.begin();
    159         assert(*i == 2);
    160         ++i;
    161         assert(*i == 1);
    162     }
    163     {
    164         std::list<int> l1(a1, a1+2);
    165         l1.splice(next(l1.begin()), l1, l1.begin());
    166         assert(l1.size() == 2);
    167         assert(distance(l1.begin(), l1.end()) == 2);
    168         std::list<int>::const_iterator i = l1.begin();
    169         assert(*i == 1);
    170         ++i;
    171         assert(*i == 2);
    172     }
    173     {
    174         std::list<int> l1(a1, a1+2);
    175         l1.splice(next(l1.begin()), l1, next(l1.begin()));
    176         assert(l1.size() == 2);
    177         assert(distance(l1.begin(), l1.end()) == 2);
    178         std::list<int>::const_iterator i = l1.begin();
    179         assert(*i == 1);
    180         ++i;
    181         assert(*i == 2);
    182     }
    183 #if _LIBCPP_DEBUG >= 1
    184     {
    185         std::list<int> v1(3);
    186         std::list<int> v2(3);
    187         v1.splice(v1.begin(), v2, v1.begin());
    188         assert(false);
    189     }
    190 #endif
    191 #if __cplusplus >= 201103L
    192     {
    193         std::list<int, min_allocator<int>> l1;
    194         std::list<int, min_allocator<int>> l2(a2, a2+1);
    195         l1.splice(l1.end(), l2, l2.begin());
    196         assert(l1.size() == 1);
    197         assert(distance(l1.begin(), l1.end()) == 1);
    198         assert(l2.size() == 0);
    199         assert(distance(l2.begin(), l2.end()) == 0);
    200         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    201         assert(*i == 4);
    202     }
    203     {
    204         std::list<int, min_allocator<int>> l1;
    205         std::list<int, min_allocator<int>> l2(a2, a2+2);
    206         l1.splice(l1.end(), l2, l2.begin());
    207         assert(l1.size() == 1);
    208         assert(distance(l1.begin(), l1.end()) == 1);
    209         assert(l2.size() == 1);
    210         assert(distance(l2.begin(), l2.end()) == 1);
    211         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    212         assert(*i == 4);
    213         i = l2.begin();
    214         assert(*i == 5);
    215     }
    216     {
    217         std::list<int, min_allocator<int>> l1;
    218         std::list<int, min_allocator<int>> l2(a2, a2+2);
    219         l1.splice(l1.end(), l2, next(l2.begin()));
    220         assert(l1.size() == 1);
    221         assert(distance(l1.begin(), l1.end()) == 1);
    222         assert(l2.size() == 1);
    223         assert(distance(l2.begin(), l2.end()) == 1);
    224         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    225         assert(*i == 5);
    226         i = l2.begin();
    227         assert(*i == 4);
    228     }
    229     {
    230         std::list<int, min_allocator<int>> l1;
    231         std::list<int, min_allocator<int>> l2(a2, a2+3);
    232         l1.splice(l1.end(), l2, l2.begin());
    233         assert(l1.size() == 1);
    234         assert(distance(l1.begin(), l1.end()) == 1);
    235         assert(l2.size() == 2);
    236         assert(distance(l2.begin(), l2.end()) == 2);
    237         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    238         assert(*i == 4);
    239         i = l2.begin();
    240         assert(*i == 5);
    241         ++i;
    242         assert(*i == 6);
    243     }
    244     {
    245         std::list<int, min_allocator<int>> l1;
    246         std::list<int, min_allocator<int>> l2(a2, a2+3);
    247         l1.splice(l1.end(), l2, next(l2.begin()));
    248         assert(l1.size() == 1);
    249         assert(distance(l1.begin(), l1.end()) == 1);
    250         assert(l2.size() == 2);
    251         assert(distance(l2.begin(), l2.end()) == 2);
    252         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    253         assert(*i == 5);
    254         i = l2.begin();
    255         assert(*i == 4);
    256         ++i;
    257         assert(*i == 6);
    258     }
    259     {
    260         std::list<int, min_allocator<int>> l1;
    261         std::list<int, min_allocator<int>> l2(a2, a2+3);
    262         l1.splice(l1.end(), l2, next(l2.begin(), 2));
    263         assert(l1.size() == 1);
    264         assert(distance(l1.begin(), l1.end()) == 1);
    265         assert(l2.size() == 2);
    266         assert(distance(l2.begin(), l2.end()) == 2);
    267         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    268         assert(*i == 6);
    269         i = l2.begin();
    270         assert(*i == 4);
    271         ++i;
    272         assert(*i == 5);
    273     }
    274     {
    275         std::list<int, min_allocator<int>> l1(a1, a1+1);
    276         l1.splice(l1.begin(), l1, l1.begin());
    277         assert(l1.size() == 1);
    278         assert(distance(l1.begin(), l1.end()) == 1);
    279         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    280         assert(*i == 1);
    281     }
    282     {
    283         std::list<int, min_allocator<int>> l1(a1, a1+1);
    284         std::list<int, min_allocator<int>> l2(a2, a2+1);
    285         l1.splice(l1.begin(), l2, l2.begin());
    286         assert(l1.size() == 2);
    287         assert(distance(l1.begin(), l1.end()) == 2);
    288         assert(l2.size() == 0);
    289         assert(distance(l2.begin(), l2.end()) == 0);
    290         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    291         assert(*i == 4);
    292         ++i;
    293         assert(*i == 1);
    294     }
    295     {
    296         std::list<int, min_allocator<int>> l1(a1, a1+1);
    297         std::list<int, min_allocator<int>> l2(a2, a2+1);
    298         l1.splice(next(l1.begin()), l2, l2.begin());
    299         assert(l1.size() == 2);
    300         assert(distance(l1.begin(), l1.end()) == 2);
    301         assert(l2.size() == 0);
    302         assert(distance(l2.begin(), l2.end()) == 0);
    303         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    304         assert(*i == 1);
    305         ++i;
    306         assert(*i == 4);
    307     }
    308     {
    309         std::list<int, min_allocator<int>> l1(a1, a1+2);
    310         l1.splice(l1.begin(), l1, l1.begin());
    311         assert(l1.size() == 2);
    312         assert(distance(l1.begin(), l1.end()) == 2);
    313         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    314         assert(*i == 1);
    315         ++i;
    316         assert(*i == 2);
    317     }
    318     {
    319         std::list<int, min_allocator<int>> l1(a1, a1+2);
    320         l1.splice(l1.begin(), l1, next(l1.begin()));
    321         assert(l1.size() == 2);
    322         assert(distance(l1.begin(), l1.end()) == 2);
    323         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    324         assert(*i == 2);
    325         ++i;
    326         assert(*i == 1);
    327     }
    328     {
    329         std::list<int, min_allocator<int>> l1(a1, a1+2);
    330         l1.splice(next(l1.begin()), l1, l1.begin());
    331         assert(l1.size() == 2);
    332         assert(distance(l1.begin(), l1.end()) == 2);
    333         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    334         assert(*i == 1);
    335         ++i;
    336         assert(*i == 2);
    337     }
    338     {
    339         std::list<int, min_allocator<int>> l1(a1, a1+2);
    340         l1.splice(next(l1.begin()), l1, next(l1.begin()));
    341         assert(l1.size() == 2);
    342         assert(distance(l1.begin(), l1.end()) == 2);
    343         std::list<int, min_allocator<int>>::const_iterator i = l1.begin();
    344         assert(*i == 1);
    345         ++i;
    346         assert(*i == 2);
    347     }
    348 #if _LIBCPP_DEBUG >= 1
    349     {
    350         std::list<int, min_allocator<int>> v1(3);
    351         std::list<int, min_allocator<int>> v2(3);
    352         v1.splice(v1.begin(), v2, v1.begin());
    353         assert(false);
    354     }
    355 #endif
    356 #endif
    357 }
    358