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//       reference operator[](size_type __i);
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// const_reference operator[](size_type __i) const;
146046aced820aaab4f14f2026531dd11d10690691Howard Hinnant//
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//       reference at(size_type __i);
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// const_reference at(size_type __i) const;
176046aced820aaab4f14f2026531dd11d10690691Howard Hinnant//
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//       reference front();
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// const_reference front() const;
206046aced820aaab4f14f2026531dd11d10690691Howard Hinnant//
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//       reference back();
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// const_reference back() const;
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <deque>
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
27061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
28fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant
29fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnanttemplate <class C>
30fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard HinnantC
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmake(int size, int start = 0 )
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int b = 4096 / sizeof(int);
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int init = 0;
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (start > 0)
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        init = (start+1) / b + ((start+1) % b != 0);
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        init *= b;
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        --init;
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
41fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    C c(init, 0);
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < init-start; ++i)
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.pop_back();
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < size; ++i)
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.push_back(i);
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < start; ++i)
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        c.pop_front();
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return c;
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
54fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        std::deque<int> c = make<std::deque<int> >(10);
55fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        for (unsigned i = 0; i < 10; ++i)
56fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            assert(c[i] == i);
57fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        for (unsigned i = 0; i < 10; ++i)
58fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            assert(c.at(i) == i);
59fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        assert(c.front() == 0);
60fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        assert(c.back() == 9);
61fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    }
62fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    {
63fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        const std::deque<int> c = make<std::deque<int> >(10);
64fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        for (unsigned i = 0; i < 10; ++i)
65fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            assert(c[i] == i);
66fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        for (unsigned i = 0; i < 10; ++i)
67fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant            assert(c.at(i) == i);
68fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        assert(c.front() == 0);
69fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        assert(c.back() == 9);
70fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    }
71fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant#if __cplusplus >= 201103L
72fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant    {
73fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        std::deque<int, min_allocator<int>> c = make<std::deque<int, min_allocator<int>> >(10);
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < 10; ++i)
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(c[i] == i);
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < 10; ++i)
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(c.at(i) == i);
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front() == 0);
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.back() == 9);
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
82fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant        const std::deque<int, min_allocator<int>> c = make<std::deque<int, min_allocator<int>> >(10);
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < 10; ++i)
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(c[i] == i);
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < 10; ++i)
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            assert(c.at(i) == i);
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.front() == 0);
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(c.back() == 9);
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
90fcd8db7133c56a5a627f3922ce4a180c12287dd9Howard Hinnant#endif
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
92