1 // Boost common_factor_ct.hpp header file ----------------------------------//
3 // (C) Copyright Daryle Walker and Stephen Cleary 2001-2002.
4 // Distributed under the Boost Software License, Version 1.0. (See
5 // accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
8 // See http://www.boost.org for updates, documentation, and revision history.
10 #ifndef BOOST_INTEGER_COMMON_FACTOR_CT_HPP
11 #define BOOST_INTEGER_COMMON_FACTOR_CT_HPP
13 #include <boost/integer_fwd.hpp> // self include
14 #include <boost/config.hpp> // for BOOST_STATIC_CONSTANT, etc.
21 // Implementation details --------------------------------------------------//
25 // Build GCD with Euclid's recursive algorithm
26 template < static_gcd_type Value1, static_gcd_type Value2 >
27 struct static_gcd_helper_t
30 BOOST_STATIC_CONSTANT( static_gcd_type, new_value1 = Value2 );
31 BOOST_STATIC_CONSTANT( static_gcd_type, new_value2 = Value1 % Value2 );
34 #define BOOST_DETAIL_GCD_HELPER_VAL(Value) static_cast<static_gcd_type>(Value)
36 typedef static_gcd_helper_t self_type;
37 #define BOOST_DETAIL_GCD_HELPER_VAL(Value) (self_type:: Value )
40 typedef static_gcd_helper_t< BOOST_DETAIL_GCD_HELPER_VAL(new_value1),
41 BOOST_DETAIL_GCD_HELPER_VAL(new_value2) > next_step_type;
43 #undef BOOST_DETAIL_GCD_HELPER_VAL
46 BOOST_STATIC_CONSTANT( static_gcd_type, value = next_step_type::value );
50 template < static_gcd_type Value1 >
51 struct static_gcd_helper_t< Value1, 0UL >
53 BOOST_STATIC_CONSTANT( static_gcd_type, value = Value1 );
56 // Build the LCM from the GCD
57 template < static_gcd_type Value1, static_gcd_type Value2 >
58 struct static_lcm_helper_t
60 typedef static_gcd_helper_t<Value1, Value2> gcd_type;
62 BOOST_STATIC_CONSTANT( static_gcd_type, value = Value1 / gcd_type::value
66 // Special case for zero-GCD values
68 struct static_lcm_helper_t< 0UL, 0UL >
70 BOOST_STATIC_CONSTANT( static_gcd_type, value = 0UL );
76 // Compile-time greatest common divisor evaluator class declaration --------//
78 template < static_gcd_type Value1, static_gcd_type Value2 > struct static_gcd
80 BOOST_STATIC_CONSTANT( static_gcd_type, value = (detail::static_gcd_helper_t<Value1, Value2>::value) );
81 }; // boost::integer::static_gcd
83 #if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
84 template< static_gcd_type Value1, static_gcd_type Value2 > static_gcd_type const static_gcd< Value1, Value2 >::value;
87 // Compile-time least common multiple evaluator class declaration ----------//
89 template < static_gcd_type Value1, static_gcd_type Value2 > struct static_lcm
91 BOOST_STATIC_CONSTANT( static_gcd_type, value = (detail::static_lcm_helper_t<Value1, Value2>::value) );
92 }; // boost::integer::static_lcm
94 #if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
95 template< static_gcd_type Value1, static_gcd_type Value2 > static_gcd_type const static_lcm< Value1, Value2 >::value;
98 } // namespace integer
102 #endif // BOOST_INTEGER_COMMON_FACTOR_CT_HPP