File indexing completed on 2025-01-18 09:41:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 namespace boost { namespace mpl {
0014
0015 template<
0016 typename Tag1
0017 , typename Tag2
0018
0019 , BOOST_MPL_AUX_NTTP_DECL(int, tag1_) = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value
0020 , BOOST_MPL_AUX_NTTP_DECL(int, tag2_) = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value
0021 >
0022 struct shift_left_impl
0023 : if_c<
0024 ( tag1_ > tag2_ )
0025 , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >
0026 , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >
0027 >::type
0028 {
0029 };
0030
0031
0032 template<> struct shift_left_impl< na,na >
0033 {
0034 template< typename U1, typename U2 > struct apply
0035 {
0036 typedef apply type;
0037 BOOST_STATIC_CONSTANT(int, value = 0);
0038 };
0039 };
0040
0041 template<> struct shift_left_impl< na,integral_c_tag >
0042 {
0043 template< typename U1, typename U2 > struct apply
0044 {
0045 typedef apply type;
0046 BOOST_STATIC_CONSTANT(int, value = 0);
0047 };
0048 };
0049
0050 template<> struct shift_left_impl< integral_c_tag,na >
0051 {
0052 template< typename U1, typename U2 > struct apply
0053 {
0054 typedef apply type;
0055 BOOST_STATIC_CONSTANT(int, value = 0);
0056 };
0057 };
0058
0059 template< typename T > struct shift_left_tag
0060 : tag< T,na >
0061 {
0062 };
0063
0064 template<
0065 typename BOOST_MPL_AUX_NA_PARAM(N1)
0066 , typename BOOST_MPL_AUX_NA_PARAM(N2)
0067 >
0068 struct shift_left
0069 : aux::msvc_eti_base< typename apply_wrap2<
0070 shift_left_impl<
0071 typename shift_left_tag<N1>::type
0072 , typename shift_left_tag<N2>::type
0073 >
0074 , N1
0075 , N2
0076 >::type >::type
0077
0078 {
0079 BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))
0080
0081 };
0082
0083 BOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)
0084
0085 }}
0086
0087 namespace boost { namespace mpl {
0088
0089 namespace aux {
0090 template< typename T, typename Shift, T n, Shift s >
0091 struct shift_left_wknd
0092 {
0093 BOOST_STATIC_CONSTANT(T, value = (n << s));
0094 typedef integral_c< T,value > type;
0095 };
0096
0097 }
0098
0099 template<>
0100 struct shift_left_impl< integral_c_tag,integral_c_tag >
0101 {
0102 template< typename N, typename S > struct apply
0103 : aux::shift_left_wknd<
0104 typename N::value_type
0105 , typename S::value_type
0106 , N::value
0107 , S::value
0108 >::type
0109
0110 {
0111 };
0112 };
0113
0114 }}