| 1 |  | 
|---|
| 2 | // Copyright Aleksey Gurtovoy 2001-2004 | 
|---|
| 3 | // | 
|---|
| 4 | // Distributed under the Boost Software License, Version 1.0.  | 
|---|
| 5 | // (See accompanying file LICENSE_1_0.txt or copy at  | 
|---|
| 6 | // http://www.boost.org/LICENSE_1_0.txt) | 
|---|
| 7 | // | 
|---|
| 8 | // See http://www.boost.org/libs/mpl for documentation. | 
|---|
| 9 |  | 
|---|
| 10 | // $Source: /cvsroot/boost/boost/libs/mpl/test/lambda.cpp,v $ | 
|---|
| 11 | // $Date: 2005/01/10 14:01:31 $ | 
|---|
| 12 | // $Revision: 1.8 $ | 
|---|
| 13 |  | 
|---|
| 14 | #include <boost/mpl/logical.hpp> | 
|---|
| 15 | #include <boost/mpl/comparison.hpp> | 
|---|
| 16 | #include <boost/mpl/lambda.hpp> | 
|---|
| 17 | #include <boost/mpl/size_t.hpp> | 
|---|
| 18 | #include <boost/mpl/int.hpp> | 
|---|
| 19 | #include <boost/mpl/bool.hpp> | 
|---|
| 20 | #include <boost/mpl/sizeof.hpp> | 
|---|
| 21 | #include <boost/mpl/apply.hpp> | 
|---|
| 22 |  | 
|---|
| 23 | #include <boost/mpl/aux_/test.hpp> | 
|---|
| 24 |  | 
|---|
| 25 | #include <boost/type_traits/is_same.hpp> | 
|---|
| 26 | #include <boost/type_traits/is_float.hpp> | 
|---|
| 27 |  | 
|---|
| 28 | struct my | 
|---|
| 29 | { | 
|---|
| 30 |     char a[100]; | 
|---|
| 31 | }; | 
|---|
| 32 |  | 
|---|
| 33 | MPL_TEST_CASE() | 
|---|
| 34 | { | 
|---|
| 35 |     // !(x == char) && !(x == double) || sizeof(x) > 8 | 
|---|
| 36 |     typedef lambda< | 
|---|
| 37 |         or_< | 
|---|
| 38 |               and_< | 
|---|
| 39 |                     not_< boost::is_same<_1, char> > | 
|---|
| 40 |                   , not_< boost::is_float<_1> > | 
|---|
| 41 |                   > | 
|---|
| 42 |             , greater< sizeof_<_1>, mpl::size_t<8> > | 
|---|
| 43 |             > | 
|---|
| 44 |         >::type f; | 
|---|
| 45 |  | 
|---|
| 46 |     MPL_ASSERT_NOT(( apply_wrap1<f,char> )); | 
|---|
| 47 |     MPL_ASSERT_NOT(( apply_wrap1<f,double> )); | 
|---|
| 48 |     MPL_ASSERT(( apply_wrap1<f,long> )); | 
|---|
| 49 |     MPL_ASSERT(( apply_wrap1<f,my> )); | 
|---|
| 50 | } | 
|---|
| 51 |  | 
|---|
| 52 | MPL_TEST_CASE() | 
|---|
| 53 | { | 
|---|
| 54 |     // x == y || x == my || sizeof(x) == sizeof(y) | 
|---|
| 55 |     typedef lambda< | 
|---|
| 56 |         or_<  | 
|---|
| 57 |               boost::is_same<_1, _2> | 
|---|
| 58 |             , boost::is_same<_2, my> | 
|---|
| 59 |             , equal_to< sizeof_<_1>, sizeof_<_2> > | 
|---|
| 60 |             > | 
|---|
| 61 |         >::type f; | 
|---|
| 62 |  | 
|---|
| 63 |     MPL_ASSERT_NOT(( apply_wrap2<f,double,char> )); | 
|---|
| 64 |     MPL_ASSERT_NOT(( apply_wrap2<f,my,int> )); | 
|---|
| 65 |     MPL_ASSERT_NOT(( apply_wrap2<f,my,char[99]> )); | 
|---|
| 66 |     MPL_ASSERT(( apply_wrap2<f,int,int> )); | 
|---|
| 67 |     MPL_ASSERT(( apply_wrap2<f,my,my> )); | 
|---|
| 68 |     MPL_ASSERT(( apply_wrap2<f,signed long, unsigned long> )); | 
|---|
| 69 | } | 
|---|
| 70 |  | 
|---|
| 71 | MPL_TEST_CASE() | 
|---|
| 72 | { | 
|---|
| 73 |     // bind <-> lambda interaction | 
|---|
| 74 |     typedef lambda< less<_1,_2> >::type pred; | 
|---|
| 75 |     typedef bind2< pred, _1, int_<4> > f; | 
|---|
| 76 |      | 
|---|
| 77 |     MPL_ASSERT(( apply_wrap1< f,int_<3> > )); | 
|---|
| 78 | } | 
|---|