$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r53908 - in branches/release: boost/units boost/units/detail libs/units/doc libs/units/example libs/units/test
From: steven_at_[hidden]
Date: 2009-06-14 15:32:28
Author: steven_watanabe
Date: 2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
New Revision: 53908
URL: http://svn.boost.org/trac/boost/changeset/53908
Log:
Full merge of units from the trunk. Revisions [51031], [51066], [51189], [52773], [53125], [53293], and [53577]
Added:
   branches/release/libs/units/test/test_output.cpp
      - copied, changed from r53293, /trunk/libs/units/test/test_output.cpp
Text files modified: 
   branches/release/boost/units/absolute.hpp            |     7 +++----                                 
   branches/release/boost/units/conversion.hpp          |    10 +++++++---                              
   branches/release/boost/units/detail/utility.hpp      |    12 ------------                            
   branches/release/boost/units/io.hpp                  |    30 ++++++++++++++++++++++--------          
   branches/release/libs/units/doc/units.qbk            |    13 ++++++++-----                           
   branches/release/libs/units/example/dimension.cpp    |     7 ++-----                                 
   branches/release/libs/units/example/kitchen_sink.cpp |     4 ----                                    
   branches/release/libs/units/test/Jamfile.v2          |     3 ++-                                     
   branches/release/libs/units/test/test_conversion.cpp |     5 +++++                                   
   branches/release/libs/units/test/test_output.cpp     |     7 +++++++                                 
   branches/release/libs/units/test/test_unscale.cpp    |     6 ++++++                                  
   11 files changed, 62 insertions(+), 42 deletions(-)
Modified: branches/release/boost/units/absolute.hpp
==============================================================================
--- branches/release/boost/units/absolute.hpp	(original)
+++ branches/release/boost/units/absolute.hpp	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -11,8 +11,7 @@
 #ifndef BOOST_UNITS_ABSOLUTE_HPP
 #define BOOST_UNITS_ABSOLUTE_HPP
 
-// necessary because the expression os << "absolute " is not dependent.
-#include <ostream>
+#include <iosfwd>
 
 #include <boost/units/detail/absolute_impl.hpp>
 
@@ -90,8 +89,8 @@
 }
 
 /// Print an absolute unit
-template<class Y>
-std::ostream& operator<<(std::ostream& os,const absolute<Y>& aval)
+template<class Char, class Traits, class Y>
+std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& os,const absolute<Y>& aval)
 {
 
     os << "absolute " << aval.value();
Modified: branches/release/boost/units/conversion.hpp
==============================================================================
--- branches/release/boost/units/conversion.hpp	(original)
+++ branches/release/boost/units/conversion.hpp	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -41,6 +41,10 @@
 /// }
 /// }
 /// @endcode
+///
+/// In most cases, the predefined specializations for @c unit
+/// and @c absolute should be sufficient, so users should rarely
+/// need to use this.
 template<class From, class To>
 struct conversion_helper
 {
@@ -54,7 +58,7 @@
 /// of this macro must appear at global scope.
 /// If the destination unit is a base unit or a unit that contains
 /// only one base unit which is raised to the first power (e.g. feet->meters)
-/// the reverse (meters->feet in this example) need not be defined.
+/// the reverse (meters->feet in this example) need not be defined explicitly.
 #define BOOST_UNITS_DEFINE_CONVERSION_FACTOR(Source, Destination, type_, value_)    \
     namespace boost {                                                       \
     namespace units {                                                       \
@@ -115,7 +119,7 @@
     struct unscaled_get_default_conversion<unscale<Source>::type>   \
     {                                                               \
         static const bool is_defined = true;                        \
-        typedef Dest type;                                          \
+        typedef Dest::unit_type type;                               \
     };                                                              \
     }                                                               \
     }                                                               \
@@ -134,7 +138,7 @@
     struct unscaled_get_default_conversion<Source>                      \
     {                                                                   \
         static const bool is_defined = true;                            \
-        typedef Dest type;                                              \
+        typedef typename Dest::unit_type type;                          \
     };                                                                  \
     }                                                                   \
     }                                                                   \
Modified: branches/release/boost/units/detail/utility.hpp
==============================================================================
--- branches/release/boost/units/detail/utility.hpp	(original)
+++ branches/release/boost/units/detail/utility.hpp	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -12,15 +12,9 @@
 #define BOOST_UNITS_UTILITY_HPP
 
 #include <cstdlib>
