Home | History | Annotate | Download | only in list.special
      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 <class T, class Alloc>
     13 //   void swap(list<T,Alloc>& x, list<T,Alloc>& y);
     14 
     15 #include <list>
     16 #include <cassert>
     17 #include "../../../test_allocator.h"
     18 
     19 int main()
     20 {
     21     {
     22         int a1[] = {1, 3, 7, 9, 10};
     23         int a2[] = {0, 2, 4, 5, 6, 8, 11};
     24         std::list<int> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));
     25         std::list<int> c2(a2, a2+sizeof(a2)/sizeof(a2[0]));
     26         swap(c1, c2);
     27         assert(c1 == std::list<int>(a2, a2+sizeof(a2)/sizeof(a2[0])));
     28         assert(c2 == std::list<int>(a1, a1+sizeof(a1)/sizeof(a1[0])));
     29     }
     30     {
     31         int a1[] = {1, 3, 7, 9, 10};
     32         int a2[] = {0, 2, 4, 5, 6, 8, 11};
     33         std::list<int> c1(a1, a1);
     34         std::list<int> c2(a2, a2+sizeof(a2)/sizeof(a2[0]));
     35         swap(c1, c2);
     36         assert(c1 == std::list<int>(a2, a2+sizeof(a2)/sizeof(a2[0])));
     37         assert(c2.empty());
     38         assert(distance(c2.begin(), c2.end()) == 0);
     39     }
     40     {
     41         int a1[] = {1, 3, 7, 9, 10};
     42         int a2[] = {0, 2, 4, 5, 6, 8, 11};
     43         std::list<int> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));
     44         std::list<int> c2(a2, a2);
     45         swap(c1, c2);
     46         assert(c1.empty());
     47         assert(distance(c1.begin(), c1.end()) == 0);
     48         assert(c2 == std::list<int>(a1, a1+sizeof(a1)/sizeof(a1[0])));
     49     }
     50     {
     51         int a1[] = {1, 3, 7, 9, 10};
     52         int a2[] = {0, 2, 4, 5, 6, 8, 11};
     53         std::list<int> c1(a1, a1);
     54         std::list<int> c2(a2, a2);
     55         swap(c1, c2);
     56         assert(c1.empty());
     57         assert(distance(c1.begin(), c1.end()) == 0);
     58         assert(c2.empty());
     59         assert(distance(c2.begin(), c2.end()) == 0);
     60     }
     61 #ifndef _LIBCPP_DEBUG_LEVEL
     62 // This test known to result in undefined behavior detected by _LIBCPP_DEBUG_LEVEL >= 1
     63     {
     64         int a1[] = {1, 3, 7, 9, 10};
     65         int a2[] = {0, 2, 4, 5, 6, 8, 11};
     66         typedef test_allocator<int> A;
     67         std::list<int, A> c1(a1, a1+sizeof(a1)/sizeof(a1[0]), A(1));
     68         std::list<int, A> c2(a2, a2+sizeof(a2)/sizeof(a2[0]), A(2));
     69         swap(c1, c2);
     70         assert((c1 == std::list<int, A>(a2, a2+sizeof(a2)/sizeof(a2[0]))));
     71         assert(c1.get_allocator() == A(1));
     72         assert((c2 == std::list<int, A>(a1, a1+sizeof(a1)/sizeof(a1[0]))));
     73         assert(c2.get_allocator() == A(2));
     74     }
     75 #endif
     76     {
     77         int a1[] = {1, 3, 7, 9, 10};
     78         int a2[] = {0, 2, 4, 5, 6, 8, 11};
     79         typedef other_allocator<int> A;
     80         std::list<int, A> c1(a1, a1+sizeof(a1)/sizeof(a1[0]), A(1));
     81         std::list<int, A> c2(a2, a2+sizeof(a2)/sizeof(a2[0]), A(2));
     82         swap(c1, c2);
     83         assert((c1 == std::list<int, A>(a2, a2+sizeof(a2)/sizeof(a2[0]))));
     84         assert(c1.get_allocator() == A(2));
     85         assert((c2 == std::list<int, A>(a1, a1+sizeof(a1)/sizeof(a1[0]))));
     86         assert(c2.get_allocator() == A(1));
     87     }
     88 }
     89