summaryrefslogtreecommitdiff
path: root/boost/ratio/detail/mpl/gcd.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/ratio/detail/mpl/gcd.hpp')
-rw-r--r--boost/ratio/detail/mpl/gcd.hpp45
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 > >
{
};