PageRenderTime 108ms CodeModel.GetById 10ms app.highlight 91ms RepoModel.GetById 1ms app.codeStats 1ms

/Src/Dependencies/Boost/libs/phoenix/test/boost_bind_compatibility/bind_eq_test.cpp

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