diff options
Diffstat (limited to 'boost/ratio/detail/mpl/gcd.hpp')
-rw-r--r-- | boost/ratio/detail/mpl/gcd.hpp | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/boost/ratio/detail/mpl/gcd.hpp b/boost/ratio/detail/mpl/gcd.hpp index 59a09714cd..c8258cfe70 100644 --- a/boost/ratio/detail/mpl/gcd.hpp +++ b/boost/ratio/detail/mpl/gcd.hpp @@ -2,8 +2,8 @@ // // Copyright Vicente J. Botet Escriba 2010 // -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/mpl for documentation. @@ -20,6 +20,8 @@ #include <boost/mpl/aux_/config/eti.hpp> #include <boost/mpl/aux_/config/integral.hpp> #include <boost/mpl/aux_/config/static_constant.hpp> +#include <boost/mpl/aux_/config/dependent_nttp.hpp> +#include <boost/cstdint.hpp> #if !defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC_2) \ && !defined(BOOST_MPL_PREPROCESSING_MODE) \ @@ -66,29 +68,52 @@ struct gcd_c }; namespace aux { - template< typename T1, T1 n1, bool n1_is_0, typename T2, T2 n2, bool n2_is_0 > + + // Workaround for error: the type of partial specialization template parameter constant "n2" + // depends on another template parameter + // Note: this solution could be wrong for n1 or n2 = [2**63 .. 2**64-1] +#if defined(BOOST_MPL_CFG_NO_DEPENDENT_NONTYPE_PARAMETER_IN_PARTIAL_SPEC) + + template< typename T1, boost::intmax_t n1, bool n1_is_0 + , typename T2, boost::intmax_t n2, bool n2_is_0 > + struct gcd_aux + : gcd_aux<T2, n2, n2==0, T1, (n1 % n2), (n1 % n2)==0> + {}; + + template <typename T1, boost::intmax_t n1, typename T2, boost::intmax_t n2> + struct gcd_aux<T1, n1, false, T2, n2, true> : integral_c<T1, n1> + {}; + + template <typename T1, boost::intmax_t n1, typename T2, boost::intmax_t n2, bool C> + struct gcd_aux<T1, n1, true, T2, n2, C> : integral_c<T2, n2> + {}; + +#else // defined(BOOST_MPL_CFG_NO_DEPENDENT_NONTYPE_PARAMETER_IN_PARTIAL_SPEC) + + template< typename T1, T1 n1, bool n1_is_0, typename T2, T2 n2, bool n2_is_0 > struct gcd_aux - - : gcd_aux<T2, n2, n2==0, + + : gcd_aux<T2, n2, n2==0, typename aux::largest_int<T1, T2>::type, - //~ T1, + //~ T1, (n1 % n2), (n1 % n2)==0> {}; - + template <typename T1, T1 n1, typename T2, T2 n2> - struct gcd_aux<T1, n1, false, T2, n2, true> : integral_c<T1, n1> + struct gcd_aux<T1, n1, false, T2, n2, true> : integral_c<T1, n1> {}; template <typename T1, T1 n1, typename T2, T2 n2, bool C> - struct gcd_aux<T1, n1, true, T2, n2, C> : integral_c<T2, n2> + struct gcd_aux<T1, n1, true, T2, n2, C> : integral_c<T2, n2> {}; +#endif // defined(BOOST_MPL_CFG_NO_DEPENDENT_NONTYPE_PARAMETER_IN_PARTIAL_SPEC) } template<> struct gcd_impl<integral_c_tag, integral_c_tag> { template< typename N1, typename N2 > struct apply - : abs<aux::gcd_aux< typename N1::value_type, N1::value, N1::value==0, + : abs<aux::gcd_aux< typename N1::value_type, N1::value, N1::value==0, typename N2::value_type, N2::value, N2::value==0 > > { }; |