1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <deque>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class InputIterator>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   iterator insert (const_iterator p, InputIterator f, InputIterator l);
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <deque>
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1883e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h"
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../MoveOnly.h"
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../stack_allocator.h"
21061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
23fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
24fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard HinnantC
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmake(int size, int start = 0 )
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int b = 4096 / sizeof(int);
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int init = 0;
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (start > 0)
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        init = (start+1) / b + ((start+1) % b != 0);
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        init *= b;
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        --init;
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
35fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    C c(init, 0);
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < init-start; ++i)
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.pop_back();
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < size; ++i)
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.push_back(i);
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < start; ++i)
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.pop_front();
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return c;
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
45fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
47fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttest(int P, C& c1, const C& c2)
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
49fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::iterator I;
50fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::const_iterator CI;
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef bidirectional_iterator<CI> BCI;
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    std::size_t c1_osize = c1.size();
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    CI i = c1.insert(c1.begin() + P, BCI(c2.begin()), BCI(c2.end()));
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(i == c1.begin() + P);
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(c1.size() == c1_osize + c2.size());
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(distance(c1.begin(), c1.end()) == c1.size());
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    i = c1.begin();
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = 0; j < P; ++j, ++i)
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = 0; j < c2.size(); ++j, ++i)
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = P; j < c1_osize; ++j, ++i)
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
66fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnanttestN(int start, int N, int M)
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
70fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::iterator I;
71fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::const_iterator CI;
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i <= 3; ++i)
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
76fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
77fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = M-1; i <= M+1; ++i)
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
85fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
86fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N/2-1; i <= N/2+1; ++i)
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
94fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
95fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - M - 1; i <= N - M + 1; ++i)
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
103fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
104fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - M - 1; i <= N - M + 1; ++i)
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
112fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
113fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - 3; i <= N; ++i)
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
121fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
122fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
128fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
130fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard HinnanttestI(int P, C& c1, const C& c2)
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
132fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::iterator I;
133fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::const_iterator CI;
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef input_iterator<CI> ICI;
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    std::size_t c1_osize = c1.size();
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    CI i = c1.insert(c1.begin() + P, ICI(c2.begin()), ICI(c2.end()));
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(i == c1.begin() + P);
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(c1.size() == c1_osize + c2.size());
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(distance(c1.begin(), c1.end()) == c1.size());
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    i = c1.begin();
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = 0; j < P; ++j, ++i)
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = 0; j < c2.size(); ++j, ++i)
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = P; j < c1_osize; ++j, ++i)
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
149fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnanttestNI(int start, int N, int M)
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
153fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::iterator I;
154fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::const_iterator CI;
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i <= 3; ++i)
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
159fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
160fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = M-1; i <= M+1; ++i)
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
168fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
169fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N/2-1; i <= N/2+1; ++i)
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
177fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
178fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - M - 1; i <= N - M + 1; ++i)
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
186fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
187fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - 3; i <= N; ++i)
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
195fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
196fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
202fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest_move()
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
20673d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
207fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    C c;
208fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::const_iterator CI;
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        MoveOnly mo(0);
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef MoveOnly* I;
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.insert(c.end(), std::move_iterator<I>(&mo), std::move_iterator<I>(&mo+1));
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int j = 0;
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (CI i = c.begin(); i != c.end(); ++i, ++j)
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == MoveOnly(j));
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        MoveOnly mo(1);
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef input_iterator<MoveOnly*> I;
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.insert(c.end(), std::move_iterator<I>(I(&mo)), std::move_iterator<I>(I(&mo+1)));
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    j = 0;
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (CI i = c.begin(); i != c.end(); ++i, ++j)
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == MoveOnly(j));
22573d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
230fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    {
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int rng[] = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int N = sizeof(rng)/sizeof(rng[0]);
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < N; ++i)
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (int j = 0; j < N; ++j)
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (int k = 0; k < N; ++k)
236fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant                testN<std::deque<int> >(rng[i], rng[j], rng[k]);
237fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    testNI<std::deque<int> >(1500, 2000, 1000);
238fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
239fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    test_move<std::deque<MoveOnly, stack_allocator<MoveOnly, 2000> > >();
240fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
241fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    }
242fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant#if __cplusplus >= 201103L
243fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    {
244fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    int rng[] = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};
245fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    const int N = sizeof(rng)/sizeof(rng[0]);
246fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    for (int i = 0; i < N; ++i)
247fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        for (int j = 0; j < N; ++j)
248fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            for (int k = 0; k < N; ++k)
249fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant                testN<std::deque<int, min_allocator<int>> >(rng[i], rng[j], rng[k]);
250fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    testNI<std::deque<int> >(1500, 2000, 1000);
251fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    test_move<std::deque<MoveOnly, min_allocator<MoveOnly> > >();
252fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    }
253fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant#endif
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
255