-#include <complex>
-#include <iostream>
 #include <typeinfo>
 #include <string>
 
-#include <boost/assert.hpp>
-#include <boost/cstdint.hpp>
-#include <boost/limits.hpp>
-
 #if defined(__GLIBCXX__) || defined(__GLIBCPP__)
 #define BOOST_UNITS_USE_DEMANGLING
 #include <cxxabi.h>
@@ -53,13 +47,7 @@
         
         std::free(realname);
         
-        //boost::replace_all(out," ","");
         boost::replace_all(out,"boost::units::","");
-        //boost::replace_all(out,"static_rational","R");
-        //boost::replace_all(out,"dimensionless_type","dl");
-        //boost::replace_all(out,"_base_dimension","_bd");
-        //boost::replace_all(out,"_base_unit","_bu");
-        //boost::replace_all(out,"heterogeneous_system","hts");
         
         return out;
     }
Modified: branches/release/boost/units/io.hpp
==============================================================================
--- branches/release/boost/units/io.hpp	(original)
+++ branches/release/boost/units/io.hpp	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -533,6 +533,20 @@
     }
 };
 
+template<class Char, class Traits>
+inline void do_print(std::basic_ostream<Char, Traits>& os, const std::string& s) {
+    os << s.c_str();
+}
+
+inline void do_print(std::ostream& os, const std::string& s) {
+    os << s;
+}
+
+template<class Char, class Traits>
+inline void do_print(std::basic_ostream<Char, Traits>& os, const char* s) {
+    os << s;
+}
+
 } // namespace detail
 
 template<class Dimension,class System>
