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