1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <vector> 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <algorithm> 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <vector> 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <queue> 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if 0 /* temporary: investigation of problem with swap */ 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <iostream> 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <typeinfo> 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 SwapTest : public CPPUNIT_NS::TestCase 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE(SwapTest); 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(swap1); 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(swprnge1); 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(swap_container_non_spec); 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && \ 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) && !defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_IGNORE; 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(swap_container_spec); 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE_END(); 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected: 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void swap1(); 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void swprnge1(); 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void swap_container_non_spec(); 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void swap_container_spec(); 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(SwapTest); 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid SwapTest::swap1() 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int a = 42; 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int b = 19; 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott swap(a, b); 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT(a==19); 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT(b==42); 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid SwapTest::swprnge1() 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char word1[] = "World"; 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char word2[] = "Hello"; 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott swap_ranges((char*)word1, (char*)word1 + ::strlen(word1), (char*)word2); 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT(!strcmp(word1, "Hello")); 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT(!strcmp(word2, "World")); 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass Obj 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott public: 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Obj() : 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v( 0 ) 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { } 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Obj( const Obj& ) : 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v( 1 ) 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { } 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Obj& operator =( const Obj& ) 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { v = 2; return *this; } 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int v; 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Following two tests check the corectness of specialization of swap(): 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * for containers with container::swap method swap( a, b ) should 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * use a.swap( b ), but don't try to do this substitution for container 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without swap method (in this case swap should be made via explicit members 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * exchange; this assume usage of temporary object) 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid SwapTest::swap_container_non_spec() 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott queue<Obj> v1; 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott queue<Obj> v2; 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v1.push( Obj() ); 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v1.back().v = -1; 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v1.push( Obj() ); 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v1.back().v = -2; 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2.push( Obj() ); 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2.back().v = 10; 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2.push( Obj() ); 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2.back().v = 11; 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2.push( Obj() ); 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2.back().v = 12; 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v1.size() == 2 ); 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v2.size() == 3 ); 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott swap( v1, v2 ); // this shouldn't try make it as v1.swap( v2 ), no queue::swap method! 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v1.size() == 3 ); 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v2.size() == 2 ); 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // either copy constructor or assignment operator 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v1.front().v == 1 || v1.front().v == 2 ); 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v1.back().v == 1 || v1.back().v == 2 ); 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v2.front().v == 1 || v2.front().v == 2 ); 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v2.back().v == 1 || v2.back().v == 2 ); 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid SwapTest::swap_container_spec() 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if 0 /* temporary: investigation of problem with swap */ 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ( typeid(/* _STLP_PRIV */ _SwapImplemented<vector<Obj> >::_Ret) == typeid(_STLP_PRIV __false_type) ) { 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cerr << "false type" << endl; 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } else if ( typeid(/* _STLP_PRIV */ _SwapImplemented<vector<Obj> >::_Ret) == typeid(_STLP_PRIV __true_type) ) { 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cerr << "true type" << endl; 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } else { 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cerr << "unknown type" << endl; 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* end of temporary */ 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || \ 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) || defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott vector<Obj> v1; 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott vector<Obj> v2; 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v1.push_back( Obj() ); 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v1.push_back( Obj() ); 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v1[0].v = -1; 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v1[1].v = -2; 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2.push_back( Obj() ); 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2.push_back( Obj() ); 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2.push_back( Obj() ); 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2[0].v = 10; 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2[1].v = 11; 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott v2[2].v = 12; 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v1.size() == 2 ); 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v2.size() == 3 ); 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott swap( v1, v2 ); // this should has effect v1.swap( v2 ) 154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v1.size() == 3 ); 156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v2.size() == 2 ); 157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v1[0].v == 10 ); 159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v1[1].v == 11 ); 160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v1[2].v == 12 ); 161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v2[0].v == -1 ); 163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( v2[1].v == -2 ); 164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 166