genericopenlibs/cppstdlib/stl/test/unit/bind_test.cpp
changeset 31 ce057bb09d0b
child 34 5fae379060a7
equal deleted inserted replaced
30:e20de85af2ee 31:ce057bb09d0b
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 #include <algorithm>
       
    18 #include <functional>
       
    19 
       
    20 #include "cppunit/cppunit_proxy.h"
       
    21 
       
    22 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
       
    23 using namespace std;
       
    24 #endif
       
    25 
       
    26 //
       
    27 // TestCase class
       
    28 //
       
    29 class BindTest : public CPPUNIT_NS::TestCase
       
    30 {
       
    31   CPPUNIT_TEST_SUITE(BindTest);
       
    32   CPPUNIT_TEST(bind1st1);
       
    33   CPPUNIT_TEST(bind2nd1);
       
    34   CPPUNIT_TEST(bind2nd2);
       
    35 #if !defined (STLPORT) || \
       
    36     defined (_STLP_NO_EXTENSIONS) || !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
       
    37   CPPUNIT_IGNORE;
       
    38 #endif
       
    39   CPPUNIT_TEST(bind2nd3);
       
    40   CPPUNIT_TEST(bind_memfn);
       
    41   CPPUNIT_TEST_SUITE_END();
       
    42 
       
    43 protected:
       
    44   void bind1st1();
       
    45   void bind2nd1();
       
    46   void bind2nd2();
       
    47   void bind2nd3();
       
    48   void bind_memfn();
       
    49 };
       
    50 
       
    51 CPPUNIT_TEST_SUITE_REGISTRATION(BindTest);
       
    52 
       
    53 //
       
    54 // tests implementation
       
    55 //
       
    56 void BindTest::bind1st1()
       
    57 {
       
    58   int array [3] = { 1, 2, 3 };
       
    59   int* p = remove_if((int*)array, (int*)array + 3, bind1st(less<int>(), 2));
       
    60 
       
    61   CPPUNIT_ASSERT(p==&array[2]);
       
    62   CPPUNIT_ASSERT(array[0]==1);
       
    63   CPPUNIT_ASSERT(array[1]==2);
       
    64 }
       
    65 void BindTest::bind2nd1()
       
    66 {
       
    67   int array [3] = { 1, 2, 3 };
       
    68   replace_if(array, array + 3, binder2nd<greater<int> >(greater<int>(), 2), 4);
       
    69 
       
    70   CPPUNIT_ASSERT(array[0]==1);
       
    71   CPPUNIT_ASSERT(array[1]==2);
       
    72   CPPUNIT_ASSERT(array[2]==4);
       
    73 }
       
    74 void BindTest::bind2nd2()
       
    75 {
       
    76   int array [3] = { 1, 2, 3 };
       
    77   replace_if(array, array + 3, bind2nd(greater<int>(), 2), 4);
       
    78   CPPUNIT_ASSERT(array[0]==1);
       
    79   CPPUNIT_ASSERT(array[1]==2);
       
    80   CPPUNIT_ASSERT(array[2]==4);
       
    81 }
       
    82 
       
    83 int test_func1 (const int &param1, const int &param2) {
       
    84   return param1 + param2;
       
    85 }
       
    86 
       
    87 int test_func2 (int &param1, int param2) {
       
    88   param1 += param2;
       
    89   return param1 + param2;
       
    90 }
       
    91 
       
    92 void BindTest::bind2nd3()
       
    93 {
       
    94 #if defined (STLPORT) && \
       
    95     !defined (_STLP_NO_EXTENSIONS) && defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
       
    96   int array[3] = { 1, 2, 3 };
       
    97   transform(array, array + 3, array, bind2nd(ptr_fun(test_func1), 1));
       
    98   transform(array, array + 3, array, bind1st(ptr_fun(test_func1), -1));
       
    99   CPPUNIT_ASSERT(array[0] == 1);
       
   100   CPPUNIT_ASSERT(array[1] == 2);
       
   101   CPPUNIT_ASSERT(array[2] == 3);
       
   102 
       
   103   transform(array, array + 3, array, bind2nd(ptr_fun(test_func2), 10));
       
   104   CPPUNIT_ASSERT(array[0] == 21);
       
   105   CPPUNIT_ASSERT(array[1] == 22);
       
   106   CPPUNIT_ASSERT(array[2] == 23);
       
   107 #endif
       
   108 }
       
   109 
       
   110 class A
       
   111 {
       
   112   public:
       
   113     A() :
       
   114         m_n( 0 )
       
   115       {}
       
   116 
       
   117     void f( int n ) const
       
   118       { m_n = n; }
       
   119 
       
   120     int v() const
       
   121       { return m_n; }
       
   122 
       
   123   private:
       
   124     mutable int m_n;
       
   125 };
       
   126 
       
   127 void BindTest::bind_memfn()
       
   128 {
       
   129 #if defined (STLPORT) && \
       
   130     !defined (_STLP_NO_EXTENSIONS) && defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
       
   131   A array[3];
       
   132 
       
   133   for_each( array, array + 3, bind2nd( mem_fun_ref(&A::f), 12 ) );
       
   134 
       
   135   CPPUNIT_CHECK( array[0].v() == 12 );
       
   136 #endif
       
   137 }