@@ -567,20 +581,20 @@
 {
     if (units::get_format(os) == typename_fmt) 
     {
-        os << typename_string(u);
-    } 
+        detail::do_print(os , typename_string(u));
+    }
     else if (units::get_format(os) == raw_fmt) 
     {
-        os << detail::to_string_impl(u, detail::format_raw_symbol_impl());
-    } 
+        detail::do_print(os, detail::to_string_impl(u, detail::format_raw_symbol_impl()));
+    }
     else if (units::get_format(os) == symbol_fmt) 
     {
-        os << symbol_string(u);
-    } 
+        detail::do_print(os, symbol_string(u));
+    }
     else if (units::get_format(os) == name_fmt) 
     {
-        os << name_string(u);
-    } 
+        detail::do_print(os, name_string(u));
+    }
     else 
     {
         assert(!"The format mode must be one of: typename_format, raw_format, name_format, symbol_format");
Modified: branches/release/libs/units/doc/units.qbk
==============================================================================
--- branches/release/libs/units/doc/units.qbk	(original)
+++ branches/release/libs/units/doc/units.qbk	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -89,7 +89,9 @@
 # Intel CC 9.1, 10.0, and 10.1 on Mac OSX 10.4
 # g++ 3.4.4, 4.2.3, and 4.3.0 on Windows XP
 # Microsoft Visual C++ 7.1, 8.0, and 9.0 on Windows XP
+# Comeau 4.3.10.1 beta2 on Windows XP
 # Metrowerks CodeWarrior 9.2 on Windows XP.  
+# Sun CC 5.9 on Solaris and Linux
 
 The following compilers/platforms are known *not* to work :
 
@@ -97,6 +99,7 @@
 # Microsoft Visual C++ 6.0 on Windows XP
 # Microsoft Visual C++ 7.0 on Windows XP
 # Metrowerks CodeWarrior 8.0 on Windows XP.
+# All versions of Borland.
 
 [endsect]
 
@@ -249,11 +252,11 @@
 
 [section:Units Units]
 
-We define a *unit* as a linear combination of base units.  Thus, the SI unit corresponding
-to the dimension of force is kg m s^-2, where kg, m, and s are base units.  We use the
-notion of a *unit system* such as SI to specify the mapping from a dimension to a
-particular unit so that instead of specifying the base units explicitly, we can just
-ask for the representation of a dimension in a particular system.
+We define a *unit* as a set of base units each of which can be raised to an arbitrary rational
+exponent.  Thus, the SI unit corresponding to the dimension of force is kg m s^-2, where kg, m,
+and s are base units.  We use the notion of a *unit system* such as SI to specify the mapping
+from a dimension to a particular unit so that instead of specifying the base units explicitly,
+we can just ask for the representation of a dimension in a particular system.
 
 Units are, like dimensions, purely compile-time variables with no associated value.
 Units obey the same algebra as dimensions do; the presence of the unit system serves to ensure that units having identical
Modified: branches/release/libs/units/example/dimension.cpp
==============================================================================
--- branches/release/libs/units/example/dimension.cpp	(original)
+++ branches/release/libs/units/example/dimension.cpp	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -32,14 +32,11 @@
 @endverbatim
 **/
 
-// undefine this if you don't want to demangle symbols
-// need to link with libboost_regex to get demangling functionality
-#define MCS_USE_DEMANGLING
-
 #include <boost/type_traits/is_same.hpp>
-
 #include <boost/mpl/assert.hpp>
 
+#include <iostream>
+
 #include <boost/units/detail/utility.hpp>
 
 #include "test_system.hpp"
Modified: branches/release/libs/units/example/kitchen_sink.cpp
==============================================================================
--- branches/release/libs/units/example/kitchen_sink.cpp	(original)
+++ branches/release/libs/units/example/kitchen_sink.cpp	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -218,12 +218,8 @@
 {
     using namespace boost::units::si;
     
-    #if BOOST_UNITS_HAS_TYPEOF 
     using namespace constants::codata;
     return (P*V/(R*T));
-    #else
-    return P*V/(8.314472*(joules/(kelvin*mole))*T);
-    #endif // BOOST_UNITS_HAS_TYPEOF
 }
 //]
 
Modified: branches/release/libs/units/test/Jamfile.v2
==============================================================================
--- branches/release/libs/units/test/Jamfile.v2	(original)
+++ branches/release/libs/units/test/Jamfile.v2	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -1,6 +1,6 @@
 # Jamfile.v2
 #
-# Copyright (c) 2007-2008
+# Copyright (c) 2007-2009
 # Steven Watanabe
 #
 # Distributed under the Boost Software License, Version 1.0. (See
@@ -39,6 +39,7 @@
 run test_scaled_conversion.cpp ;
 run test_lambda.cpp ;
 run test_scaled_unit.cpp test_framework ;
+run test_output.cpp test_framework ;
 
 compile-fail fail_implicit_conversion.cpp ;
 compile-fail fail_quantity_construct.cpp ;
Modified: branches/release/libs/units/test/test_conversion.cpp
==============================================================================
--- branches/release/libs/units/test/test_conversion.cpp	(original)
+++ branches/release/libs/units/test/test_conversion.cpp	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -85,6 +85,7 @@
 }
 
 BOOST_AUTO_TEST_CASE(test_dimensionless_conversions) {
+    typedef bu::divide_typeof_helper<bu::cgs::force, bu::si::force>::type mixed_dimensionless;
 
     bu::quantity<bu::si::dimensionless> dimensionless_test1(1.0*bu::cgs::dyne/bu::si::newton);
     BOOST_CHECK(dimensionless_test1 == 1e-5);
@@ -96,6 +97,10 @@
     bu::quantity<bu::divide_typeof_helper<bu::cgs::force, bu::si::force>::type> dimensionless_test3(dimensionless_test2);
     BOOST_UNITS_CHECK_CLOSE(dimensionless_test3.value(), 1.0);
 
+    BOOST_UNITS_CHECK_CLOSE(boost::units::conversion_factor(mixed_dimensionless(), heterogeneous_dimensionless()), 1e-5);
+    BOOST_UNITS_CHECK_CLOSE(boost::units::conversion_factor(heterogeneous_dimensionless(), mixed_dimensionless()), 1e5);
+
+
     //m/cm -> g/kg
     bu::quantity<bu::divide_typeof_helper<bu::si::length, bu::cgs::length>::type> dimensionless_test4(2.0 * bu::si::meters / bu::cgs::centimeters);
     bu::quantity<bu::divide_typeof_helper<bu::cgs::mass, bu::si::mass>::type> dimensionless_test5(dimensionless_test4);
Copied: branches/release/libs/units/test/test_output.cpp (from r53293, /trunk/libs/units/test/test_output.cpp)
==============================================================================
--- /trunk/libs/units/test/test_output.cpp	(original)
+++ branches/release/libs/units/test/test_output.cpp	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -25,6 +25,7 @@
 #include <boost/units/make_scaled_unit.hpp>
 #include <boost/units/base_unit.hpp>
 #include <boost/units/make_system.hpp>
+#include <boost/units/absolute.hpp>
 #include <boost/units/physical_dimensions/length.hpp>
 #include <boost/units/physical_dimensions/time.hpp>
 #include <boost/units/physical_dimensions/velocity.hpp>
@@ -122,6 +123,7 @@
     BOOST_UNITS_TEST_OUTPUT(custom2(), "c2");
     BOOST_UNITS_TEST_OUTPUT(scaled_custom1(), "kc1");
     BOOST_UNITS_TEST_OUTPUT(scaled_custom2(), "kc2");
+    BOOST_UNITS_TEST_OUTPUT(boost::units::absolute<meter_base_unit::unit_type>(), "absolute m");
 #undef FORMATTERS
 }
 
