#include <vector> #include <algorithm> #include <vector> #include <queue> #if 0 /* temporary: investigation of problem with swap */ #include <iostream> #include <typeinfo> #endif #include "cppunit/cppunit_proxy.h" #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) using namespace std; #endif // // TestCase class // class SwapTest : public CPPUNIT_NS::TestCase { CPPUNIT_TEST_SUITE(SwapTest); CPPUNIT_TEST(swap1); CPPUNIT_TEST(swprnge1); CPPUNIT_TEST(swap_container_non_spec); #if defined (STLPORT) && \ !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) && !defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) CPPUNIT_IGNORE; #endif CPPUNIT_TEST(swap_container_spec); CPPUNIT_TEST_SUITE_END(); protected: void swap1(); void swprnge1(); void swap_container_non_spec(); void swap_container_spec(); }; CPPUNIT_TEST_SUITE_REGISTRATION(SwapTest); // // tests implementation // void SwapTest::swap1() { int a = 42; int b = 19; swap(a, b); CPPUNIT_ASSERT(a==19); CPPUNIT_ASSERT(b==42); } void SwapTest::swprnge1() { char word1[] = "World"; char word2[] = "Hello"; swap_ranges((char*)word1, (char*)word1 + ::strlen(word1), (char*)word2); CPPUNIT_ASSERT(!strcmp(word1, "Hello")); CPPUNIT_ASSERT(!strcmp(word2, "World")); } class Obj { public: Obj() : v( 0 ) { } Obj( const Obj& ) : v( 1 ) { } Obj& operator =( const Obj& ) { v = 2; return *this; } int v; }; /* * Following two tests check the corectness of specialization of swap(): * for containers with container::swap method swap( a, b ) should * use a.swap( b ), but don't try to do this substitution for container * without swap method (in this case swap should be made via explicit members * exchange; this assume usage of temporary object) * */ void SwapTest::swap_container_non_spec() { queue<Obj> v1; queue<Obj> v2; v1.push( Obj() ); v1.back().v = -1; v1.push( Obj() ); v1.back().v = -2; v2.push( Obj() ); v2.back().v = 10; v2.push( Obj() ); v2.back().v = 11; v2.push( Obj() ); v2.back().v = 12; CPPUNIT_CHECK( v1.size() == 2 ); CPPUNIT_CHECK( v2.size() == 3 ); swap( v1, v2 ); // this shouldn't try make it as v1.swap( v2 ), no queue::swap method! CPPUNIT_CHECK( v1.size() == 3 ); CPPUNIT_CHECK( v2.size() == 2 ); // either copy constructor or assignment operator CPPUNIT_CHECK( v1.front().v == 1 || v1.front().v == 2 ); CPPUNIT_CHECK( v1.back().v == 1 || v1.back().v == 2 ); CPPUNIT_CHECK( v2.front().v == 1 || v2.front().v == 2 ); CPPUNIT_CHECK( v2.back().v == 1 || v2.back().v == 2 ); } void SwapTest::swap_container_spec() { #if 0 /* temporary: investigation of problem with swap */ if ( typeid(/* _STLP_PRIV */ _SwapImplemented<vector<Obj> >::_Ret) == typeid(_STLP_PRIV __false_type) ) { cerr << "false type" << endl; } else if ( typeid(/* _STLP_PRIV */ _SwapImplemented<vector<Obj> >::_Ret) == typeid(_STLP_PRIV __true_type) ) { cerr << "true type" << endl; } else { cerr << "unknown type" << endl; } #endif /* end of temporary */ #if !defined (STLPORT) || \ defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) || defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) vector<Obj> v1; vector<Obj> v2; v1.push_back( Obj() ); v1.push_back( Obj() ); v1[0].v = -1; v1[1].v = -2; v2.push_back( Obj() ); v2.push_back( Obj() ); v2.push_back( Obj() ); v2[0].v = 10; v2[1].v = 11; v2[2].v = 12; CPPUNIT_CHECK( v1.size() == 2 ); CPPUNIT_CHECK( v2.size() == 3 ); swap( v1, v2 ); // this should has effect v1.swap( v2 ) CPPUNIT_CHECK( v1.size() == 3 ); CPPUNIT_CHECK( v2.size() == 2 ); CPPUNIT_CHECK( v1[0].v == 10 ); CPPUNIT_CHECK( v1[1].v == 11 ); CPPUNIT_CHECK( v1[2].v == 12 ); CPPUNIT_CHECK( v2[0].v == -1 ); CPPUNIT_CHECK( v2[1].v == -2 ); #endif }