| #include <algorithm> |
| #include <vector> |
| #include <cstdlib> |
| #include <iterator> |
| #include <functional> |
| |
| #include "cppunit/cppunit_proxy.h" |
| |
| #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) |
| using namespace std; |
| #endif |
| |
| // |
| // TestCase class |
| // |
| class PartitionTest : public CPPUNIT_NS::TestCase |
| { |
| CPPUNIT_TEST_SUITE(PartitionTest); |
| CPPUNIT_TEST(ptition0); |
| CPPUNIT_TEST(ptition1); |
| CPPUNIT_TEST(stblptn0); |
| CPPUNIT_TEST(stblptn1); |
| CPPUNIT_TEST_SUITE_END(); |
| |
| protected: |
| void ptition0(); |
| void ptition1(); |
| void stblptn0(); |
| void stblptn1(); |
| |
| struct less_n { |
| less_n(int limit, size_t &nb_calls) |
| : _limit(limit), _nb_calls(nb_calls) {} |
| |
| bool operator() (int a_) const { |
| ++_nb_calls; |
| return a_ < _limit; |
| } |
| |
| int _limit; |
| size_t &_nb_calls; |
| |
| private: |
| //explicitely defined as private to avoid warnings: |
| less_n& operator = (less_n const&); |
| }; |
| }; |
| |
| CPPUNIT_TEST_SUITE_REGISTRATION(PartitionTest); |
| |
| // |
| // tests implementation |
| // |
| void PartitionTest::stblptn0() |
| { |
| int numbers[6] = { 10, 5, 11, 20, 6, -2 }; |
| |
| size_t nb_pred_calls = 0; |
| stable_partition((int*)numbers, (int*)numbers + 6, less_n(10, nb_pred_calls)); |
| // 5 6 -2 10 11 20 |
| CPPUNIT_ASSERT(numbers[0]==5); |
| CPPUNIT_ASSERT(numbers[1]==6); |
| CPPUNIT_ASSERT(numbers[2]==-2); |
| CPPUNIT_ASSERT(numbers[3]==10); |
| CPPUNIT_ASSERT(numbers[4]==11); |
| CPPUNIT_ASSERT(numbers[5]==20); |
| |
| //Complexity check: |
| CPPUNIT_ASSERT( nb_pred_calls == sizeof(numbers) / sizeof(numbers[0]) ); |
| } |
| void PartitionTest::stblptn1() |
| { |
| //5 5 2 10 0 12 5 0 0 19 |
| //5 5 2 10 0 5 0 0 12 19 |
| int numbers[] = { 5, 5, 2, 10, 0, 12, 5, 0, 0, 19 }; |
| vector <int> v1(numbers, numbers+10); |
| |
| size_t nb_pred_calls = 0; |
| stable_partition(v1.begin(), v1.end(), less_n(11, nb_pred_calls)); |
| |
| CPPUNIT_ASSERT(v1[0]==5); |
| CPPUNIT_ASSERT(v1[1]==5); |
| CPPUNIT_ASSERT(v1[2]==2); |
| CPPUNIT_ASSERT(v1[3]==10); |
| CPPUNIT_ASSERT(v1[4]==0); |
| CPPUNIT_ASSERT(v1[5]==5); |
| CPPUNIT_ASSERT(v1[6]==0); |
| CPPUNIT_ASSERT(v1[7]==0); |
| CPPUNIT_ASSERT(v1[8]==12); |
| CPPUNIT_ASSERT(v1[9]==19); |
| CPPUNIT_ASSERT( nb_pred_calls == v1.size() ); |
| } |
| void PartitionTest::ptition0() |
| { |
| int numbers[6] = { 6, 12, 3, 10, 1, 20 }; |
| size_t nb_pred_calls = 0; |
| // 6 1 3 10 12 20 |
| partition((int*)numbers, (int*)numbers + 6, less_n(10, nb_pred_calls)); |
| CPPUNIT_ASSERT(numbers[0]==6); |
| CPPUNIT_ASSERT(numbers[1]==1); |
| CPPUNIT_ASSERT(numbers[2]==3); |
| CPPUNIT_ASSERT(numbers[3]==10); |
| CPPUNIT_ASSERT(numbers[4]==12); |
| CPPUNIT_ASSERT(numbers[5]==20); |
| |
| CPPUNIT_ASSERT( nb_pred_calls == sizeof(numbers) / sizeof(numbers[0]) ); |
| } |
| void PartitionTest::ptition1() |
| { |
| // 19 3 11 14 10 19 8 17 9 6 |
| // 6 3 9 8 10 19 14 17 11 19 |
| |
| int numbers[10] ={ 19, 3, 11, 14, 10, 19, 8, 17, 9, 6 }; |
| |
| vector <int> v1(numbers, numbers+10); |
| size_t nb_pred_calls = 0; |
| partition(v1.begin(), v1.end(), less_n(11, nb_pred_calls)); |
| |
| CPPUNIT_ASSERT(v1[0]==6); |
| CPPUNIT_ASSERT(v1[1]==3); |
| CPPUNIT_ASSERT(v1[2]==9); |
| CPPUNIT_ASSERT(v1[3]==8); |
| CPPUNIT_ASSERT(v1[4]==10); |
| CPPUNIT_ASSERT(v1[5]==19); |
| CPPUNIT_ASSERT(v1[6]==14); |
| CPPUNIT_ASSERT(v1[7]==17); |
| CPPUNIT_ASSERT(v1[8]==11); |
| CPPUNIT_ASSERT(v1[9]==19); |
| CPPUNIT_ASSERT( nb_pred_calls == v1.size() ); |
| } |