@@ -142,6 +144,7 @@
     BOOST_UNITS_TEST_OUTPUT(custom2(), "m s^-2");
     BOOST_UNITS_TEST_OUTPUT(scaled_custom1(), "k(m^3)");
     BOOST_UNITS_TEST_OUTPUT(scaled_custom2(), "k(m s^-2)");
+    BOOST_UNITS_TEST_OUTPUT(boost::units::absolute<meter_base_unit::unit_type>(), "absolute m");
 #undef FORMATTERS
 }
 
@@ -161,6 +164,7 @@
     BOOST_UNITS_TEST_OUTPUT(custom2(), "custom2");
     BOOST_UNITS_TEST_OUTPUT(scaled_custom1(), "kilocustom1");
     BOOST_UNITS_TEST_OUTPUT(scaled_custom2(), "kilocustom2");
+    BOOST_UNITS_TEST_OUTPUT(boost::units::absolute<meter_base_unit::unit_type>(), "absolute meter");
 #undef FORMATTERS
 }
 
@@ -181,6 +185,7 @@
     BOOST_UNITS_TEST_OUTPUT(1.5*custom2(), "1.5 c2");
     BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom1(), "1.5 kc1");
     BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom2(), "1.5 kc2");
+    BOOST_UNITS_TEST_OUTPUT(1.5*boost::units::absolute<meter_base_unit::unit_type>(), "1.5 absolute m");
 #undef FORMATTERS
 }
 
@@ -201,6 +206,7 @@
     BOOST_UNITS_TEST_OUTPUT(1.5*custom2(), "1.5 m s^-2");
     BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom1(), "1.5 k(m^3)");
     BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom2(), "1.5 k(m s^-2)");
+    BOOST_UNITS_TEST_OUTPUT(1.5*boost::units::absolute<meter_base_unit::unit_type>(), "1.5 absolute m");
 #undef FORMATTERS
 }
 
@@ -220,6 +226,7 @@
     BOOST_UNITS_TEST_OUTPUT(1.5*custom2(), "1.5 custom2");
     BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom1(), "1.5 kilocustom1");
     BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom2(), "1.5 kilocustom2");
+    BOOST_UNITS_TEST_OUTPUT(1.5*boost::units::absolute<meter_base_unit::unit_type>(), "1.5 absolute meter");
 #undef FORMATTERS
 }
 
Modified: branches/release/libs/units/test/test_unscale.cpp
==============================================================================
--- branches/release/libs/units/test/test_unscale.cpp	(original)
+++ branches/release/libs/units/test/test_unscale.cpp	2009-06-14 15:32:26 EDT (Sun, 14 Jun 2009)
@@ -28,6 +28,12 @@
 #include <boost/mpl/assert.hpp>
 #include <boost/type_traits/is_same.hpp>
 
+BOOST_MPL_ASSERT((boost::is_same<boost::units::unscale<boost::units::temperature::fahrenheit_base_unit::unit_type::system_type>::type,
+                  boost::units::temperature::fahrenheit_base_unit::unit_type::system_type>));
+
+BOOST_MPL_ASSERT((boost::is_same<boost::units::unscale<boost::units::temperature::fahrenheit_base_unit::unit_type>::type,
+                 boost::units::temperature::fahrenheit_base_unit::unit_type>));
+
 BOOST_MPL_ASSERT((boost::is_same<boost::units::unscale<boost::units::reduce_unit<boost::units::temperature::fahrenheit_base_unit::unit_type>::type>::type,
                  boost::units::temperature::fahrenheit_base_unit::unit_type>));