• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 // <deque>
11 
12 // template <class T, class A>
13 //   void swap(deque<T, A>& x, deque<T, A>& y);
14 
15 #include <deque>
16 #include <cassert>
17 #include "../../../test_allocator.h"
18 
19 std::deque<int>
make(int size,int start=0)20 make(int size, int start = 0 )
21 {
22     const int b = 4096 / sizeof(int);
23     int init = 0;
24     if (start > 0)
25     {
26         init = (start+1) / b + ((start+1) % b != 0);
27         init *= b;
28         --init;
29     }
30     std::deque<int> c(init, 0);
31     for (int i = 0; i < init-start; ++i)
32         c.pop_back();
33     for (int i = 0; i < size; ++i)
34         c.push_back(i);
35     for (int i = 0; i < start; ++i)
36         c.pop_front();
37     return c;
38 };
39 
testN(int start,int N,int M)40 void testN(int start, int N, int M)
41 {
42     typedef std::deque<int> C;
43     C c1 = make(N, start);
44     C c2 = make(M);
45     C c1_save = c1;
46     C c2_save = c2;
47     swap(c1, c2);
48     assert(c1 == c2_save);
49     assert(c2 == c1_save);
50 }
51 
main()52 int main()
53 {
54     {
55         int rng[] = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};
56         const int N = sizeof(rng)/sizeof(rng[0]);
57         for (int i = 0; i < N; ++i)
58             for (int j = 0; j < N; ++j)
59                 for (int k = 0; k < N; ++k)
60                     testN(rng[i], rng[j], rng[k]);
61     }
62     {
63         int a1[] = {1, 3, 7, 9, 10};
64         int a2[] = {0, 2, 4, 5, 6, 8, 11};
65         typedef test_allocator<int> A;
66         std::deque<int, A> c1(a1, a1+sizeof(a1)/sizeof(a1[0]), A(1));
67         std::deque<int, A> c2(a2, a2+sizeof(a2)/sizeof(a2[0]), A(2));
68         swap(c1, c2);
69         assert((c1 == std::deque<int, A>(a2, a2+sizeof(a2)/sizeof(a2[0]))));
70         assert(c1.get_allocator() == A(1));
71         assert((c2 == std::deque<int, A>(a1, a1+sizeof(a1)/sizeof(a1[0]))));
72         assert(c2.get_allocator() == A(2));
73     }
74     {
75         int a1[] = {1, 3, 7, 9, 10};
76         int a2[] = {0, 2, 4, 5, 6, 8, 11};
77         typedef other_allocator<int> A;
78         std::deque<int, A> c1(a1, a1+sizeof(a1)/sizeof(a1[0]), A(1));
79         std::deque<int, A> c2(a2, a2+sizeof(a2)/sizeof(a2[0]), A(2));
80         swap(c1, c2);
81         assert((c1 == std::deque<int, A>(a2, a2+sizeof(a2)/sizeof(a2[0]))));
82         assert(c1.get_allocator() == A(2));
83         assert((c2 == std::deque<int, A>(a1, a1+sizeof(a1)/sizeof(a1[0]))));
84         assert(c2.get_allocator() == A(1));
85     }
86 }
87