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 // $Id$ 11 // $Date$ 12 // $Revision$ 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> > )); 68