1 #include <functional>
2 
3 #if !defined(_STLP_NO_EXTENSIONS) && defined(_STLP_USE_BOOST_SUPPORT)
4 
5 #include <typeinfo>
6 #include "cppunit/cppunit_proxy.h"
7 
8 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
9 using namespace std;
10 #endif
11 
12 class RefWrapperTest :
13     public CPPUNIT_NS::TestCase
14 {
15     CPPUNIT_TEST_SUITE(RefWrapperTest);
16     CPPUNIT_TEST(ref);
17     CPPUNIT_TEST(cref);
18     CPPUNIT_TEST_SUITE_END();
19 
20   protected:
21     void ref();
22     void cref();
23 };
24 
25 CPPUNIT_TEST_SUITE_REGISTRATION(RefWrapperTest);
26 
ref()27 void RefWrapperTest::ref()
28 {
29   typedef std::tr1::reference_wrapper<int> rr_type;
30 
31   CPPUNIT_CHECK( (::boost::is_convertible<rr_type, int&>::value) );
32   CPPUNIT_CHECK( (::boost::is_same<rr_type::type, int>::value) );
33 
34   int i = 1;
35   int j = 2;
36 
37   rr_type r1 = std::tr1::ref(i);
38 
39   CPPUNIT_CHECK( r1.get() == 1 );
40 
41   r1 = std::tr1::ref(j);
42 
43   CPPUNIT_CHECK( r1.get() == 2 );
44 
45   i = 3;
46 
47   CPPUNIT_CHECK( r1.get() == 2 );
48 
49   j = 4;
50 
51   CPPUNIT_CHECK( r1.get() == 4 );
52 
53   r1.get() = 5;
54 
55   CPPUNIT_CHECK( j == 5 );
56 }
57 
cref()58 void RefWrapperTest::cref()
59 {
60   typedef std::tr1::reference_wrapper<const int> crr_type;
61 
62   CPPUNIT_CHECK( (::boost::is_convertible<crr_type, const int&>::value) );
63   CPPUNIT_CHECK( (::boost::is_same<crr_type::type, const int>::value) );
64 
65   int i = 1;
66   int j = 2;
67 
68   crr_type r1 = std::tr1::cref(i);
69 
70   CPPUNIT_CHECK( r1.get() == 1 );
71 
72   r1 = std::tr1::cref(j);
73 
74   CPPUNIT_CHECK( r1.get() == 2 );
75 
76   i = 3;
77 
78   CPPUNIT_CHECK( r1.get() == 2 );
79 
80   j = 4;
81 
82   CPPUNIT_CHECK( r1.get() == 4 );
83 }
84 
85 #endif /* !_STLP_NO_EXTENSIONS && _STLP_USE_BOOST_SUPPORT */
86