[29] | 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/example/integer.cpp,v $ |
---|
| 11 | // $Date: 2004/09/02 15:41:29 $ |
---|
| 12 | // $Revision: 1.4 $ |
---|
| 13 | |
---|
| 14 | #include <boost/mpl/multiplies.hpp> |
---|
| 15 | #include <boost/mpl/list.hpp> |
---|
| 16 | #include <boost/mpl/lower_bound.hpp> |
---|
| 17 | #include <boost/mpl/transform_view.hpp> |
---|
| 18 | #include <boost/mpl/sizeof.hpp> |
---|
| 19 | #include <boost/mpl/int.hpp> |
---|
| 20 | #include <boost/mpl/identity.hpp> |
---|
| 21 | #include <boost/mpl/base.hpp> |
---|
| 22 | #include <boost/mpl/eval_if.hpp> |
---|
| 23 | #include <boost/mpl/deref.hpp> |
---|
| 24 | #include <boost/mpl/begin_end.hpp> |
---|
| 25 | #include <boost/mpl/assert.hpp> |
---|
| 26 | |
---|
| 27 | #include <boost/type_traits/is_same.hpp> |
---|
| 28 | |
---|
| 29 | namespace mpl = boost::mpl; |
---|
| 30 | using namespace mpl::placeholders; |
---|
| 31 | |
---|
| 32 | template< int bit_size > |
---|
| 33 | class big_int |
---|
| 34 | { |
---|
| 35 | // ... |
---|
| 36 | }; |
---|
| 37 | |
---|
| 38 | template< int bit_size > |
---|
| 39 | struct integer |
---|
| 40 | { |
---|
| 41 | typedef mpl::list<char,short,int,long> builtins_; |
---|
| 42 | typedef typename mpl::base< typename mpl::lower_bound< |
---|
| 43 | mpl::transform_view< builtins_ |
---|
| 44 | , mpl::multiplies< mpl::sizeof_<_1>, mpl::int_<8> > |
---|
| 45 | > |
---|
| 46 | , mpl::int_<bit_size> |
---|
| 47 | >::type >::type iter_; |
---|
| 48 | |
---|
| 49 | typedef typename mpl::end<builtins_>::type last_; |
---|
| 50 | typedef typename mpl::eval_if< |
---|
| 51 | boost::is_same<iter_,last_> |
---|
| 52 | , mpl::identity< big_int<bit_size> > |
---|
| 53 | , mpl::deref<iter_> |
---|
| 54 | >::type type; |
---|
| 55 | }; |
---|
| 56 | |
---|
| 57 | typedef integer<1>::type int1; |
---|
| 58 | typedef integer<5>::type int5; |
---|
| 59 | typedef integer<15>::type int15; |
---|
| 60 | typedef integer<32>::type int32; |
---|
| 61 | typedef integer<100>::type int100; |
---|
| 62 | |
---|
| 63 | BOOST_MPL_ASSERT(( boost::is_same< int1, char > )); |
---|
| 64 | BOOST_MPL_ASSERT(( boost::is_same< int5, char > )); |
---|
| 65 | BOOST_MPL_ASSERT(( boost::is_same< int15, short > )); |
---|
| 66 | BOOST_MPL_ASSERT(( boost::is_same< int32, int > )); |
---|
| 67 | BOOST_MPL_ASSERT(( boost::is_same< int100, big_int<100> > )); |
---|