1 #include <boost/config.hpp>
2 
3 #if defined(BOOST_MSVC)
4 #pragma warning(disable: 4786)  // identifier truncated in debug info
5 #pragma warning(disable: 4710)  // function not inlined
6 #pragma warning(disable: 4711)  // function selected for automatic inline expansion
7 #pragma warning(disable: 4514)  // unreferenced inline removed
8 #endif
9 
10 //
11 //  bind_eq_test.cpp - boost::bind equality operator
12 //
13 //  Copyright (c) 2004, 2005 Peter Dimov
14 //
15 // Distributed under the Boost Software License, Version 1.0. (See
16 // accompanying file LICENSE_1_0.txt or copy at
17 // http://www.boost.org/LICENSE_1_0.txt)
18 //
19 
20 #include <boost/bind/bind.hpp>
21 #include <boost/ref.hpp>
22 #include <boost/core/lightweight_test.hpp>
23 
24 using namespace boost::placeholders;
25 
26 //
27 
28 struct X
29 {
30     int i_;
31 
XX32     explicit X(int i): i_(i)
33     {
34     }
35 
operator ==X36     bool operator==(X const & rhs) const
37     {
38         return i_ == rhs.i_;
39     }
40 };
41 
42 // f_*
43 
f_0()44 int f_0()
45 {
46     return 0;
47 }
48 
f_1(X)49 int f_1(X)
50 {
51     return 0;
52 }
53 
f_2(X,X)54 int f_2(X, X)
55 {
56     return 0;
57 }
58 
f_3(X,X,X)59 int f_3(X, X, X)
60 {
61     return 0;
62 }
63 
f_4(X,X,X,X)64 int f_4(X, X, X, X)
65 {
66     return 0;
67 }
68 
f_5(X,X,X,X,X)69 int f_5(X, X, X, X, X)
70 {
71     return 0;
72 }
73 
f_6(X,X,X,X,X,X)74 int f_6(X, X, X, X, X, X)
75 {
76     return 0;
77 }
78 
f_7(X,X,X,X,X,X,X)79 int f_7(X, X, X, X, X, X, X)
80 {
81     return 0;
82 }
83 
f_8(X,X,X,X,X,X,X,X)84 int f_8(X, X, X, X, X, X, X, X)
85 {
86     return 0;
87 }
88 
f_9(X,X,X,X,X,X,X,X,X)89 int f_9(X, X, X, X, X, X, X, X, X)
90 {
91     return 0;
92 }
93 
94 // fv_*
95 
fv_0()96 void fv_0()
97 {
98 }
99 
fv_1(X)100 void fv_1(X)
101 {
102 }
103 
fv_2(X,X)104 void fv_2(X, X)
105 {
106 }
107 
fv_3(X,X,X)108 void fv_3(X, X, X)
109 {
110 }
111 
fv_4(X,X,X,X)112 void fv_4(X, X, X, X)
113 {
114 }
115 
fv_5(X,X,X,X,X)116 void fv_5(X, X, X, X, X)
117 {
118 }
119 
fv_6(X,X,X,X,X,X)120 void fv_6(X, X, X, X, X, X)
121 {
122 }
123 
fv_7(X,X,X,X,X,X,X)124 void fv_7(X, X, X, X, X, X, X)
125 {
126 }
127 
fv_8(X,X,X,X,X,X,X,X)128 void fv_8(X, X, X, X, X, X, X, X)
129 {
130 }
131 
fv_9(X,X,X,X,X,X,X,X,X)132 void fv_9(X, X, X, X, X, X, X, X, X)
133 {
134 }
135 
test_eq(F f1,F f2)136 template<class F> void test_eq(F f1, F f2)
137 {
138     BOOST_TEST( function_equal( f1, f2 ) );
139 }
140 
test_ne(F f1,F f2)141 template<class F> void test_ne(F f1, F f2)
142 {
143     BOOST_TEST( !function_equal( f1, f2 ) );
144 }
145 
146 // 0
147 
test_0(F f)148 template<class F> void test_0(F f)
149 {
150     test_eq( boost::bind(f), boost::bind(f) );
151 }
152 
153 // 1
154 
test_1_(F f,V v1,V v2)155 template<class F, class V> void test_1_(F f, V v1, V v2)
156 {
157     test_eq( boost::bind(f, v1), boost::bind(f, v1) );
158     test_ne( boost::bind(f, v1), boost::bind(f, v2) );
159 }
160 
test_1(F f)161 template<class F> void test_1(F f)
162 {
163     test_eq( boost::bind(f, _1), boost::bind(f, _1) );
164 
165     test_1_( f, X(1), X(2) );
166 
167     X a(0), b(0);
168     test_1_( f, boost::ref(a), boost::ref(b) );
169 }
170 
171 // 2
172 
test_2_(F f,V v1,V v2)173 template<class F, class V> void test_2_(F f, V v1, V v2)
174 {
175     test_eq( boost::bind(f, v1, v1), boost::bind(f, v1, v1) );
176     test_ne( boost::bind(f, v1, v1), boost::bind(f, v1, v2) );
177     test_ne( boost::bind(f, v1, v1), boost::bind(f, v2, v1) );
178 }
179 
test_2(F f)180 template<class F> void test_2(F f)
181 {
182     test_eq( boost::bind(f, _1, _2), boost::bind(f, _1, _2) );
183 
184     test_2_( f, X(1), X(2) );
185 
186     X a(0), b(0);
187     test_2_( f, boost::ref(a), boost::ref(b) );
188 }
189 
190 // 3
191 
test_3_(F f,V v1,V v2)192 template<class F, class V> void test_3_(F f, V v1, V v2)
193 {
194     test_eq( boost::bind(f, v1, v1, v1), boost::bind(f, v1, v1, v1) );
195     test_ne( boost::bind(f, v1, v1, v1), boost::bind(f, v1, v1, v2) );
196     test_ne( boost::bind(f, v1, v1, v1), boost::bind(f, v1, v2, v1) );
197     test_ne( boost::bind(f, v1, v1, v1), boost::bind(f, v2, v1, v1) );
198 }
199 
test_3(F f)200 template<class F> void test_3(F f)
201 {
202     test_eq( boost::bind(f, _1, _2, _3), boost::bind(f, _1, _2, _3) );
203 
204     test_3_( f, X(1), X(2) );
205 
206     X a(0), b(0);
207     test_3_( f, boost::ref(a), boost::ref(b) );
208 }
209 
210 // 4
211 
test_4_(F f,V v1,V v2)212 template<class F, class V> void test_4_(F f, V v1, V v2)
213 {
214     test_eq( boost::bind(f, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1) );
215     test_ne( boost::bind(f, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v2) );
216     test_ne( boost::bind(f, v1, v1, v1, v1), boost::bind(f, v1, v1, v2, v1) );
217     test_ne( boost::bind(f, v1, v1, v1, v1), boost::bind(f, v1, v2, v1, v1) );
218     test_ne( boost::bind(f, v1, v1, v1, v1), boost::bind(f, v2, v1, v1, v1) );
219 }
220 
test_4(F f)221 template<class F> void test_4(F f)
222 {
223     test_eq( boost::bind(f, _1, _2, _3, _4), boost::bind(f, _1, _2, _3, _4) );
224 
225     test_4_( f, X(1), X(2) );
226 
227     X a(0), b(0);
228     test_4_( f, boost::ref(a), boost::ref(b) );
229 }
230 
231 // 5
232 
test_5_(F f,V v1,V v2)233 template<class F, class V> void test_5_(F f, V v1, V v2)
234 {
235     test_eq( boost::bind(f, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1) );
236     test_ne( boost::bind(f, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v2) );
237     test_ne( boost::bind(f, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v2, v1) );
238     test_ne( boost::bind(f, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v2, v1, v1) );
239     test_ne( boost::bind(f, v1, v1, v1, v1, v1), boost::bind(f, v1, v2, v1, v1, v1) );
240     test_ne( boost::bind(f, v1, v1, v1, v1, v1), boost::bind(f, v2, v1, v1, v1, v1) );
241 }
242 
test_5(F f)243 template<class F> void test_5(F f)
244 {
245     test_eq( boost::bind(f, _1, _2, _3, _4, _5), boost::bind(f, _1, _2, _3, _4, _5) );
246 
247     test_5_( f, X(1), X(2) );
248 
249     X a(0), b(0);
250     test_5_( f, boost::ref(a), boost::ref(b) );
251 }
252 
253 // 6
254 
test_6_(F f,V v1,V v2)255 template<class F, class V> void test_6_(F f, V v1, V v2)
256 {
257     test_eq( boost::bind(f, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1) );
258     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v2) );
259     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v2, v1) );
260     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v2, v1, v1) );
261     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v2, v1, v1, v1) );
262     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v2, v1, v1, v1, v1) );
263     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1), boost::bind(f, v2, v1, v1, v1, v1, v1) );
264 }
265 
test_6(F f)266 template<class F> void test_6(F f)
267 {
268     test_eq( boost::bind(f, _1, _2, _3, _4, _5, _6), boost::bind(f, _1, _2, _3, _4, _5, _6) );
269 
270     test_6_( f, X(1), X(2) );
271 
272     X a(0), b(0);
273     test_6_( f, boost::ref(a), boost::ref(b) );
274 }
275 
276 // 7
277 
test_7_(F f,V v1,V v2)278 template<class F, class V> void test_7_(F f, V v1, V v2)
279 {
280     test_eq( boost::bind(f, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1, v1) );
281     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1, v2) );
282     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v2, v1) );
283     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v2, v1, v1) );
284     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v2, v1, v1, v1) );
285     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v2, v1, v1, v1, v1) );
286     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v2, v1, v1, v1, v1, v1) );
287     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v2, v1, v1, v1, v1, v1, v1) );
288 }
289 
test_7(F f)290 template<class F> void test_7(F f)
291 {
292     test_eq( boost::bind(f, _1, _2, _3, _4, _5, _6, _7), boost::bind(f, _1, _2, _3, _4, _5, _6, _7) );
293 
294     test_7_( f, X(1), X(2) );
295 
296     X a(0), b(0);
297     test_7_( f, boost::ref(a), boost::ref(b) );
298 }
299 
300 // 8
301 
test_8_(F f,V v1,V v2)302 template<class F, class V> void test_8_(F f, V v1, V v2)
303 {
304     test_eq( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1) );
305     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v2) );
306     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1, v2, v1) );
307     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v2, v1, v1) );
308     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v2, v1, v1, v1) );
309     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v2, v1, v1, v1, v1) );
310     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v2, v1, v1, v1, v1, v1) );
311     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v2, v1, v1, v1, v1, v1, v1) );
312     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v2, v1, v1, v1, v1, v1, v1, v1) );
313 }
314 
test_8(F f)315 template<class F> void test_8(F f)
316 {
317     test_eq( boost::bind(f, _1, _2, _3, _4, _5, _6, _7, _8), boost::bind(f, _1, _2, _3, _4, _5, _6, _7, _8) );
318 
319     test_8_( f, X(1), X(2) );
320 
321     X a(0), b(0);
322     test_8_( f, boost::ref(a), boost::ref(b) );
323 }
324 
325 // 9
326 
test_9_(F f,V v1,V v2)327 template<class F, class V> void test_9_(F f, V v1, V v2)
328 {
329     test_eq( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1) );
330     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v2) );
331     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v2, v1) );
332     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v1, v2, v1, v1) );
333     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v1, v2, v1, v1, v1) );
334     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v1, v2, v1, v1, v1, v1) );
335     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v1, v2, v1, v1, v1, v1, v1) );
336     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v1, v2, v1, v1, v1, v1, v1, v1) );
337     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v1, v2, v1, v1, v1, v1, v1, v1, v1) );
338     test_ne( boost::bind(f, v1, v1, v1, v1, v1, v1, v1, v1, v1), boost::bind(f, v2, v1, v1, v1, v1, v1, v1, v1, v1) );
339 }
340 
test_9(F f)341 template<class F> void test_9(F f)
342 {
343     test_eq( boost::bind(f, _1, _2, _3, _4, _5, _6, _7, _8, _9), boost::bind(f, _1, _2, _3, _4, _5, _6, _7, _8, _9) );
344 
345     test_9_( f, X(1), X(2) );
346 
347     X a(0), b(0);
348     test_9_( f, boost::ref(a), boost::ref(b) );
349 }
350 
main()351 int main()
352 {
353     // 0
354 
355     test_0( f_0 );
356     test_0( fv_0 );
357 
358     // 1
359 
360     test_1( f_1 );
361     test_1( fv_1 );
362 
363     // 2
364 
365     test_2( f_2 );
366     test_2( fv_2 );
367 
368     // 3
369 
370     test_3( f_3 );
371     test_3( fv_3 );
372 
373     // 4
374 
375     test_4( f_4 );
376     test_4( fv_4 );
377 
378     // 5
379 
380     test_5( f_5 );
381     test_5( fv_5 );
382 
383     // 6
384 
385     test_6( f_6 );
386     test_6( fv_6 );
387 
388     // 7
389 
390     test_7( f_7 );
391     test_7( fv_7 );
392 
393     // 8
394 
395     test_8( f_8 );
396     test_8( fv_8 );
397 
398     // 9
399 
400     test_9( f_9 );
401     test_9( fv_9 );
402 
403     return boost::report_errors();
404 }
405