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//===----------------------------------------------------------------------===//
95030eaf65db689246a7d4e6f327f5a34d406e98fJonathan Roelofs//
105030eaf65db689246a7d4e6f327f5a34d406e98fJonathan Roelofs// REQUIRES: long_tests
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <deque>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class InputIterator>
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   iterator insert (const_iterator p, InputIterator f, InputIterator l);
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <deque>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2018dbed95969596840835876627ecd102b4fc51e1Eric Fiselier#include "test_macros.h"
2183e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h"
22df00d5e5ad672aa275a29c5a446072959134adddMarshall Clow#include "MoveOnly.h"
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "../../../stack_allocator.h"
24061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
26fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
27fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard HinnantC
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmake(int size, int start = 0 )
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int b = 4096 / sizeof(int);
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int init = 0;
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (start > 0)
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        init = (start+1) / b + ((start+1) % b != 0);
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        init *= b;
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        --init;
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
38fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    C c(init, 0);
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < init-start; ++i)
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.pop_back();
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < size; ++i)
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.push_back(i);
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < start; ++i)
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.pop_front();
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return c;
465495e2efb9ea9fcb273ebed2f92b912ace28e82bEric Fiselier}
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
48fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
503150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clowtest(int P, const C& c0, const C& c2)
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
523150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    {
533150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    typedef typename C::const_iterator CI;
543150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    typedef input_iterator<CI> BCI;
553150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    C c1 = c0;
563150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    std::size_t c1_osize = c1.size();
573150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    CI i = c1.insert(c1.begin() + P, BCI(c2.begin()), BCI(c2.end()));
583150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    assert(i == c1.begin() + P);
593150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    assert(c1.size() == c1_osize + c2.size());
603150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    assert(distance(c1.begin(), c1.end()) == c1.size());
613150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    i = c1.begin();
623150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    for (int j = 0; j < P; ++j, ++i)
633150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow        assert(*i == j);
643150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    for (int j = 0; j < c2.size(); ++j, ++i)
653150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow        assert(*i == j);
663150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    for (int j = P; j < c1_osize; ++j, ++i)
673150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow        assert(*i == j);
683150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    }
693150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    {
703150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    typedef typename C::const_iterator CI;
713150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    typedef forward_iterator<CI> BCI;
723150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    C c1 = c0;
733150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    std::size_t c1_osize = c1.size();
743150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    CI i = c1.insert(c1.begin() + P, BCI(c2.begin()), BCI(c2.end()));
753150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    assert(i == c1.begin() + P);
763150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    assert(c1.size() == c1_osize + c2.size());
773150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    assert(distance(c1.begin(), c1.end()) == c1.size());
783150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    i = c1.begin();
793150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    for (int j = 0; j < P; ++j, ++i)
803150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow        assert(*i == j);
813150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    for (int j = 0; j < c2.size(); ++j, ++i)
823150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow        assert(*i == j);
833150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    for (int j = P; j < c1_osize; ++j, ++i)
843150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow        assert(*i == j);
853150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    }
863150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    {
87fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::const_iterator CI;
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef bidirectional_iterator<CI> BCI;
893150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    C c1 = c0;
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    std::size_t c1_osize = c1.size();
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    CI i = c1.insert(c1.begin() + P, BCI(c2.begin()), BCI(c2.end()));
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(i == c1.begin() + P);
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(c1.size() == c1_osize + c2.size());
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(distance(c1.begin(), c1.end()) == c1.size());
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    i = c1.begin();
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = 0; j < P; ++j, ++i)
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = 0; j < c2.size(); ++j, ++i)
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = P; j < c1_osize; ++j, ++i)
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
1023150c3547a1774fa55ef4ef94b4a783f02d6d785Marshall Clow    }
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
105fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnanttestN(int start, int N, int M)
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i <= 3; ++i)
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
113fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
114fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = M-1; i <= M+1; ++i)
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
122fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
123fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N/2-1; i <= N/2+1; ++i)
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
131fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
132fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - M - 1; i <= N - M + 1; ++i)
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
140fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
141fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - M - 1; i <= N - M + 1; ++i)
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
149fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
150fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - 3; i <= N; ++i)
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
158fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
159fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            test(i, c1, c2);
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
165fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
167fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard HinnanttestI(int P, C& c1, const C& c2)
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
169fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::const_iterator CI;
170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef input_iterator<CI> ICI;
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    std::size_t c1_osize = c1.size();
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    CI i = c1.insert(c1.begin() + P, ICI(c2.begin()), ICI(c2.end()));
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(i == c1.begin() + P);
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(c1.size() == c1_osize + c2.size());
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(distance(c1.begin(), c1.end()) == c1.size());
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    i = c1.begin();
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = 0; j < P; ++j, ++i)
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = 0; j < c2.size(); ++j, ++i)
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int j = P; j < c1_osize; ++j, ++i)
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == j);
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
185fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnanttestNI(int start, int N, int M)
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i <= 3; ++i)
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
193fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
194fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = M-1; i <= M+1; ++i)
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
202fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
203fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N/2-1; i <= N/2+1; ++i)
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
211fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
212fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - M - 1; i <= N - M + 1; ++i)
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
220fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
221fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = N - 3; i <= N; ++i)
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 <= i && i <= N)
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
229fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c1 = make<C>(N, start);
230fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            C c2 = make<C>(M);
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            testI(i, c1, c2);
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
236fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest_move()
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
24018dbed95969596840835876627ecd102b4fc51e1Eric Fiselier#if TEST_STD_VER >= 11
241fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    C c;
242fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    typedef typename C::const_iterator CI;
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        MoveOnly mo(0);
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef MoveOnly* I;
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.insert(c.end(), std::move_iterator<I>(&mo), std::move_iterator<I>(&mo+1));
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int j = 0;
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (CI i = c.begin(); i != c.end(); ++i, ++j)
250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == MoveOnly(j));
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        MoveOnly mo(1);
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef input_iterator<MoveOnly*> I;
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.insert(c.end(), std::move_iterator<I>(I(&mo)), std::move_iterator<I>(I(&mo+1)));
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    j = 0;
257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (CI i = c.begin(); i != c.end(); ++i, ++j)
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*i == MoveOnly(j));
25918dbed95969596840835876627ecd102b4fc51e1Eric Fiselier#endif
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
264fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    {
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int rng[] = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int N = sizeof(rng)/sizeof(rng[0]);
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < N; ++i)
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (int j = 0; j < N; ++j)
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (int k = 0; k < N; ++k)
270fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant                testN<std::deque<int> >(rng[i], rng[j], rng[k]);
271fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    testNI<std::deque<int> >(1500, 2000, 1000);
27218dbed95969596840835876627ecd102b4fc51e1Eric Fiselier#if TEST_STD_VER >= 11
273fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    test_move<std::deque<MoveOnly, stack_allocator<MoveOnly, 2000> > >();
27418dbed95969596840835876627ecd102b4fc51e1Eric Fiselier#endif
275fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    }
27618dbed95969596840835876627ecd102b4fc51e1Eric Fiselier#if TEST_STD_VER >= 11
277fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    {
278fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    int rng[] = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};
279fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    const int N = sizeof(rng)/sizeof(rng[0]);
280fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    for (int i = 0; i < N; ++i)
281fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        for (int j = 0; j < N; ++j)
282fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            for (int k = 0; k < N; ++k)
283fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant                testN<std::deque<int, min_allocator<int>> >(rng[i], rng[j], rng[k]);
284fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    testNI<std::deque<int> >(1500, 2000, 1000);
285fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    test_move<std::deque<MoveOnly, min_allocator<MoveOnly> > >();
286fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    }
287fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant#endif
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
289