$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r63286 - in trunk: boost/random boost/random/detail libs/random/doc
From: steven_at_[hidden]
Date: 2010-06-24 11:58:43
Author: steven_watanabe
Date: 2010-06-24 11:58:41 EDT (Thu, 24 Jun 2010)
New Revision: 63286
URL: http://svn.boost.org/trac/boost/changeset/63286
Log:
Attempt to fix msvc-7.1 errors in subtract_with_carry.
Added:
   trunk/boost/random/detail/operators.hpp   (contents, props changed)
Text files modified: 
   trunk/boost/random/subtract_with_carry.hpp |    50 +++++++++++---------------------------- 
   trunk/libs/random/doc/Jamfile.v2           |     4 +++                                     
   2 files changed, 18 insertions(+), 36 deletions(-)
Added: trunk/boost/random/detail/operators.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/random/detail/operators.hpp	2010-06-24 11:58:41 EDT (Thu, 24 Jun 2010)
@@ -0,0 +1,69 @@
+/* boost random/detail/operators.hpp header file
+ *
+ * Copyright Steven Watanabe 2010
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id$
+ */
+
+#ifndef BOOST_RANDOM_DETAIL_OPERATORS_HPP
+#define BOOST_RANDOM_DETAIL_OPERATORS_HPP
+
+#include <boost/random/detail/config.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
+
+#define BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, T, t)                  \
+    template<class CharT, class Traits>                                 \
+    friend std::basic_ostream<CharT,Traits>&                            \
+    operator<<(std::basic_ostream<CharT,Traits>& os, const T& t) {      \
+        t.print(os, t);                                                 \
+        return os;                                                      \
+    }                                                                   \
+    template<class CharT, class Traits>                                 \
+    static std::basic_ostream<CharT,Traits>&                            \
+    print(std::basic_ostream<CharT,Traits>& os, const T& t)
+
+#define BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, T, t)                  \
+    template<class CharT, class Traits>                                 \
+    friend std::basic_istream<CharT,Traits>&                            \
+    operator>>(std::basic_istream<CharT,Traits>& is, T& t) {            \
+        t.read(is, t);                                                  \
+        return is;                                                      \
+    }                                                                   \
+    template<class CharT, class Traits>                                 \
+    static std::basic_istream<CharT,Traits>&                            \
+    read(std::basic_istream<CharT,Traits>& is, T& t)
+
+#endif
+
+#ifndef BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR
+#define BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, T, t)                  \
+    template<class CharT, class Traits>                                 \
+    friend std::basic_ostream<CharT,Traits>&                            \
+    operator<<(std::basic_ostream<CharT,Traits>& os, const T& t)
+#endif
+
+#ifndef BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR
+#define BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, T, t)                  \
+    template<class CharT, class Traits>                                 \
+    friend std::basic_istream<CharT,Traits>&                            \
+    operator>>(std::basic_istream<CharT,Traits>& is, T& t)
+#endif
+
+#ifndef BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR
+#define BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(T, lhs, rhs)              \
+    friend bool operator==(const T& lhs, const T& rhs)
+#endif
+
+#ifndef BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR
+#define BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(T)                      \
+    friend bool operator!=(const T& lhs, const T& rhs)                  \
+    { return !(lhs == rhs); }
+#endif
+
+#endif
Modified: trunk/boost/random/subtract_with_carry.hpp
==============================================================================
--- trunk/boost/random/subtract_with_carry.hpp	(original)
+++ trunk/boost/random/subtract_with_carry.hpp	2010-06-24 11:58:41 EDT (Thu, 24 Jun 2010)
@@ -27,6 +27,7 @@
 #include <boost/detail/workaround.hpp>
 #include <boost/random/detail/config.hpp>
 #include <boost/random/detail/seed.hpp>
+#include <boost/random/detail/operators.hpp>
 #include <boost/random/linear_congruential.hpp>
 
 
@@ -193,12 +194,8 @@
         }
     }
  
-#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
     /** Writes a @c subtract_with_carry_engine to a @c std::ostream. */
-    template<class CharT, class Traits>
-    friend std::basic_ostream<CharT,Traits>&
-    operator<<(std::basic_ostream<CharT,Traits>& os,
-               const subtract_with_carry_engine& f)
+    BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, subtract_with_carry_engine, f)
     {
         for(unsigned int j = 0; j < f.long_lag; ++j)
             os << f.compute(j) << " ";
@@ -207,10 +204,7 @@
     }
 
     /** Reads a @c subtract_with_carry_engine from a @c std::istream. */
-    template<class CharT, class Traits>
-    friend std::basic_istream<CharT,Traits>&
-    operator>>(std::basic_istream<CharT,Traits>& is,
-               subtract_with_carry_engine& f)
+    BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, subtract_with_carry_engine, f)
     {
         for(unsigned int j = 0; j < f.long_lag; ++j)
             is >> f.x[j] >> std::ws;
@@ -218,14 +212,12 @@
         f.k = 0;
         return is;
     }
