177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <vector> 277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <algorithm> 377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <functional> 477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "cppunit/cppunit_proxy.h" 577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerusing namespace std; 877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// TestCase class 1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass EqualTest : public CPPUNIT_NS::TestCase 1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST_SUITE(EqualTest); 1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(equal_range0); 1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(equal_range1); 1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(equal_range2); 1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(equal0); 2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(equal1); 2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(equal2); 2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST(equalto); 2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_TEST_SUITE_END(); 2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected: 2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void equal_range0(); 2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void equal_range1(); 2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void equal_range2(); 2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void equal0(); 3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void equal1(); 3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void equal2(); 3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void equalto(); 3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static bool values_squared(int a_, int b_); 3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerCPPUNIT_TEST_SUITE_REGISTRATION(EqualTest); 3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// tests implementation 4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid EqualTest::equal_range0() 4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int numbers[10] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3 }; 4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pair<int*, int*> range = equal_range((int*)numbers, (int*)numbers + 10, 2); 4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( (range.first - numbers) == 4 ); 4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( (range.second - numbers) == 8 ); 4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid EqualTest::equal_range1() 5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef vector <int> IntVec; 5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner IntVec v(10); 5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (int i = 0; (size_t)i < v.size(); ++i) 5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner v[i] = i / 3; 5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pair<IntVec::iterator, IntVec::iterator> range = equal_range(v.begin(), v.end(), 2); 5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( (range.first - v.begin()) == 6 ); 5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( (range.second - v.begin()) == 9 ); 5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (; range.first != range.second; ++range.first) 6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( *range.first == 2 ); 6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner range = equal_range(v.begin(), v.end(), 4); 6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( range.first == range.second ); 6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( range.first == v.end() ); 6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct Test { 6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__DMC__) 6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner Test(); 7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner Test(int val) : value(val) {} 7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int value; 7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool operator == (int i) const 7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { return value == i; } 7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool operator < (const Test& v1, int v2) 8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return v1.value < v2; } 8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool operator < (int v1, const Test& v2) 8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return v1 < v2.value; } 8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_MSC_VER) && !defined (STLPORT) 8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool operator < (const Test& v1, const Test& v2) 8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return v1.value < v2.value; } 8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid EqualTest::equal_range2() 9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner char chars[] = "aabbccddggghhklllmqqqqssyyzz"; 9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const unsigned count = sizeof(chars) - 1; 9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pair<char*, char*> range = equal_range((char*)chars, (char*)chars + count, 'q', less<char>()); 9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( (range.first - chars) == 18 ); 9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( (range.second - chars) == 22 ); 9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (; range.first != range.second; ++range.first) 9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( *range.first == 'q' ); 10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner range = equal_range((char*)chars, (char*)chars + count, 'm', less<char>()); 10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( (range.second - range.first) == 1 ); 10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( *range.first == 'm' ); 10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector<Test> tv; 10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector<Test>::iterator it; 10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner pair<vector<Test>::iterator, vector<Test>::iterator> p; 10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (int i = 0; i < 10; ++i) { 11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner tv.push_back(i); 11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner it = upper_bound(tv.begin(), tv.end(), 5); 11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( it != tv.end() ); 11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( *it == 6 ); 11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner it = lower_bound(tv.begin(), tv.end(), 5); 11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( it != tv.end() ); 11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( *it == 5 ); 12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner p = equal_range(tv.begin(), tv.end(), 5); 12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( p.first != p.second ); 12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( p.first != tv.end() ); 12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( p.second != tv.end() ); 12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( *p.first == 5 ); 12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( *p.second == 6 ); 12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid EqualTest::equal0() 13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int numbers1[5] = { 1, 2, 3, 4, 5 }; 13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int numbers2[5] = { 1, 2, 4, 8, 16 }; 13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int numbers3[2] = { 1, 2 }; 13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( !equal(numbers1, numbers1 + 5, numbers2) ); 13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( equal(numbers3, numbers3 + 2, numbers1) ); 13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid EqualTest::equal1() 14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector <int> v1(10); 14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (int i = 0; (size_t)i < v1.size(); ++i) 14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner v1[i] = i; 14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector <int> v2(10); 14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( !equal(v1.begin(), v1.end(), v2.begin()) ); 14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner copy(v1.begin(), v1.end(), v2.begin()); 14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( equal(v1.begin(), v1.end(), v2.begin()) ) 14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid EqualTest::equal2() 15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector <int> v1(10); 15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner vector <int> v2(10); 15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (int i = 0; (size_t)i < v1.size(); ++i) { 15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner v1[i] = i; 15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner v2[i] = i * i; 15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( equal(v1.begin(), v1.end(), v2.begin(), values_squared) ); 16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid EqualTest::equalto() 16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int input1 [4] = { 1, 7, 2, 2 }; 16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int input2 [4] = { 1, 6, 2, 3 }; 16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int output [4]; 16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner transform((int*)input1, (int*)input1 + 4, (int*)input2, (int*)output, equal_to<int>()); 16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( output[0] == 1 ); 17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( output[1] == 0 ); 17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( output[2] == 1 ); 17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner CPPUNIT_ASSERT( output[3] == 0 ); 17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool EqualTest::values_squared(int a_, int b_) 17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return (a_ * a_ == b_); 17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 179