+++ /dev/null
-#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
-}