1 2 // Copyright Aleksey Gurtovoy 2000-2004 3 // Copyright Jaap Suter 2003 4 // 5 // Distributed under the Boost Software License, Version 1.0. 6 // (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 // 9 10 // Preprocessed version of "boost/mpl/bitand.hpp" header 11 // -- DO NOT modify by hand! 12 13 namespace boost { namespace mpl { 14 15 template< 16 typename Tag1 17 , typename Tag2 18 19 , BOOST_MPL_AUX_NTTP_DECL(int, tag1_) = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value 20 , BOOST_MPL_AUX_NTTP_DECL(int, tag2_) = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value 21 > 22 struct bitand_impl 23 : if_c< 24 ( tag1_ > tag2_ ) 25 , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 > 26 , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 > 27 >::type 28 { 29 }; 30 31 /// for Digital Mars C++/compilers with no CTPS/TTP support 32 template<> struct bitand_impl< na,na > 33 { 34 template< typename U1, typename U2 > struct apply 35 { 36 typedef apply type; 37 BOOST_STATIC_CONSTANT(int, value = 0); 38 }; 39 }; 40 41 template<> struct bitand_impl< na,integral_c_tag > 42 { 43 template< typename U1, typename U2 > struct apply 44 { 45 typedef apply type; 46 BOOST_STATIC_CONSTANT(int, value = 0); 47 }; 48 }; 49 50 template<> struct bitand_impl< integral_c_tag,na > 51 { 52 template< typename U1, typename U2 > struct apply 53 { 54 typedef apply type; 55 BOOST_STATIC_CONSTANT(int, value = 0); 56 }; 57 }; 58 59 template< typename T > struct bitand_tag 60 : tag< T,na > 61 { 62 }; 63 64 /// forward declaration 65 66 template< 67 typename BOOST_MPL_AUX_NA_PARAM(N1) 68 , typename BOOST_MPL_AUX_NA_PARAM(N2) 69 > 70 struct bitand_2; 71 72 template< 73 typename BOOST_MPL_AUX_NA_PARAM(N1) 74 , typename BOOST_MPL_AUX_NA_PARAM(N2) 75 , typename N3 = na, typename N4 = na, typename N5 = na 76 > 77 struct bitand_ 78 79 : aux::msvc_eti_base< typename if_< 80 81 is_na<N3> 82 , bitand_2< N1,N2 > 83 , bitand_< 84 bitand_2< N1,N2 > 85 , N3, N4, N5 86 > 87 >::type 88 89 > 90 91 { 92 BOOST_MPL_AUX_LAMBDA_SUPPORT( 93 5 94 , bitand_ 95 , ( N1, N2, N3, N4, N5 ) 96 ) 97 }; 98 99 template< 100 typename N1 101 , typename N2 102 > 103 struct bitand_2 104 : aux::msvc_eti_base< typename apply_wrap2< 105 bitand_impl< 106 typename bitand_tag<N1>::type 107 , typename bitand_tag<N2>::type 108 > 109 , N1 110 , N2 111 >::type >::type 112 113 { 114 BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitand_2, (N1, N2)) 115 116 }; 117 118 BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_) 119 120 }} 121 122 namespace boost { namespace mpl { 123 124 namespace aux { 125 template< typename T, T n1, T n2 > 126 struct bitand_wknd 127 { 128 BOOST_STATIC_CONSTANT(T, value = (n1 & n2)); 129 typedef integral_c< T,value > type; 130 }; 131 132 } 133 134 template<> 135 struct bitand_impl< integral_c_tag,integral_c_tag > 136 { 137 template< typename N1, typename N2 > struct apply 138 : aux::bitand_wknd< 139 typename aux::largest_int< 140 typename N1::value_type 141 , typename N2::value_type 142 >::type 143 , N1::value 144 , N2::value 145 >::type 146 147 { 148 }; 149 }; 150 151 }} 152