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