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 { 61 typedef typename T::tag type; 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 : 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 BOOST_MPL_AUX_LAMBDA_SUPPORT( 91 5 92 , bitand_ 93 , ( N1, N2, N3, N4, N5 ) 94 ) 95 }; 96 97 template< 98 typename N1 99 , typename N2 100 > 101 struct bitand_2 102 : aux::msvc_eti_base< typename apply_wrap2< 103 bitand_impl< 104 typename bitand_tag<N1>::type 105 , typename bitand_tag<N2>::type 106 > 107 , N1 108 , N2 109 >::type >::type 110 111 { 112 BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitand_2, (N1, N2)) 113 114 }; 115 116 BOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_) 117 118 }} 119 120 namespace boost { namespace mpl { 121 122 namespace aux { 123 template< typename T, T n1, T n2 > 124 struct bitand_wknd 125 { 126 BOOST_STATIC_CONSTANT(T, value = (n1 & n2)); 127 typedef integral_c< T,value > type; 128 }; 129 130 } 131 132 template<> 133 struct bitand_impl< integral_c_tag,integral_c_tag > 134 { 135 template< typename N1, typename N2 > struct apply 136 : aux::bitand_wknd< 137 typename aux::largest_int< 138 typename N1::value_type 139 , typename N2::value_type 140 >::type 141 , N1::value 142 , N2::value 143 >::type 144 145 { 146 }; 147 }; 148 149 }} 150