1 // Boost common_factor_ct.hpp header file ----------------------------------// 2 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) 7 8 // See http://www.boost.org for updates, documentation, and revision history. 9 10 #ifndef BOOST_INTEGER_COMMON_FACTOR_CT_HPP 11 #define BOOST_INTEGER_COMMON_FACTOR_CT_HPP 12 13 #include <boost/integer_fwd.hpp> // self include 14 #include <boost/config.hpp> // for BOOST_STATIC_CONSTANT, etc. 15 16 namespace boost 17 { 18 namespace integer 19 { 20 21 // Implementation details --------------------------------------------------// 22 23 namespace detail 24 { 25 // Build GCD with Euclid's recursive algorithm 26 template < static_gcd_type Value1, static_gcd_type Value2 > 27 struct static_gcd_helper_t 28 { 29 private: 30 BOOST_STATIC_CONSTANT( static_gcd_type, new_value1 = Value2 ); 31 BOOST_STATIC_CONSTANT( static_gcd_type, new_value2 = Value1 % Value2 ); 32 33 #ifndef BOOST_BORLANDC 34 #define BOOST_DETAIL_GCD_HELPER_VAL(Value) static_cast<static_gcd_type>(Value) 35 #else 36 typedef static_gcd_helper_t self_type; 37 #define BOOST_DETAIL_GCD_HELPER_VAL(Value) (self_type:: Value ) 38 #endif 39 40 typedef static_gcd_helper_t< BOOST_DETAIL_GCD_HELPER_VAL(new_value1), 41 BOOST_DETAIL_GCD_HELPER_VAL(new_value2) > next_step_type; 42 43 #undef BOOST_DETAIL_GCD_HELPER_VAL 44 45 public: 46 BOOST_STATIC_CONSTANT( static_gcd_type, value = next_step_type::value ); 47 }; 48 49 // Non-recursive case 50 template < static_gcd_type Value1 > 51 struct static_gcd_helper_t< Value1, 0UL > 52 { 53 BOOST_STATIC_CONSTANT( static_gcd_type, value = Value1 ); 54 }; 55 56 // Build the LCM from the GCD 57 template < static_gcd_type Value1, static_gcd_type Value2 > 58 struct static_lcm_helper_t 59 { 60 typedef static_gcd_helper_t<Value1, Value2> gcd_type; 61 62 BOOST_STATIC_CONSTANT( static_gcd_type, value = Value1 / gcd_type::value 63 * Value2 ); 64 }; 65 66 // Special case for zero-GCD values 67 template < > 68 struct static_lcm_helper_t< 0UL, 0UL > 69 { 70 BOOST_STATIC_CONSTANT( static_gcd_type, value = 0UL ); 71 }; 72 73 } // namespace detail 74 75 76 // Compile-time greatest common divisor evaluator class declaration --------// 77 78 template < static_gcd_type Value1, static_gcd_type Value2 > struct static_gcd 79 { 80 BOOST_STATIC_CONSTANT( static_gcd_type, value = (detail::static_gcd_helper_t<Value1, Value2>::value) ); 81 }; // boost::integer::static_gcd 82 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; 85 #endif 86 87 // Compile-time least common multiple evaluator class declaration ----------// 88 89 template < static_gcd_type Value1, static_gcd_type Value2 > struct static_lcm 90 { 91 BOOST_STATIC_CONSTANT( static_gcd_type, value = (detail::static_lcm_helper_t<Value1, Value2>::value) ); 92 }; // boost::integer::static_lcm 93 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; 96 #endif 97 98 } // namespace integer 99 } // namespace boost 100 101 102 #endif // BOOST_INTEGER_COMMON_FACTOR_CT_HPP 103