1a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//Has to be first for StackAllocator swap overload to be taken
2a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//into account (at least using GCC 4.0.1)
3a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include "stack_allocator.h"
4a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
5a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include <deque>
6a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include <algorithm>
7a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
8a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner# include <stdexcept>
9a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
10a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
11a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include "cppunit/cppunit_proxy.h"
12a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
13a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
14a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerusing namespace std;
15a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
16a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
17a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//
18a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner// TestCase class
19a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//
20a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerclass DequeTest : public CPPUNIT_NS::TestCase
21a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
22a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST_SUITE(DequeTest);
23a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(deque1);
24a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(at);
25a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(insert);
26a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(erase);
27a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(auto_ref);
28a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(allocator_with_state);
29a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (STLPORT) && defined (_STLP_NO_MEMBER_TEMPLATES)
30a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_IGNORE;
31a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
32a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(optimizations_check);
33a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST_SUITE_END();
34a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
35a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerprotected:
36a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void deque1();
37a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void insert();
38a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void erase();
39a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void at();
40a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void auto_ref();
41a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void allocator_with_state();
42a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void optimizations_check();
43a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner};
44a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
45a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' TurnerCPPUNIT_TEST_SUITE_REGISTRATION(DequeTest);
46a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
47a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//
48a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner// tests implementation
49a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//
50a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid DequeTest::deque1()
51a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
52a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int> d;
53a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.push_back(4);
54a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.push_back(9);
55a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.push_back(16);
56a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.push_front(1);
57a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
58a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[0] == 1 );
59a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[1] == 4 );
60a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[2] == 9 );
61a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[3] == 16 );
62a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
63a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.pop_front();
64a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d[2] = 25;
65a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
66a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[0] == 4 );
67a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[1] == 9 );
68a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[2] == 25 );
69a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
70a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Some compile time tests:
71a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int>::iterator dit = d.begin();
72a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int>::const_iterator cdit(d.begin());
73a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( (dit - cdit) == 0 );
74a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( (cdit - dit) == 0 );
75a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( (dit - dit) == 0 );
76a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( (cdit - cdit) == 0 );
77a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT(!((dit < cdit) || (dit > cdit) || (dit != cdit) || !(dit <= cdit) || !(dit >= cdit)));
78a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
79a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
80a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid DequeTest::insert()
81a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
82a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int> d;
83a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.push_back(0);
84a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.push_back(1);
85a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.push_back(2);
86a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 3 );
87a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
88a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int>::iterator dit;
89a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
90a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Insertion before begin:
91a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dit = d.insert(d.begin(), 3);
92a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dit != d.end() );
93a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( *dit == 3 );
94a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 4 );
95a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[0] == 3 );
96a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
97a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Insertion after begin:
98a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dit = d.insert(d.begin() + 1, 4);
99a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dit != d.end() );
100a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( *dit == 4 );
101a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 5 );
102a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[1] == 4 );
103a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
104a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Insertion at end:
105a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dit = d.insert(d.end(), 5);
106a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dit != d.end() );
107a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( *dit == 5 );
108a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 6 );
109a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[5] == 5 );
110a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
111a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Insertion before last element:
112a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dit = d.insert(d.end() - 1, 6);
113a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dit != d.end() );
114a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( *dit == 6 );
115a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 7 );
116a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[5] == 6 );
117a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
118a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Insertion of several elements before begin
119a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.insert(d.begin(), 2, 7);
120a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 9 );
121a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[0] == 7 );
122a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[1] == 7 );
123a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
124a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Insertion of several elements after begin
125a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //There is more elements to insert than elements before insertion position
126a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.insert(d.begin() + 1, 2, 8);
127a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 11 );
128a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[1] == 8 );
129a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[2] == 8 );
130a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
131a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //There is less elements to insert than elements before insertion position
132a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.insert(d.begin() + 3, 2, 9);
133a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 13 );
134a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[3] == 9 );
135a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[4] == 9 );
136a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
137a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Insertion of several elements at end:
138a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.insert(d.end(), 2, 10);
139a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 15 );
140a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[14] == 10 );
141a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[13] == 10 );
142a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
143a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Insertion of several elements before last:
144a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //There is more elements to insert than elements after insertion position
145a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.insert(d.end() - 1, 2, 11);
146a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 17 );
147a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[15] == 11 );
148a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[14] == 11 );
149a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
150a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //There is less elements to insert than elements after insertion position
151a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.insert(d.end() - 3, 2, 12);
152a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.size() == 19 );
153a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[15] == 12 );
154a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d[14] == 12 );
155a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
156a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
157a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid DequeTest::at() {
158a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int> d;
159a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int> const& cd = d;
160a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
161a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.push_back(10);
162a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d.at(0) == 10 );
163a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d.at(0) = 20;
164a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( cd.at(0) == 20 );
165a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
166a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
167a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  for (;;) {
168a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    try {
169a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      d.at(1) = 20;
170a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      CPPUNIT_ASSERT(false);
171a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
172a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    catch (out_of_range const&) {
173a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      return;
174a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
175a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    catch (...) {
176a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      CPPUNIT_ASSERT(false);
177a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
178a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
179a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
180a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
181a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
182a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid DequeTest::auto_ref()
183a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
184a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  int i;
185a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int> ref;
186a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  for (i = 0; i < 5; ++i) {
187a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    ref.push_back(i);
188a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
189a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
190a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<deque<int> > d_d_int(1, ref);
191a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d_d_int.push_back(d_d_int[0]);
192a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d_d_int.push_back(ref);
193a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d_d_int.push_back(d_d_int[0]);
194a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d_d_int.push_back(d_d_int[0]);
195a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d_d_int.push_back(ref);
196a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
197a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  for (i = 0; i < 5; ++i) {
198a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( d_d_int[i] == ref );
199a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
200a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
201a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
202a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid DequeTest::allocator_with_state()
203a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
204a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  char buf1[1024];
205a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  StackAllocator<int> stack1(buf1, buf1 + sizeof(buf1));
206a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
207a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  char buf2[1024];
208a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  StackAllocator<int> stack2(buf2, buf2 + sizeof(buf2));
209a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
210a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
211a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    typedef deque<int, StackAllocator<int> > DequeInt;
212a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    DequeInt dint1(10, 0, stack1);
213a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    DequeInt dint1Cpy(dint1);
214a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
215a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    DequeInt dint2(10, 1, stack2);
216a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    DequeInt dint2Cpy(dint2);
217a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
218a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    dint1.swap(dint2);
219a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
220a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( dint1.get_allocator().swaped() );
221a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( dint2.get_allocator().swaped() );
222a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
223a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( dint1 == dint2Cpy );
224a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( dint2 == dint1Cpy );
225a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( dint1.get_allocator() == stack2 );
226a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( dint2.get_allocator() == stack1 );
227a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
228a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack1.ok() );
229a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack2.ok() );
230a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
231a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
232a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerstruct Point {
233a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  int x, y;
234a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner};
235a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
236a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerstruct PointEx : public Point {
237a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  PointEx() : builtFromBase(false) {}
238a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  PointEx(const Point&) : builtFromBase(true) {}
239a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
240a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  bool builtFromBase;
241a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner};
242a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
243a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (STLPORT)
244a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  if defined (_STLP_USE_NAMESPACES)
245a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnernamespace std {
246a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  endif
247a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  _STLP_TEMPLATE_NULL
248a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  struct __type_traits<PointEx> {
249a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    typedef __false_type has_trivial_default_constructor;
250a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    typedef __true_type has_trivial_copy_constructor;
251a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    typedef __true_type has_trivial_assignment_operator;
252a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    typedef __true_type has_trivial_destructor;
253a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    typedef __true_type is_POD_type;
254a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  };
255a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  if defined (_STLP_USE_NAMESPACES)
256a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
257a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  endif
258a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
259a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
260a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//This test check that deque implementation do not over optimize
261a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//operation as PointEx copy constructor is trivial
262a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid DequeTest::optimizations_check()
263a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
264a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || !defined (_STLP_NO_MEMBER_TEMPLATES)
265a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<Point> d1(1);
266a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d1.size() == 1 );
267a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
268a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<PointEx> d2(d1.begin(), d1.end());
269a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d2.size() == 1 );
270a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d2[0].builtFromBase == true );
271a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
272a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  d2.insert(d2.end(), d1.begin(), d1.end());
273a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d2.size() == 2 );
274a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( d2[1].builtFromBase == true );
275a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
276a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
277a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
278a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid DequeTest::erase()
279a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
280a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int> dint;
281a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.push_back(3);
282a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.push_front(2);
283a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.push_back(4);
284a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.push_front(1);
285a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.push_back(5);
286a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.push_front(0);
287a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.push_back(6);
288a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
289a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<int>::iterator it(dint.begin() + 1);
290a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *it == 1 );
291a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
292a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.erase(dint.begin());
293a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *it == 1 );
294a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
295a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  it = dint.end() - 2;
296a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *it == 5 );
297a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
298a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.erase(dint.end() - 1);
299a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *it == 5 );
300a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
301a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.push_back(6);
302a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.push_front(0);
303a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
304a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  it = dint.begin() + 2;
305a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *it == 2 );
306a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
307a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.erase(dint.begin(), dint.begin() + 2);
308a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *it == 2 );
309a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
310a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  it = dint.end() - 3;
311a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *it == 4 );
312a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
313a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dint.erase(dint.end() - 2, dint.end());
314a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *it == 4 );
315a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
316a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
317a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if (!defined (STLPORT) || \
318a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    (!defined (_STLP_USE_PTR_SPECIALIZATIONS) || defined (_STLP_CLASS_PARTIAL_SPECIALIZATION))) && \
319a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner     (!defined (_MSC_VER) || (_MSC_VER > 1400)) && \
320a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner     (!defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC_MINOR__ < 3))
321a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner/* Simple compilation test: Check that nested types like iterator
322a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * can be access even if type used to instanciate container is not
323a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * yet completely defined.
324a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner */
325a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerclass IncompleteClass
326a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
327a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<IncompleteClass> instances;
328a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  typedef deque<IncompleteClass>::size_type size;
329a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner};
330a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
331