• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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