$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r82604 - trunk/boost/multiprecision
From: john_at_[hidden]
Date: 2013-01-25 07:49:55
Author: johnmaddock
Date: 2013-01-25 07:49:55 EST (Fri, 25 Jan 2013)
New Revision: 82604
URL: http://svn.boost.org/trac/boost/changeset/82604
Log:
Fix gcc build failures and warnings
Text files modified: 
   trunk/boost/multiprecision/debug_adaptor.hpp  |     3 +                                       
   trunk/boost/multiprecision/logged_adaptor.hpp |     9 ++--                                    
   trunk/boost/multiprecision/mpfr.hpp           |    78 ++++++++++++++++++++++++++++++++------- 
   3 files changed, 71 insertions(+), 19 deletions(-)
Modified: trunk/boost/multiprecision/debug_adaptor.hpp
==============================================================================
--- trunk/boost/multiprecision/debug_adaptor.hpp	(original)
+++ trunk/boost/multiprecision/debug_adaptor.hpp	2013-01-25 07:49:55 EST (Fri, 25 Jan 2013)
@@ -7,6 +7,7 @@
 #define BOOST_MATH_DEBUG_ADAPTER_HPP
 
 #include <boost/multiprecision/traits/extract_exponent_type.hpp>
+#include <boost/multiprecision/detail/integer_ops.hpp>
 
 namespace boost{
 namespace multiprecision{
@@ -412,7 +413,7 @@
 namespace std{
 
 template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-class numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<Backend>, ExpressionTemplates> > 
+class numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::debug_adaptor<Backend>, ExpressionTemplates> >
    : public std::numeric_limits<boost::multiprecision::number<Backend, ExpressionTemplates> >
 {
    typedef std::numeric_limits<boost::multiprecision::number<Backend, ExpressionTemplates> > base_type;
Modified: trunk/boost/multiprecision/logged_adaptor.hpp
==============================================================================
--- trunk/boost/multiprecision/logged_adaptor.hpp	(original)
+++ trunk/boost/multiprecision/logged_adaptor.hpp	2013-01-25 07:49:55 EST (Fri, 25 Jan 2013)
@@ -7,6 +7,7 @@
 #define BOOST_MATH_LOGGED_ADAPTER_HPP
 
 #include <boost/multiprecision/traits/extract_exponent_type.hpp>
+#include <boost/multiprecision/detail/integer_ops.hpp>
 
 namespace boost{
 namespace multiprecision{
@@ -398,7 +399,7 @@
    using default_ops::eval_bit_set;
    log_prefix_event(arg.value(), a, "bit-set");
    eval_bit_set(arg.value(), a);
-   log_postfix_event(arg.value(), r, "bit-set");
+   log_postfix_event(arg.value(), arg, "bit-set");
 }
 template <class Backend>
 inline void eval_bit_unset(const logged_adaptor<Backend>& arg, unsigned a)
@@ -406,7 +407,7 @@
    using default_ops::eval_bit_unset;
    log_prefix_event(arg.value(), a, "bit-unset");
    eval_bit_unset(arg.value(), a);
-   log_postfix_event(arg.value(), r, "bit-unset");
+   log_postfix_event(arg.value(), arg, "bit-unset");
 }
 template <class Backend>
 inline void eval_bit_flip(const logged_adaptor<Backend>& arg, unsigned a)
@@ -414,7 +415,7 @@
    using default_ops::eval_bit_flip;
    log_prefix_event(arg.value(), a, "bit-flip");
    eval_bit_flip(arg.value(), a);
-   log_postfix_event(arg.value(), r, "bit-flip");
+   log_postfix_event(arg.value(), arg, "bit-flip");
 }
 
 NON_MEMBER_OP3(gcd, "gcd");
@@ -466,7 +467,7 @@
 namespace std{
 
 template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-class numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<Backend>, ExpressionTemplates> > 
+class numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::logged_adaptor<Backend>, ExpressionTemplates> >
    : public std::numeric_limits<boost::multiprecision::number<Backend, ExpressionTemplates> >
 {
    typedef std::numeric_limits<boost::multiprecision::number<Backend, ExpressionTemplates> > base_type;
Modified: trunk/boost/multiprecision/mpfr.hpp
==============================================================================
--- trunk/boost/multiprecision/mpfr.hpp	(original)
+++ trunk/boost/multiprecision/mpfr.hpp	2013-01-25 07:49:55 EST (Fri, 25 Jan 2013)
@@ -1246,14 +1246,14 @@
 #endif
 
 template <unsigned Digits10, mpfr_allocation_type AllocateType, class Integer>
-inline typename enable_if<mpl::and_<is_signed<Integer>, mpl::bool_<BOOST_MP_ENABLE_IF_WORKAROUND (sizeof(Integer) <= sizeof(long))> > >::type 
+inline typename enable_if<mpl::and_<is_signed<Integer>, mpl::bool_<BOOST_MP_ENABLE_IF_WORKAROUND (sizeof(Integer) <= sizeof(long))> > >::type
    eval_pow(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& b, const Integer& e)
 {
    mpfr_pow_si(result.data(), b.data(), e, GMP_RNDN);
 }
 
 template <unsigned Digits10, mpfr_allocation_type AllocateType, class Integer>
-inline typename enable_if<mpl::and_<is_unsigned<Integer>, mpl::bool_<BOOST_MP_ENABLE_IF_WORKAROUND (sizeof(Integer) <= sizeof(long))> > >::type 
+inline typename enable_if<mpl::and_<is_unsigned<Integer>, mpl::bool_<BOOST_MP_ENABLE_IF_WORKAROUND (sizeof(Integer) <= sizeof(long))> > >::type
    eval_pow(mpfr_float_backend<Digits10, AllocateType>& result, const mpfr_float_backend<Digits10, AllocateType>& b, const Integer& e)
 {
    mpfr_pow_ui(result.data(), b.data(), e, GMP_RNDN);
@@ -1392,15 +1392,47 @@
 template <class T> struct constant_euler;
 template <class T> struct constant_catalan;
 
+namespace detail{
+
+   template <class T, int N>
+   struct mpfr_constant_initializer
+   {
+      static void force_instantiate()
+      {
+         init.force_instantiate();
+      }
+   private:
+      struct initializer
+      {
+         initializer()
+         {
+            T::get(mpl::int_<N>());
+         }
+         void force_instantiate()const{}
+      };
+      static const initializer init;
+   };
+
+   template <class T, int N>
+   typename mpfr_constant_initializer<T, N>::initializer const mpfr_constant_initializer<T, N>::init;
+
+}
+
 template<unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>
 struct constant_pi<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >
 {
    typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result_type;
    template<int N>
-   static inline result_type get(const mpl::int_<N>&)
+   static inline const result_type& get(const mpl::int_<N>&)
    {
-      result_type result;
-      mpfr_const_pi(result.backend().data(), GMP_RNDN);
+      detail::mpfr_constant_initializer<constant_pi<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >, N>::force_instantiate();
+      static result_type result;
+      static bool has_init = false;
+      if(!has_init)
+      {
+         mpfr_const_pi(result.backend().data(), GMP_RNDN);
+         has_init = true;
+      }
       return result;
    }
 };
@@ -1409,10 +1441,16 @@
 {
    typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result_type;
    template<int N>
-   static inline result_type get(const mpl::int_<N>&)
+   static inline const result_type& get(const mpl::int_<N>&)
    {
-      result_type result;
-      mpfr_const_log2(result.backend().data(), GMP_RNDN);
+      detail::mpfr_constant_initializer<constant_ln_two<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >, N>::force_instantiate();
+      static result_type result;
+      static bool init = false;
+      if(!init)
+      {
+         mpfr_const_log2(result.backend().data(), GMP_RNDN);
+         init = true;
+      }
       return result;
    }
 };
@@ -1421,10 +1459,16 @@
 {
    typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result_type;
    template<int N>
-   static inline result_type get(const mpl::int_<N>&)
+   static inline const result_type& get(const mpl::int_<N>&)
    {
-      result_type result;
-      mpfr_const_euler(result.backend().data(), GMP_RNDN);
+      detail::mpfr_constant_initializer<constant_euler<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >, N>::force_instantiate();
+      static result_type result;
+      static bool init = false;
+      if(!init)
+      {
+         mpfr_const_euler(result.backend().data(), GMP_RNDN);
+         init = true;
+      }
       return result;
    }
 };
@@ -1433,10 +1477,16 @@
 {
    typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> result_type;
    template<int N>
-   static inline result_type get(const mpl::int_<N>&)
+   static inline const result_type& get(const mpl::int_<N>&)
    {
-      result_type result;
-      mpfr_const_catalan(result.backend().data(), GMP_RNDN);
+      detail::mpfr_constant_initializer<constant_catalan<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates> >, N>::force_instantiate();
+      static result_type result;
+      static bool init = false;
+      if(!init)
+      {
+         mpfr_const_catalan(result.backend().data(), GMP_RNDN);
+         init = true;
+      }
       return result;
    }
 };