ReactOS 0.4.15-dev-8219-ge8b88cf
mfunptr_test.cpp
Go to the documentation of this file.
1#include <functional>
2#include <memory>
3#include <vector>
4#include <algorithm>
5
7
8#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
9using namespace std;
10#endif
11
12//
13// TestCase class
14//
15class MemFunPtrTest : public CPPUNIT_NS::TestCase
16{
19#if defined (STLPORT) && !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
20 //This test require partial template specialization feature to avoid the
21 //reference to reference problem. No workaround yet for limited compilers.
23#endif
26
27protected:
28 // compile test not neccessary to run but...
29 void mem_ptr_fun();
30 void find();
31};
32
34
35#if defined(_STLP_DONT_RETURN_VOID) && (defined(_STLP_NO_MEMBER_TEMPLATE_CLASSES) && defined(_STLP_NO_CLASS_PARTIAL_SPECIALIZATION))
36# define _STLP_DONT_TEST_RETURN_VOID
37#endif
38//else there is no workaround for the return void bug
39
40struct S1 { } s1;
41struct S2 { } s2;
42
43int f1(S1&);
44int f2(S1&, S2&);
45int f1c(const S1&);
46int f2c(const S1&, const S2&);
47
48void vf1(S1&);
49void vf2(S1&, S2&);
50void vf1c(const S1&);
51void vf2c(const S1&, const S2&);
52
53class Class {
54public:
55 int f0();
56 int f1(const S1&);
57
58 void vf0();
59 void vf1(const S1&);
60
61 int f0c() const;
62 int f1c(const S1&) const;
63
64 void vf0c() const;
65 void vf1c(const S1&) const;
66};
67
68//
69// tests implementation
70//
72{
73 Class obj;
74 const Class& objc = obj;
75
76 // ptr_fun
77
78 ptr_fun(f1)(s1);
79 ptr_fun(f2)(s1, s2);
80
81 ptr_fun(f1c)(s1);
82 ptr_fun(f2c)(s1, s2);
83
84#ifndef _STLP_DONT_TEST_RETURN_VOID
85 ptr_fun(vf1)(s1);
86 ptr_fun(vf2)(s1, s2);
87
88 ptr_fun(vf1c)(s1);
89 ptr_fun(vf2c)(s1, s2);
90#endif /* _STLP_DONT_TEST_RETURN_VOID */
91
92 // mem_fun
93
96
97#ifndef _STLP_DONT_TEST_RETURN_VOID
100#endif /* _STLP_DONT_TEST_RETURN_VOID */
101
102 // mem_fun (const)
103
104 mem_fun(&Class::f0c)(&objc);
105 mem_fun(&Class::f1c)(&objc, s1);
106
107#ifndef _STLP_DONT_TEST_RETURN_VOID
108 mem_fun(&Class::vf0c)(&objc);
109 mem_fun(&Class::vf1c)(&objc, s1);
110#endif /* _STLP_DONT_TEST_RETURN_VOID */
111
112 // mem_fun_ref
113
116
117#ifndef _STLP_DONT_TEST_RETURN_VOID
120#endif /* _STLP_DONT_TEST_RETURN_VOID */
121
122 // mem_fun_ref (const)
123 mem_fun_ref(&Class::f0c)(objc);
124 mem_fun_ref(&Class::f1c)(objc, s1);
125
126#ifndef _STLP_DONT_TEST_RETURN_VOID
127 mem_fun_ref(&Class::vf0c)(objc);
128 mem_fun_ref(&Class::vf1c)(objc, s1);
129#endif /* _STLP_DONT_TEST_RETURN_VOID */
130}
131int f1(S1&)
132{return 1;}
133
134int f2(S1&, S2&)
135{return 2;}
136
137int f1c(const S1&)
138{return 1;}
139
140int f2c(const S1&, const S2&)
141{return 2;}
142
143void vf1(S1&)
144{}
145
146void vf2(S1&, S2&)
147{}
148
149void vf1c(const S1&)
150{}
151
152void vf2c(const S1&, const S2&)
153{}
154
156{return 0;}
157
158int Class::f1(const S1&)
159{return 1;}
160
162{}
163
164void Class::vf1(const S1&)
165{}
166
167int Class::f0c() const
168{return 0;}
169
170int Class::f1c(const S1&) const
171{return 1;}
172
173void Class::vf0c() const
174{}
175
176void Class::vf1c(const S1&) const
177{}
178
179struct V {
180 public:
181 V(int _v) :
182 v(_v)
183 { }
184
185 bool f( int _v ) const { return (v == _v); }
186
187 int v;
188#if defined (__DMC__)
189 V(){}
190#endif
191};
192
194{
195#if !defined (STLPORT) || defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
196 vector<V> v;
197
198 v.push_back( V(1) );
199 v.push_back( V(2) );
200 v.push_back( V(3) );
201
202 // step-by-step complication of work for compiler:
203
204 // step 1:
207 vector<V>::iterator i = find_if( v.begin(), v.end(), b );
208 CPPUNIT_ASSERT(i != v.end());
209 CPPUNIT_ASSERT(i->v == 2);
210
211 // step 2, just check that compiler understand what pass to bind2nd:
213
214 // step 3, the same as step 1, but more intellect from compiler required:
216
217 vector<V>::iterator j = find_if( v.begin(), v.end(), b3 );
218 CPPUNIT_ASSERT(j != v.end());
219 CPPUNIT_ASSERT(j->v == 2);
220
221 // step 4, more brief, more complex:
222 vector<V>::iterator k = find_if( v.begin(), v.end(), bind2nd( mem_fun_ref( &V::f ), 2 ) );
223 CPPUNIT_ASSERT(k != v.end());
224 CPPUNIT_ASSERT(k->v == 2);
225#endif
226}
227
228#ifdef _STLP_DONT_TEST_RETURN_VOID
229# undef _STLP_DONT_TEST_RETURN_VOID
230#endif
_STLP_MOVE_TO_STD_NAMESPACE _InputIter find_if(_InputIter __first, _InputIter __last, _Predicate __pred)
Definition: _algobase.c:214
binder2nd< _Operation > bind2nd(const _Operation &__fn, const _Tp &__x)
Definition: _function.h:252
pointer_to_unary_function< _Arg, _Result > ptr_fun(_Result(*__f)(_Arg))
mem_fun_ref_t< _Result, _Tp > mem_fun_ref(_Result(_Tp::*__f)())
mem_fun_t< _Result, _Tp > mem_fun(_Result(_Tp::*__f)())
void vf0c() const
void vf1(const S1 &)
int f0()
void vf1c(const S1 &) const
int f0c() const
int f1c(const S1 &) const
int f1(const S1 &)
void vf0()
CPPUNIT_TEST(find)
CPPUNIT_TEST(mem_ptr_fun)
void mem_ptr_fun()
CPPUNIT_TEST_SUITE(MemFunPtrTest)
#define CPPUNIT_IGNORE
Definition: cppunit_mini.h:185
#define CPPUNIT_TEST_SUITE_REGISTRATION(X)
Definition: cppunit_mini.h:193
#define CPPUNIT_ASSERT(X)
Definition: cppunit_mini.h:200
const GLdouble * v
Definition: gl.h:2040
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define b
Definition: ke_i.h:79
void vf2(S1 &, S2 &)
int f2c(const S1 &, const S2 &)
struct S1 s1
struct S2 s2
void vf1(S1 &)
int f1c(const S1 &)
void vf1c(const S1 &)
void vf2c(const S1 &, const S2 &)
static CRYPT_DATA_BLOB b3[]
Definition: msg.c:592
static CRYPT_DATA_BLOB b2[]
Definition: msg.c:582
int k
Definition: mpi.c:3369
Definition: features.h:417
#define f2(x, y, z)
Definition: sha1.c:31
#define f1(x, y, z)
Definition: sha1.c:30
int v
bool f(int _v) const
V(int _v)
value_type * iterator
Definition: _vector.h:124