$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r49971 - trunk/boost/units
From: steven_at_[hidden]
Date: 2008-11-27 18:35:06
Author: steven_watanabe
Date: 2008-11-27 18:35:06 EST (Thu, 27 Nov 2008)
New Revision: 49971
URL: http://svn.boost.org/trac/boost/changeset/49971
Log:
Try to fix static_rational on Borland
Text files modified: 
   trunk/boost/units/static_rational.hpp |   110 +++++++++++++++++++++++++++++++++++++-- 
   1 files changed, 102 insertions(+), 8 deletions(-)
Modified: trunk/boost/units/static_rational.hpp
==============================================================================
--- trunk/boost/units/static_rational.hpp	(original)
+++ trunk/boost/units/static_rational.hpp	2008-11-27 18:35:06 EST (Thu, 27 Nov 2008)
@@ -18,6 +18,7 @@
 #ifdef __BORLANDC__
 #include <boost/mpl/eval_if.hpp>
 #include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/identity.hpp>
 #endif
 
 #include <boost/units/config.hpp>
@@ -42,7 +43,7 @@
 template<integer_type Value>
 struct static_abs
 {
-    BOOST_STATIC_CONSTANT(integer_type,value) = Value < 0 ? -Value : Value;
+    BOOST_STATIC_CONSTANT(integer_type,value = Value < 0 ? -Value : Value);
 };
 
 /// Compile time rational number.
@@ -64,20 +65,28 @@
 may not be floating point values, while powers and roots of rational numbers can produce floating point 
 values. 
 */
+#ifdef __BORLANDC__
+
+template<integer_type X>
+struct make_integral_c {
+    typedef boost::mpl::integral_c<integer_type, X> type;
+};
+
 template<integer_type N,integer_type D = 1>
 class static_rational
 {
-#ifdef __BORLANDC__
-    private:
+    public:
+
+        typedef static_rational this_type;
 
         typedef boost::mpl::integral_c<integer_type, N> N_type;
         typedef boost::mpl::integral_c<integer_type, D> D_type;
 
-        typedef boost::mpl::integral_c<integer_type,
+        typedef typename make_integral_c<
             (::boost::math::static_gcd<
                 ::boost::units::static_abs<N>::value,
                 ::boost::units::static_abs<D>::value
-            >::value)> gcd_type;
+            >::value)>::type gcd_type;
         typedef typename boost::mpl::eval_if<
             boost::mpl::less<
                 D_type,
@@ -111,7 +120,11 @@
         // INTERNAL ONLY
         static_rational() { }
         //~static_rational() { }
+};
 #else
+template<integer_type N,integer_type D = 1>
+class static_rational
+{
     private:
 
         static const integer_type   nabs = static_abs<N>::value,
@@ -140,10 +153,9 @@
         
         // INTERNAL ONLY
         static_rational() { }
-        //~static_rational() { }
-#endif
-        
+        //~static_rational() { }   
 };
+#endif
 
 }
 
@@ -178,6 +190,86 @@
 
 namespace mpl {
 
+#ifdef __BORLANDC__
+
+template<>
+struct plus_impl<boost::units::detail::static_rational_tag, boost::units::detail::static_rational_tag>
+{
+    template<class T0, class T1>
+    struct apply {
+        typedef typename boost::units::static_rational<
+            ::boost::mpl::plus<
+                boost::mpl::times<typename T0::N_type, typename T1::D_type>,
+                boost::mpl::times<typename T1::N_type, typename T0::D_type>
+            >::value,
+            ::boost::mpl::times<typename T0::D_type, typename T1::D_type>::value
+        >::type type;
+    };
+};
+
+template<>
+struct minus_impl<boost::units::detail::static_rational_tag, boost::units::detail::static_rational_tag>
+{
+    template<class T0, class T1>
+    struct apply {
+        typedef typename boost::units::static_rational<
+            ::boost::mpl::minus<
+                boost::mpl::times<typename T0::N_type, typename T1::D_type>,
+                boost::mpl::times<typename T1::N_type, typename T0::D_type>
+            >::value,
+            ::boost::mpl::times<typename T0::D_type, typename T1::D_type>::value
+        >::type type;
+    };
+};
+
+template<>
+struct times_impl<boost::units::detail::static_rational_tag, boost::units::detail::static_rational_tag>
+{
+    template<class T0, class T1>
+    struct apply {
+        typedef typename boost::units::static_rational<
+            ::boost::mpl::times<typename T0::N_type, typename T1::N_type>::value,
+            ::boost::mpl::times<typename T0::D_type, typename T1::D_type>::value
+        >::type type;
+    };
+};
+
+template<>
+struct divides_impl<boost::units::detail::static_rational_tag, boost::units::detail::static_rational_tag>
+{
+    template<class T0, class T1>
+    struct apply {
+        typedef typename boost::units::static_rational<
+            ::boost::mpl::times<typename T0::N_type, typename T1::D_type>::value,
+            ::boost::mpl::times<typename T0::D_type, typename T1::N_type>::value
+        >::type type;
+    };
+};
+
+template<>
+struct negate_impl<boost::units::detail::static_rational_tag>
+{
+    template<class T0>
+    struct apply {
+        typedef typename boost::units::static_rational<
+            ::boost::mpl::negate<typename T0::N_type>::value,
+            ::boost::mpl::identity<T0>::type::Denominator
+        >::type type;
+    };
+};
+
+template<>
+struct less_impl<boost::units::detail::static_rational_tag, boost::units::detail::static_rational_tag>
+{
+    template<class T0, class T1>
+    struct apply
+    {
+        typedef mpl::bool_<((mpl::minus<T0, T1>::type::Numerator) < 0)> type;
+    };
+};
+
+#else
+
 template<>
 struct plus_impl<boost::units::detail::static_rational_tag, boost::units::detail::static_rational_tag>
 {
@@ -245,6 +337,8 @@
     };
 };
 
+#endif
+
 
 }