-#endif
 
     /**
      * Returns true if the two generators will produce identical
      * sequences of values.
      */
-    friend bool operator==(const subtract_with_carry_engine& x,
-                           const subtract_with_carry_engine& y)
+    BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(subtract_with_carry_engine, x, y)
     {
         for(unsigned int j = 0; j < r; ++j)
             if(x.compute(j) != y.compute(j))
@@ -237,9 +229,7 @@
      * Returns true if the two generators will produce different
      * sequences of values.
      */
-    friend bool operator!=(const subtract_with_carry_engine& x,
-                           const subtract_with_carry_engine& y)
-    { return !(x == y); }
+    BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(subtract_with_carry_engine)
 
 private:
     /// \cond
@@ -440,11 +430,8 @@
         }
     }
 
-#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
-    template<class CharT, class Traits>
-    friend std::basic_ostream<CharT,Traits>&
-    operator<<(std::basic_ostream<CharT,Traits>& os,
-               const subtract_with_carry_01_engine& f)
+    /** Writes a subtract_with_carry_01_engine to a @c std::ostream. */
+    BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, subtract_with_carry_01_engine, f)
     {
         std::ios_base::fmtflags oldflags =
             os.flags(os.dec | os.fixed | os.left); 
@@ -454,16 +441,11 @@
         os.flags(oldflags);
         return os;
     }
-
-    template<class CharT, class Traits>
-    friend std::basic_istream<CharT,Traits>&
-    operator>>(std::basic_istream<CharT,Traits>& is,
-               subtract_with_carry_01_engine& f)
-    {
-        // MSVC (up to 7.1) and Borland (up to 5.64) don't handle the template
-        // type parameter "RealType" available from the class template scope,
-        // so use the member typedef
-        typename subtract_with_carry_01_engine::result_type value;
+    
+    /** Reads a subtract_with_carry_01_engine from a @c std::istream. */
+    BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, subtract_with_carry_01_engine, f)
+    {
+        RealType value;
         for(unsigned int j = 0; j < long_lag; ++j) {
             is >> value >> std::ws;
             f.x[j] = value / f._modulus;
@@ -473,11 +455,9 @@
         f.k = 0;
         return is;
     }
-#endif
 
     /** Returns true if the two generators will produce identical sequences. */
-    friend bool operator==(const subtract_with_carry_01_engine& x,
-                           const subtract_with_carry_01_engine& y)
+    BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(subtract_with_carry_01_engine, x, y)
     {
         for(unsigned int j = 0; j < r; ++j)
             if(x.compute(j) != y.compute(j))
@@ -486,9 +466,7 @@
     }
 
     /** Returns true if the two generators will produce different sequences. */
-    friend bool operator!=(const subtract_with_carry_01_engine& x,
-                           const subtract_with_carry_01_engine& y)
-    { return !(x == y); }
+    BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(subtract_with_carry_01_engine)
 
 private:
     /// \cond
Modified: trunk/libs/random/doc/Jamfile.v2
==============================================================================
--- trunk/libs/random/doc/Jamfile.v2	(original)
+++ trunk/libs/random/doc/Jamfile.v2	2010-06-24 11:58:41 EDT (Thu, 24 Jun 2010)
@@ -104,6 +104,10 @@
         \"BOOST_PREVENT_MACRO_SUBSTITUTION=\" \\
         \"BOOST_STATIC_ASSERT(x)=\" \\
         \"BOOST_STATIC_CONSTANT(type,value)=static const type value\" \\
+        \"BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os,T,t)=template<class CharT, class Traits> friend std::basic_ostream<CharT,Traits>& operator<<(std::basic_ostream<CharT,Traits>& os, const T& t)\" \\
+        \"BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is,T,t)=template<class CharT, class Traits> friend std::basic_istream<CharT,Traits>& operator>>(std::basic_istream<CharT,Traits>& is, const T& t)\" \\
+        \"BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(T,lhs,rhs)=friend bool operator==(const T& rhs, const T& rhs)\" \\
+        \"BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(T)=friend bool operator!=(const T& rhs, const T& rhs) { return !(lhs == rhs); }\" \\
         \"BOOST_RANDOM_DETAIL_ARITHMETIC_CONSTRUCTOR(Self,T,t)=explicit Self(T t)\" \\
         \"BOOST_RANDOM_DETAIL_GENERATOR_CONSTRUCTOR(Self,T,t)=template<class T> explicit Self(T& t)\" \\
         \"BOOST_RANDOM_DETAIL_SEED_SEQ_CONSTRUCTOR(Self,T,t)=template<class T> explicit Self(T& t)\" \\