Home | History | Annotate | Download | only in list.modifiers
      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 // template <InputIterator Iter>
     13 //   iterator insert(const_iterator position, Iter first, Iter last);
     14 
     15 #if _LIBCPP_DEBUG >= 1
     16 #define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
     17 #endif
     18 
     19 #include <list>
     20 #include <cstdlib>
     21 #include <cassert>
     22 #include "test_iterators.h"
     23 #include "min_allocator.h"
     24 
     25 int throw_next = 0xFFFF;
     26 int count = 0;
     27 
     28 void* operator new(std::size_t s) throw(std::bad_alloc)
     29 {
     30     if (throw_next == 0)
     31         throw std::bad_alloc();
     32     --throw_next;
     33     ++count;
     34     return std::malloc(s);
     35 }
     36 
     37 void  operator delete(void* p) throw()
     38 {
     39     --count;
     40     std::free(p);
     41 }
     42 
     43 int main()
     44 {
     45     {
     46     int a1[] = {1, 2, 3};
     47     std::list<int> l1;
     48     std::list<int>::iterator i = l1.insert(l1.begin(), a1, a1+3);
     49     assert(i == l1.begin());
     50     assert(l1.size() == 3);
     51     assert(distance(l1.begin(), l1.end()) == 3);
     52     i = l1.begin();
     53     assert(*i == 1);
     54     ++i;
     55     assert(*i == 2);
     56     ++i;
     57     assert(*i == 3);
     58     int a2[] = {4, 5, 6};
     59     i = l1.insert(i, a2, a2+3);
     60     assert(*i == 4);
     61     assert(l1.size() == 6);
     62     assert(distance(l1.begin(), l1.end()) == 6);
     63     i = l1.begin();
     64     assert(*i == 1);
     65     ++i;
     66     assert(*i == 2);
     67     ++i;
     68     assert(*i == 4);
     69     ++i;
     70     assert(*i == 5);
     71     ++i;
     72     assert(*i == 6);
     73     ++i;
     74     assert(*i == 3);
     75     throw_next = 2;
     76     int save_count = count;
     77     try
     78     {
     79         i = l1.insert(i, a2, a2+3);
     80         assert(false);
     81     }
     82     catch (...)
     83     {
     84     }
     85     assert(save_count == count);
     86     assert(l1.size() == 6);
     87     assert(distance(l1.begin(), l1.end()) == 6);
     88     i = l1.begin();
     89     assert(*i == 1);
     90     ++i;
     91     assert(*i == 2);
     92     ++i;
     93     assert(*i == 4);
     94     ++i;
     95     assert(*i == 5);
     96     ++i;
     97     assert(*i == 6);
     98     ++i;
     99     assert(*i == 3);
    100     }
    101     throw_next = 0xFFFF;
    102 #if _LIBCPP_DEBUG >= 1
    103     {
    104         std::list<int> v(100);
    105         std::list<int> v2(100);
    106         int a[] = {1, 2, 3, 4, 5};
    107         const int N = sizeof(a)/sizeof(a[0]);
    108         std::list<int>::iterator i = v.insert(next(v2.cbegin(), 10), input_iterator<const int*>(a),
    109                                        input_iterator<const int*>(a+N));
    110         assert(false);
    111     }
    112 #endif
    113 #if __cplusplus >= 201103L
    114     {
    115     int a1[] = {1, 2, 3};
    116     std::list<int, min_allocator<int>> l1;
    117     std::list<int, min_allocator<int>>::iterator i = l1.insert(l1.begin(), a1, a1+3);
    118     assert(i == l1.begin());
    119     assert(l1.size() == 3);
    120     assert(distance(l1.begin(), l1.end()) == 3);
    121     i = l1.begin();
    122     assert(*i == 1);
    123     ++i;
    124     assert(*i == 2);
    125     ++i;
    126     assert(*i == 3);
    127     int a2[] = {4, 5, 6};
    128     i = l1.insert(i, a2, a2+3);
    129     assert(*i == 4);
    130     assert(l1.size() == 6);
    131     assert(distance(l1.begin(), l1.end()) == 6);
    132     i = l1.begin();
    133     assert(*i == 1);
    134     ++i;
    135     assert(*i == 2);
    136     ++i;
    137     assert(*i == 4);
    138     ++i;
    139     assert(*i == 5);
    140     ++i;
    141     assert(*i == 6);
    142     ++i;
    143     assert(*i == 3);
    144     throw_next = 2;
    145     int save_count = count;
    146     try
    147     {
    148         i = l1.insert(i, a2, a2+3);
    149         assert(false);
    150     }
    151     catch (...)
    152     {
    153     }
    154     assert(save_count == count);
    155     assert(l1.size() == 6);
    156     assert(distance(l1.begin(), l1.end()) == 6);
    157     i = l1.begin();
    158     assert(*i == 1);
    159     ++i;
    160     assert(*i == 2);
    161     ++i;
    162     assert(*i == 4);
    163     ++i;
    164     assert(*i == 5);
    165     ++i;
    166     assert(*i == 6);
    167     ++i;
    168     assert(*i == 3);
    169     }
    170 #if _LIBCPP_DEBUG >= 1
    171     {
    172         throw_next = 0xFFFF;
    173         std::list<int, min_allocator<int>> v(100);
    174         std::list<int, min_allocator<int>> v2(100);
    175         int a[] = {1, 2, 3, 4, 5};
    176         const int N = sizeof(a)/sizeof(a[0]);
    177         std::list<int, min_allocator<int>>::iterator i = v.insert(next(v2.cbegin(), 10), input_iterator<const int*>(a),
    178                                        input_iterator<const int*>(a+N));
    179         assert(false);
    180     }
    181 #endif
    182 #endif
    183 }
    184