$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r79724 - in sandbox/big_number: boost/multiprecision libs/multiprecision/performance libs/multiprecision/test libs/multiprecision/test/concepts
From: john_at_[hidden]
Date: 2012-07-24 14:03:55
Author: johnmaddock
Date: 2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
New Revision: 79724
URL: http://svn.boost.org/trac/boost/changeset/79724
Log:
Refactor concept checks for faster compilers.
Add constexpr construction test.
Added:
   sandbox/big_number/libs/multiprecision/test/concepts/
   sandbox/big_number/libs/multiprecision/test/concepts/mp_number_concept_check.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_basic.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_bessel.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_elliptic.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_gamma.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_poly.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/test_constexpr.cpp   (contents, props changed)
Removed:
   sandbox/big_number/libs/multiprecision/test/mp_number_concept_check.cpp
Text files modified: 
   sandbox/big_number/boost/multiprecision/cpp_int.hpp                     |    58 ++++++++++--------                      
   sandbox/big_number/libs/multiprecision/performance/performance_test.cpp |     5 +                                       
   sandbox/big_number/libs/multiprecision/test/Jamfile.v2                  |   121 +++++++++++++++++---------------------- 
   3 files changed, 91 insertions(+), 93 deletions(-)
Modified: sandbox/big_number/boost/multiprecision/cpp_int.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/cpp_int.hpp	(original)
+++ sandbox/big_number/boost/multiprecision/cpp_int.hpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -236,11 +236,15 @@
    BOOST_STATIC_ASSERT_MSG(internal_limb_count >= 2, "A fixed precision integer type must have at least 2 limbs");
 
 private:
-   union{
+   union data_type{
       limb_type          m_data[internal_limb_count];
       limb_type          m_first_limb;
       double_limb_type   m_double_first_limb;
-   };
+
+      BOOST_CONSTEXPR data_type(){}
+      BOOST_CONSTEXPR data_type(limb_type i) : m_first_limb(i) {}
+      BOOST_CONSTEXPR data_type(double_limb_type i) : m_double_first_limb(i) {}
+   } m_wrapper;
    boost::uint16_t    m_limbs;
    bool               m_sign;
 
@@ -249,21 +253,21 @@
    // Direct construction:
    //
    BOOST_CONSTEXPR cpp_int_base(limb_type i)BOOST_NOEXCEPT 
-      : m_first_limb(i), m_limbs(1), m_sign(false) {}
+      : m_wrapper(i), m_limbs(1), m_sign(false) {}
    BOOST_CONSTEXPR cpp_int_base(signed_limb_type i)BOOST_NOEXCEPT 
-      : m_first_limb(std::abs(i)), m_limbs(1), m_sign(i < 0) {}
+      : m_wrapper(limb_type(i < 0 ? -i : i)), m_limbs(1), m_sign(i < 0) {}
 #if defined(BOOST_LITTLE_ENDIAN)
    BOOST_CONSTEXPR cpp_int_base(double_limb_type i)BOOST_NOEXCEPT 
-      : m_double_first_limb(i), m_limbs(i > max_limb_value ? 2 : 1), m_sign(false) {}
+      : m_wrapper(i), m_limbs(i > max_limb_value ? 2 : 1), m_sign(false) {}
    BOOST_CONSTEXPR cpp_int_base(signed_double_limb_type i)BOOST_NOEXCEPT 
-      : m_double_first_limb(i < 0 ? -i : i), m_limbs(i < 0 ? (-i > max_limb_value ? 2 : 1) : (i > max_limb_value ? 2 : 1)), m_sign(i < 0) {}
+      : m_wrapper(double_limb_type(i < 0 ? -i : i)), m_limbs(i < 0 ? (-i > max_limb_value ? 2 : 1) : (i > max_limb_value ? 2 : 1)), m_sign(i < 0) {}
 #endif
    //
    // Helper functions for getting at our internal data, and manipulating storage:
    //
    unsigned size()const BOOST_NOEXCEPT { return m_limbs; }
-   limb_pointer limbs() BOOST_NOEXCEPT { return m_data; }
-   const_limb_pointer limbs()const BOOST_NOEXCEPT { return m_data; }
+   limb_pointer limbs() BOOST_NOEXCEPT { return m_wrapper.m_data; }
+   const_limb_pointer limbs()const BOOST_NOEXCEPT { return m_wrapper.m_data; }
    bool sign()const BOOST_NOEXCEPT { return m_sign; }
    void sign(bool b) BOOST_NOEXCEPT
    { 
@@ -287,7 +291,7 @@
       if((m_limbs == 1) && (!*p)) m_sign = false; // zero is always unsigned
    }
 
-   BOOST_CONSTEXPR cpp_int_base() : m_first_limb(0), m_limbs(1), m_sign(false) {}
+   BOOST_CONSTEXPR cpp_int_base() : m_wrapper(limb_type(0u)), m_limbs(1), m_sign(false) {}
    cpp_int_base(const cpp_int_base& o) BOOST_NOEXCEPT : m_limbs(o.m_limbs), m_sign(o.m_sign)
    {
       std::copy(o.limbs(), o.limbs() + o.size(), limbs());
@@ -298,7 +302,7 @@
       if(this != &o)
       {
          resize(o.size());
-         std::memcpy(limbs(), o.limbs(), size() * sizeof(limb_type));
+         std::copy(o.limbs(), o.limbs() + o.size(), limbs());
          m_sign = o.m_sign;
       }
    }
@@ -319,7 +323,7 @@
    void do_swap(cpp_int_base& o) BOOST_NOEXCEPT
    {
       for(unsigned i = 0; i < (std::max)(size(), o.size()); ++i)
-         std::swap(m_data[i], o.m_data[i]);
+         std::swap(m_wrapper.m_data[i], o.m_wrapper.m_data[i]);
       std::swap(m_sign, o.m_sign);
       std::swap(m_limbs, o.m_limbs);
    }
@@ -346,11 +350,15 @@
    BOOST_STATIC_ASSERT_MSG(internal_limb_count >= 2, "A fixed precision integer type must have at least 2 limbs");
 
 private:
-   union{
+   union data_type{
       limb_type          m_data[internal_limb_count];
       limb_type          m_first_limb;
       double_limb_type   m_double_first_limb;
-   };
+
+      BOOST_CONSTEXPR data_type() {}
+      BOOST_CONSTEXPR data_type(limb_type i) : m_first_limb(i) {}
+      BOOST_CONSTEXPR data_type(double_limb_type i) : m_double_first_limb(i) {}
+   } m_wrapper;
    limb_type          m_limbs;
 
 public:
@@ -358,21 +366,21 @@
    // Direct construction:
    //
    BOOST_CONSTEXPR cpp_int_base(limb_type i)BOOST_NOEXCEPT 
-      : m_first_limb(i), m_limbs(1) {}
+      : m_wrapper(i), m_limbs(1) {}
    cpp_int_base(signed_limb_type i)BOOST_NOEXCEPT 
-      : m_first_limb(i < 0 ? -i : i), m_limbs(1) { if(i < 0) negate(); }
+      : m_wrapper(limb_type(i < 0 ? -i : i)), m_limbs(1) { if(i < 0) negate(); }
 #ifdef BOOST_LITTLE_ENDIAN
    BOOST_CONSTEXPR cpp_int_base(double_limb_type i)BOOST_NOEXCEPT 
-      : m_double_first_limb(i), m_limbs(i > max_limb_value ? 2 : 1) {}
+      : m_wrapper(i), m_limbs(i > max_limb_value ? 2 : 1) {}
    cpp_int_base(signed_double_limb_type i)BOOST_NOEXCEPT 
-      : m_double_first_limb(i < 0 ? -i : i), m_limbs(i < 0 ? (-i > max_limb_value ? 2 : 1) : (i > max_limb_value ? 2 : 1)) { if(i < 0) negate(); }
+      : m_wrapper(double_limb_type(i < 0 ? -i : i)), m_limbs(i < 0 ? (-i > max_limb_value ? 2 : 1) : (i > max_limb_value ? 2 : 1)) { if(i < 0) negate(); }
 #endif
    //
    // Helper functions for getting at our internal data, and manipulating storage:
    //
    unsigned size()const BOOST_NOEXCEPT { return m_limbs; }
-   limb_pointer limbs() BOOST_NOEXCEPT { return m_data; }
-   const_limb_pointer limbs()const BOOST_NOEXCEPT { return m_data; }
+   limb_pointer limbs() BOOST_NOEXCEPT { return m_wrapper.m_data; }
+   const_limb_pointer limbs()const BOOST_NOEXCEPT { return m_wrapper.m_data; }
    BOOST_CONSTEXPR bool sign()const BOOST_NOEXCEPT { return false; }
    void sign(bool b) BOOST_NOEXCEPT {  if(b) negate(); }
    void resize(unsigned new_size) BOOST_NOEXCEPT
@@ -386,7 +394,7 @@
       while((m_limbs-1) && !p[m_limbs - 1])--m_limbs;
    }
 
-   BOOST_CONSTEXPR cpp_int_base() BOOST_NOEXCEPT : m_first_limb(0), m_limbs(1) {}
+   BOOST_CONSTEXPR cpp_int_base() BOOST_NOEXCEPT : m_wrapper(limb_type(0u)), m_limbs(1) {}
    cpp_int_base(const cpp_int_base& o) BOOST_NOEXCEPT : m_limbs(o.m_limbs)
    {
       std::copy(o.limbs(), o.limbs() + o.size(), limbs());
@@ -397,7 +405,7 @@
       if(this != &o)
       {
          resize(o.size());
-         std::memcpy(limbs(), o.limbs(), size() * sizeof(limb_type));
+         std::copy(o.limbs(), o.limbs() + o.size(), limbs());
       }
    }
    void negate() BOOST_NOEXCEPT
@@ -406,10 +414,10 @@
       // would result in a "negative" number:
       unsigned i;
       for(i = m_limbs; i < internal_limb_count; ++i)
-         m_data[i] = 0;
+         m_wrapper.m_data[i] = 0;
       m_limbs = internal_limb_count;
       for(i = 0; i < internal_limb_count; ++i)
-         m_data[i] = ~m_data[i];
+         m_wrapper.m_data[i] = ~m_wrapper.m_data[i];
       normalize();
       eval_increment(static_cast<cpp_int_backend<MinBits, false, void>& >(*this));
    }
@@ -420,7 +428,7 @@
    void do_swap(cpp_int_base& o) BOOST_NOEXCEPT
    {
       for(unsigned i = 0; i < (std::max)(size(), o.size()); ++i)
-         std::swap(m_data[i], o.m_data[i]);
+         std::swap(m_wrapper.m_data[i], o.m_wrapper.m_data[i]);
       std::swap(m_limbs, o.m_limbs);
    }
 };
@@ -442,7 +450,7 @@
 
 #ifdef BOOST_MSVC
 #pragma warning(push)
-#pragma warning(disable:4244) // loss of data in initialization
+#pragma warning(disable:4244 4293) // loss of data in initialization, shift count too large
 #endif
 
 template <unsigned MinBits>
Modified: sandbox/big_number/libs/multiprecision/performance/performance_test.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/performance/performance_test.cpp	(original)
+++ sandbox/big_number/libs/multiprecision/performance/performance_test.cpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -88,6 +88,8 @@
 
 template<>
 class number_category<boost::int64_t> : public mpl::int_<number_kind_integer>{};
+template<>
+class number_category<boost::uint64_t> : public mpl::int_<number_kind_integer>{};
 
 }}
 
@@ -638,7 +640,7 @@
 int main()
 {
 #ifdef TEST_INT64
-   test<boost::int64_t>("boost::int64_t", 64);
+   test<boost::uint64_t>("boost::uint64_t", 64);
 #endif
 #ifdef TEST_MPF
    test<boost::multiprecision::mpf_float_50>("gmp_float", 50);
@@ -652,6 +654,7 @@
    test<boost::multiprecision::mpz_int>("gmp_int", 1024);
 #endif
 #ifdef TEST_CPP_INT
+   test<boost::multiprecision::mp_number<boost::multiprecision::cpp_int_backend<64, false, void>, false > >("cpp_int(unsigned, fixed)", 64);
    test<boost::multiprecision::mp_number<boost::multiprecision::cpp_int_backend<64, true, void>, false > >("cpp_int(fixed)", 64);
    test<boost::multiprecision::mp_number<boost::multiprecision::cpp_int_backend<128, true, void>, false > >("cpp_int(fixed)", 128);
    test<boost::multiprecision::mp_number<boost::multiprecision::cpp_int_backend<256, true, void>, false > >("cpp_int(fixed)", 256);
Modified: sandbox/big_number/libs/multiprecision/test/Jamfile.v2
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/Jamfile.v2	(original)
+++ sandbox/big_number/libs/multiprecision/test/Jamfile.v2	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -610,6 +610,7 @@
         : test_move_cpp_int ;
 
 run test_test.cpp ;
+compile test_constexpr.cpp ;
 
 run test_float_io.cpp
         : # command line
@@ -772,73 +773,59 @@
 
 if ! $(disable-concepts)
 {
-   run mp_number_concept_check.cpp  mpfr
-           : # command line
-           : # input files
-           : # requirements
-	         <define>TEST_MPFR_50
-            [ check-target-builds ../config//has_mpfr : : <build>no ]
-           : mp_number_concept_check_mpfr_50 ;
-
-   run mp_number_concept_check.cpp  mpfr
-           : # command line
-           : # input files
-           : # requirements
-	         <define>TEST_MPFR_6
-            [ check-target-builds ../config//has_mpfr : : <build>no ]
-           : mp_number_concept_check_mpfr_6 ;
-
-   run mp_number_concept_check.cpp  mpfr
-           : # command line
-           : # input files
-           : # requirements
-	         <define>TEST_MPFR_15
-            [ check-target-builds ../config//has_mpfr : : <build>no ]
-           : mp_number_concept_check_mpfr_15 ;
-
-   run mp_number_concept_check.cpp  mpfr
-           : # command line
-           : # input files
-           : # requirements
-	         <define>TEST_MPFR_17
-            [ check-target-builds ../config//has_mpfr : : <build>no ]
-           : mp_number_concept_check_mpfr_17 ;
-
-   run mp_number_concept_check.cpp  mpfr
-           : # command line
-           : # input files
-           : # requirements
-	         <define>TEST_MPFR_30
-            [ check-target-builds ../config//has_mpfr : : <build>no ]
-           : mp_number_concept_check_mpfr_30 ;
-
-   run mp_number_concept_check.cpp  gmp
-           : # command line
-           : # input files
-           : # requirements
-	         <define>TEST_MPF_50
-            [ check-target-builds ../config//has_gmp : : <build>no ]
-           : mp_number_concept_check_mpf50 ;
-
-   run mp_number_concept_check.cpp
-           : # command line
-           : # input files
-           : # requirements
-	         <define>TEST_CPP_DEC_FLOAT
-           : mp_number_concept_check_cpp_dec_float ;
 
-   run mp_number_concept_check.cpp
-           : # command line
-           : # input files
-           : # requirements
-	         <define>TEST_CPP_DEC_FLOAT_NO_ET
-           : mp_number_concept_check_cpp_dec_float_no_et ;
-
-   run mp_number_concept_check.cpp
-           : # command line
-           : # input files
-           : # requirements
-	         <define>TEST_BACKEND
-           : mp_number_concept_check_backend_concept ;
+   for local source in [ glob concepts/*.cpp ]
+   {
 
+      compile $(source)  mpfr
+              : # requirements
+	            <define>TEST_MPFR_50
+               [ check-target-builds ../config//has_mpfr : : <build>no ]
+              : $(source:B)_mpfr_50 ;
+
+      compile $(source)  mpfr
+              : # requirements
+	            <define>TEST_MPFR_6
+               [ check-target-builds ../config//has_mpfr : : <build>no ]
+              : $(source:B)_mpfr_6 ;
+
+      compile $(source)  mpfr
+              : # requirements
+	            <define>TEST_MPFR_15
+               [ check-target-builds ../config//has_mpfr : : <build>no ]
+              : $(source:B)_mpfr_15 ;
+
+      compile $(source)  mpfr
+              : # requirements
+	            <define>TEST_MPFR_17
+               [ check-target-builds ../config//has_mpfr : : <build>no ]
+              : $(source:B)_mpfr_17 ;
+
+      compile $(source)  mpfr
+              : # requirements
+	            <define>TEST_MPFR_30
+               [ check-target-builds ../config//has_mpfr : : <build>no ]
+              : $(source:B)_mpfr_30 ;
+
+      compile $(source)  gmp
+              : # requirements
+	            <define>TEST_MPF_50
+               [ check-target-builds ../config//has_gmp : : <build>no ]
+              : $(source:B)_mpf50 ;
+
+      compile $(source)
+              : # requirements
+	            <define>TEST_CPP_DEC_FLOAT
+              : $(source:B)_cpp_dec_float ;
+
+      compile $(source)
+              : # requirements
+	            <define>TEST_CPP_DEC_FLOAT_NO_ET
+              : $(source:B)_cpp_dec_float_no_et ;
+
+      compile $(source)
+              : # requirements
+	            <define>TEST_BACKEND
+              : $(source:B)_backend_concept ;
+   }
 }
Added: sandbox/big_number/libs/multiprecision/test/concepts/mp_number_concept_check.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/concepts/mp_number_concept_check.cpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -0,0 +1,223 @@
+//  Copyright John Maddock 2011.
+//  Use, modification and distribution are subject to 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)
+
+//
+// This tests that cpp_dec_float_50 meets our
+// conceptual requirements.
+//
+#ifdef _MSC_VER
+#  define _SCL_SECURE_NO_WARNINGS
+#  pragma warning(disable:4800)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4127)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4503) // decorated name length exceeded, name was truncated
+#endif
+
+#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) \
+   && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50)\
+   && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#  define TEST_MPF_50
+#  define TEST_BACKEND
+#  define TEST_MPZ
+#  define TEST_MPFR_50
+#  define TEST_MPFR_6
+#  define TEST_MPFR_15
+#  define TEST_MPFR_17
+#  define TEST_MPFR_30
+#  define TEST_CPP_DEC_FLOAT
+#  define TEST_CPP_DEC_FLOAT_NO_ET
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF_50) || defined(TEST_MPZ)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
+#endif
+#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#endif
+#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+
+#include <boost/math/concepts/real_type_concept.hpp>
+
+template <class T>
+void test_extra(T)
+{
+   T t = 1;
+   t = abs(t);
+   t = abs(t*t);
+
+   t = fabs(t);
+   t = fabs(t*t);
+
+   t = sqrt(t);
+   t = sqrt(t*t);
+
+   t = floor(t);
+   t = floor(t*t);
+
+   t = ceil(t);
+   t = ceil(t*t);
+
+   t = trunc(t);
+   t = trunc(t*t);
+
+   t = round(t);
+   t = round(t*t);
+
+   t = exp(t);
+   t = exp(t*t);
+
+   t = log(t);
+   t = log(t*t);
+
+   t = log10(t);
+   t = log10(t*t);
+
+   t = cos(t);
+   t = cos(t*t);
+
+   t = sin(t);
+   t = sin(t*t);
+
+   t = tan(t);
+   t = tan(t*t);
+
+   t = asin(t);
+   t = asin(t*t);
+
+   t = atan(t);
+   t = atan(t*t);
+
+   t = acos(t);
+   t = acos(t*t);
+
+   t = cosh(t);
+   t = cosh(t*t);
+
+   t = sinh(t);
+   t = sinh(t*t);
+
+   t = tanh(t);
+   t = tanh(t*t);
+
+   double dval = 2;
+   t = pow(t, t);
+   t = pow(t, t*t);
+   t = pow(t, dval);
+   t = pow(t*t, t);
+   t = pow(t*t, t*t);
+   t = pow(t*t, dval);
+   t = pow(dval, t);
+   t = pow(dval, t*t);
+
+   t = atan2(t, t);
+   t = atan2(t, t*t);
+   t = atan2(t, dval);
+   t = atan2(t*t, t);
+   t = atan2(t*t, t*t);
+   t = atan2(t*t, dval);
+   t = atan2(dval, t);
+   t = atan2(dval, t*t);
+
+   t = fmod(t, t);
+   t = fmod(t, t*t);
+   t = fmod(t, dval);
+   t = fmod(t*t, t);
+   t = fmod(t*t, t*t);
+   t = fmod(t*t, dval);
+   t = fmod(dval, t);
+   t = fmod(dval, t*t);
+
+   typedef typename T::backend_type backend_type;
+   typedef typename backend_type::exponent_type exp_type;
+   exp_type e = 0;
+   int i = 0;
+
+   t = ldexp(t, i);
+   t = ldexp(t*t, i);
+   t = ldexp(t, e);
+   t = ldexp(t*t, e);
+
+   t = frexp(t, &i);
+   t = frexp(t*t, &i);
+   t = frexp(t, &e);
+   t = frexp(t*t, &e);
+}
+
+void foo()
+{
+#ifdef TEST_BACKEND
+   test_extra(boost::multiprecision::concepts::mp_number_float_architype());
+#endif
+#ifdef TEST_MPF_50
+   test_extra(boost::multiprecision::mpf_float_50());
+#endif
+#ifdef TEST_MPFR_50
+   test_extra(boost::multiprecision::mpfr_float_50());
+#endif
+#ifdef TEST_MPFR_6
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> >());
+#endif
+#ifdef TEST_MPFR_15
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> >());
+#endif
+#ifdef TEST_MPFR_17
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> >());
+#endif
+#ifdef TEST_MPFR_30
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> >());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT
+   test_extra(boost::multiprecision::cpp_dec_float_50());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT_NO_ET
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::cpp_dec_float<100>, false>());
+#endif
+}
+
+int main()
+{
+#ifdef TEST_BACKEND
+   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::concepts::mp_number_float_architype>));
+#endif
+#ifdef TEST_MPF_50
+   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpf_float_50>));
+#endif
+#ifdef TEST_MPFR_50
+   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpfr_float_50>));
+#endif
+#ifdef TEST_MPFR_6
+   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> > >));
+#endif
+#ifdef TEST_MPFR_15
+   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> > >));
+#endif
+#ifdef TEST_MPFR_17
+   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> > >));
+#endif
+#ifdef TEST_MPFR_30
+   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> > >));
+#endif
+#ifdef TEST_MPFR_50
+   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpfr_float_50>));
+#endif
+#ifdef TEST_CPP_DEC_FLOAT
+   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::cpp_dec_float_50>));
+#endif
+
+}
Added: sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_basic.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_basic.cpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -0,0 +1,149 @@
+//  Copyright John Maddock 2012.
+//  Use, modification and distribution are subject to 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)
+
+//
+// This tests that cpp_dec_float_50 meets our
+// conceptual requirements when used with Boost.Math.
+//
+#ifdef _MSC_VER
+#  define _SCL_SECURE_NO_WARNINGS
+#  pragma warning(disable:4800)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4127)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4503) // decorated name length exceeded, name was truncated
+#endif
+
+#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) \
+   && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50)\
+   && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#  define TEST_MPF_50
+#  define TEST_BACKEND
+#  define TEST_MPZ
+#  define TEST_MPFR_50
+#  define TEST_MPFR_6
+#  define TEST_MPFR_15
+#  define TEST_MPFR_17
+#  define TEST_MPFR_30
+#  define TEST_CPP_DEC_FLOAT
+#  define TEST_CPP_DEC_FLOAT_NO_ET
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF_50) || defined(TEST_MPZ)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
+#endif
+#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#endif
+#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+
+#include <boost/math/special_functions.hpp>
+
+template <class T>
+void test_extra(T)
+{
+   T v1, v2, v3;
+   int i;
+   (boost::math::fpclassify)(v1);
+   (boost::math::isfinite)(v1);
+   (boost::math::isnormal)(v1);
+   (boost::math::isnan)(v1);
+   (boost::math::isinf)(v1);
+   (boost::math::signbit)(v1);
+   (boost::math::copysign)(v1, v2);
+   (boost::math::changesign)(v1);
+   (boost::math::sign)(v1);
+   boost::math::log1p(v1);
+   boost::math::expm1(v1);
+   boost::math::cbrt(v1);
+   boost::math::sqrt1pm1(v1);
+   boost::math::powm1(v1, v2);
+   boost::math::hypot(v1, v2);
+   boost::math::sinc_pi(v1);
+   boost::math::sinhc_pi(v1);
+   boost::math::asinh(v1);
+   boost::math::acosh(v1);
+   boost::math::atanh(v1);
+   boost::math::sin_pi(v1);
+   boost::math::cos_pi(v1);
+   boost::math::trunc(v1);
+   boost::math::itrunc(v1);
+   boost::math::ltrunc(v1);
+   boost::math::round(v1);
+   boost::math::iround(v1);
+   boost::math::lround(v1);
+   boost::math::modf(v1, &v1);
+   boost::math::modf(v1, &i);
+   long l;
+   boost::math::modf(v1, &l);
+#ifdef BOOST_HAS_LONG_LONG
+   boost::math::lltrunc(v1);
+   boost::math::llround(v1);
+   boost::long_long_type ll;
+   boost::math::modf(v1, &ll);
+#endif
+   boost::math::pow<2>(v1);
+   boost::math::nextafter(v1, v1);
+   boost::math::float_next(v1);
+   boost::math::float_prior(v1);
+   boost::math::float_distance(v1, v1);
+   // Misc functions that don't fit elsewhere:
+   boost::math::expint(v1);
+   boost::math::expint(i);
+   boost::math::expint(i, v2);
+   boost::math::expint(i, i);
+   boost::math::zeta(v1);
+   boost::math::zeta(i);
+   boost::math::owens_t(v1, v2);
+}
+
+void foo()
+{
+#ifdef TEST_BACKEND
+   test_extra(boost::multiprecision::concepts::mp_number_float_architype());
+#endif
+#ifdef TEST_MPF_50
+   test_extra(boost::multiprecision::mpf_float_50());
+#endif
+#ifdef TEST_MPFR_50
+   test_extra(boost::multiprecision::mpfr_float_50());
+#endif
+#ifdef TEST_MPFR_6
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> >());
+#endif
+#ifdef TEST_MPFR_15
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> >());
+#endif
+#ifdef TEST_MPFR_17
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> >());
+#endif
+#ifdef TEST_MPFR_30
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> >());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT
+   test_extra(boost::multiprecision::cpp_dec_float_50());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT_NO_ET
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::cpp_dec_float<100>, false>());
+#endif
+}
+
+int main()
+{
+   foo();
+}
Added: sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_bessel.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_bessel.cpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -0,0 +1,114 @@
+//  Copyright John Maddock 2012.
+//  Use, modification and distribution are subject to 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)
+
+//
+// This tests that cpp_dec_float_50 meets our
+// conceptual requirements when used with Boost.Math.
+//
+#ifdef _MSC_VER
+#  define _SCL_SECURE_NO_WARNINGS
+#  pragma warning(disable:4800)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4127)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4503) // decorated name length exceeded, name was truncated
+#endif
+
+#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) \
+   && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50)\
+   && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#  define TEST_MPF_50
+#  define TEST_BACKEND
+#  define TEST_MPZ
+#  define TEST_MPFR_50
+#  define TEST_MPFR_6
+#  define TEST_MPFR_15
+#  define TEST_MPFR_17
+#  define TEST_MPFR_30
+#  define TEST_CPP_DEC_FLOAT
+#  define TEST_CPP_DEC_FLOAT_NO_ET
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF_50) || defined(TEST_MPZ)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
+#endif
+#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#endif
+#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+
+#include <boost/math/special_functions.hpp>
+
+template <class T>
+void test_extra(T)
+{
+   T v1, v2, v3;
+   int i(0);
+   boost::math::cyl_neumann(v1, v2);
+   boost::math::cyl_neumann(i, v2);
+   boost::math::cyl_bessel_j(v1, v2);
+   boost::math::cyl_bessel_j(i, v2);
+   boost::math::cyl_bessel_i(v1, v2);
+   boost::math::cyl_bessel_i(i, v2);
+   boost::math::cyl_bessel_k(v1, v2);
+   boost::math::cyl_bessel_k(i, v2);
+   boost::math::sph_bessel(i, v2);
+   boost::math::sph_bessel(i, 1);
+   boost::math::sph_neumann(i, v2);
+   boost::math::sph_neumann(i, i);
+   boost::math::airy_ai(v1);
+   boost::math::airy_bi(v1);
+   boost::math::airy_ai_prime(v1);
+   boost::math::airy_bi_prime(v1);
+}
+
+void foo()
+{
+#ifdef TEST_BACKEND
+   test_extra(boost::multiprecision::concepts::mp_number_float_architype());
+#endif
+#ifdef TEST_MPF_50
+   test_extra(boost::multiprecision::mpf_float_50());
+#endif
+#ifdef TEST_MPFR_50
+   test_extra(boost::multiprecision::mpfr_float_50());
+#endif
+#ifdef TEST_MPFR_6
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> >());
+#endif
+#ifdef TEST_MPFR_15
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> >());
+#endif
+#ifdef TEST_MPFR_17
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> >());
+#endif
+#ifdef TEST_MPFR_30
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> >());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT
+   test_extra(boost::multiprecision::cpp_dec_float_50());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT_NO_ET
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::cpp_dec_float<100>, false>());
+#endif
+}
+
+int main()
+{
+   foo();
+}
Added: sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_elliptic.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_elliptic.cpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -0,0 +1,120 @@
+//  Copyright John Maddock 2012.
+//  Use, modification and distribution are subject to 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)
+
+//
+// This tests that cpp_dec_float_50 meets our
+// conceptual requirements when used with Boost.Math.
+//
+#ifdef _MSC_VER
+#  define _SCL_SECURE_NO_WARNINGS
+#  pragma warning(disable:4800)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4127)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4503) // decorated name length exceeded, name was truncated
+#endif
+
+#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) \
+   && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50)\
+   && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#  define TEST_MPF_50
+#  define TEST_BACKEND
+#  define TEST_MPZ
+#  define TEST_MPFR_50
+#  define TEST_MPFR_6
+#  define TEST_MPFR_15
+#  define TEST_MPFR_17
+#  define TEST_MPFR_30
+#  define TEST_CPP_DEC_FLOAT
+#  define TEST_CPP_DEC_FLOAT_NO_ET
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF_50) || defined(TEST_MPZ)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
+#endif
+#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#endif
+#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+
+#include <boost/math/special_functions.hpp>
+
+template <class T>
+void test_extra(T)
+{
+   T v1, v2, v3;
+   boost::math::ellint_1(v1);
+   boost::math::ellint_1(v1, v2);
+   boost::math::ellint_2(v1);
+   boost::math::ellint_2(v1, v2);
+   boost::math::ellint_3(v1, v2);
+   boost::math::ellint_3(v1, v2, v3);
+   boost::math::ellint_rc(v1, v2);
+   boost::math::ellint_rd(v1, v2, v3);
+   boost::math::ellint_rf(v1, v2, v3);
+   boost::math::ellint_rj(v1, v2, v3, v1);
+   boost::math::jacobi_elliptic(v1, v2, &v1, &v2);
+   boost::math::jacobi_cd(v1, v2);
+   boost::math::jacobi_cn(v1, v2);
+   boost::math::jacobi_cs(v1, v2);
+   boost::math::jacobi_dc(v1, v2);
+   boost::math::jacobi_dn(v1, v2);
+   boost::math::jacobi_ds(v1, v2);
+   boost::math::jacobi_nc(v1, v2);
+   boost::math::jacobi_nd(v1, v2);
+   boost::math::jacobi_ns(v1, v2);
+   boost::math::jacobi_sc(v1, v2);
+   boost::math::jacobi_sd(v1, v2);
+   boost::math::jacobi_sn(v1, v2);
+}
+
+void foo()
+{
+#ifdef TEST_BACKEND
+   test_extra(boost::multiprecision::concepts::mp_number_float_architype());
+#endif
+#ifdef TEST_MPF_50
+   test_extra(boost::multiprecision::mpf_float_50());
+#endif
+#ifdef TEST_MPFR_50
+   test_extra(boost::multiprecision::mpfr_float_50());
+#endif
+#ifdef TEST_MPFR_6
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> >());
+#endif
+#ifdef TEST_MPFR_15
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> >());
+#endif
+#ifdef TEST_MPFR_17
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> >());
+#endif
+#ifdef TEST_MPFR_30
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> >());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT
+   test_extra(boost::multiprecision::cpp_dec_float_50());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT_NO_ET
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::cpp_dec_float<100>, false>());
+#endif
+}
+
+int main()
+{
+   foo();
+}
Added: sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_gamma.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_gamma.cpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -0,0 +1,136 @@
+//  Copyright John Maddock 2012.
+//  Use, modification and distribution are subject to 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)
+
+//
+// This tests that cpp_dec_float_50 meets our
+// conceptual requirements when used with Boost.Math.
+//
+#ifdef _MSC_VER
+#  define _SCL_SECURE_NO_WARNINGS
+#  pragma warning(disable:4800)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4127)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4503) // decorated name length exceeded, name was truncated
+#endif
+
+#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) \
+   && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50)\
+   && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#  define TEST_MPF_50
+#  define TEST_BACKEND
+#  define TEST_MPZ
+#  define TEST_MPFR_50
+#  define TEST_MPFR_6
+#  define TEST_MPFR_15
+#  define TEST_MPFR_17
+#  define TEST_MPFR_30
+#  define TEST_CPP_DEC_FLOAT
+#  define TEST_CPP_DEC_FLOAT_NO_ET
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF_50) || defined(TEST_MPZ)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
+#endif
+#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#endif
+#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+
+#include <boost/math/special_functions.hpp>
+
+template <class T>
+void test_extra(T)
+{
+   T v1, v2, v3;
+   int i;
+   boost::math::tgamma(v1);
+   boost::math::tgamma1pm1(v1);
+   boost::math::lgamma(v1);
+   boost::math::lgamma(v1, &i);
+   boost::math::digamma(v1);
+   boost::math::tgamma_ratio(v1, v2);
+   boost::math::tgamma_delta_ratio(v1, v2);
+   boost::math::factorial<T>(i);
+   boost::math::unchecked_factorial<T>(i);
+   i = boost::math::max_factorial<T>::value;
+   boost::math::double_factorial<T>(i);
+   boost::math::rising_factorial(v1, i);
+   boost::math::falling_factorial(v1, i);
+   boost::math::tgamma(v1, v2);
+   boost::math::tgamma_lower(v1, v2);
+   boost::math::gamma_p(v1, v2);
+   boost::math::gamma_q(v1, v2);
+   boost::math::gamma_p_inv(v1, v2);
+   boost::math::gamma_q_inv(v1, v2);
+   boost::math::gamma_p_inva(v1, v2);
+   boost::math::gamma_q_inva(v1, v2);
+   boost::math::erf(v1);
+   boost::math::erfc(v1);
+   boost::math::erf_inv(v1);
+   boost::math::erfc_inv(v1);
+   boost::math::beta(v1, v2);
+   boost::math::beta(v1, v2, v3);
+   boost::math::betac(v1, v2, v3);
+   boost::math::ibeta(v1, v2, v3);
+   boost::math::ibetac(v1, v2, v3);
+   boost::math::ibeta_inv(v1, v2, v3);
+   boost::math::ibetac_inv(v1, v2, v3);
+   boost::math::ibeta_inva(v1, v2, v3);
+   boost::math::ibetac_inva(v1, v2, v3);
+   boost::math::ibeta_invb(v1, v2, v3);
+   boost::math::ibetac_invb(v1, v2, v3);
+   boost::math::gamma_p_derivative(v2, v3);
+   boost::math::ibeta_derivative(v1, v2, v3);
+}
+
+void foo()
+{
+#ifdef TEST_BACKEND
+   test_extra(boost::multiprecision::concepts::mp_number_float_architype());
+#endif
+#ifdef TEST_MPF_50
+   test_extra(boost::multiprecision::mpf_float_50());
+#endif
+#ifdef TEST_MPFR_50
+   test_extra(boost::multiprecision::mpfr_float_50());
+#endif
+#ifdef TEST_MPFR_6
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> >());
+#endif
+#ifdef TEST_MPFR_15
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> >());
+#endif
+#ifdef TEST_MPFR_17
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> >());
+#endif
+#ifdef TEST_MPFR_30
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> >());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT
+   test_extra(boost::multiprecision::cpp_dec_float_50());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT_NO_ET
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::cpp_dec_float<100>, false>());
+#endif
+}
+
+int main()
+{
+   foo();
+}
Added: sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_poly.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/concepts/sf_concept_check_poly.cpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -0,0 +1,111 @@
+//  Copyright John Maddock 2012.
+//  Use, modification and distribution are subject to 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)
+
+//
+// This tests that cpp_dec_float_50 meets our
+// conceptual requirements when used with Boost.Math.
+//
+#ifdef _MSC_VER
+#  define _SCL_SECURE_NO_WARNINGS
+#  pragma warning(disable:4800)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4127)
+#  pragma warning(disable:4512)
+#  pragma warning(disable:4503) // decorated name length exceeded, name was truncated
+#endif
+
+#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) \
+   && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50)\
+   && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#  define TEST_MPF_50
+#  define TEST_BACKEND
+#  define TEST_MPZ
+#  define TEST_MPFR_50
+#  define TEST_MPFR_6
+#  define TEST_MPFR_15
+#  define TEST_MPFR_17
+#  define TEST_MPFR_30
+#  define TEST_CPP_DEC_FLOAT
+#  define TEST_CPP_DEC_FLOAT_NO_ET
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF_50) || defined(TEST_MPZ)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
+#endif
+#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET)
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#endif
+#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+
+#include <boost/math/special_functions.hpp>
+
+template <class T>
+void test_extra(T)
+{
+   T v1, v2, v3;
+   boost::math::legendre_p(1, v1);
+   boost::math::legendre_p(1, 0, v1);
+   boost::math::legendre_q(1, v1);
+   boost::math::legendre_next(2, v1, v2, v3);
+   boost::math::legendre_next(2, 2, v1, v2, v3);
+   boost::math::laguerre(1, v1);
+   boost::math::laguerre(2, 1, v1);
+   boost::math::laguerre(2u, 1u, v1);
+   boost::math::laguerre_next(2, v1, v2, v3);
+   boost::math::laguerre_next(2, 1, v1, v2, v3);
+   boost::math::hermite(1, v1);
+   boost::math::hermite_next(2, v1, v2, v3);
+   boost::math::spherical_harmonic_r(2, 1, v1, v2);
+   boost::math::spherical_harmonic_i(2, 1, v1, v2);
+}
+
+void foo()
+{
+#ifdef TEST_BACKEND
+   test_extra(boost::multiprecision::concepts::mp_number_float_architype());
+#endif
+#ifdef TEST_MPF_50
+   test_extra(boost::multiprecision::mpf_float_50());
+#endif
+#ifdef TEST_MPFR_50
+   test_extra(boost::multiprecision::mpfr_float_50());
+#endif
+#ifdef TEST_MPFR_6
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> >());
+#endif
+#ifdef TEST_MPFR_15
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> >());
+#endif
+#ifdef TEST_MPFR_17
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> >());
+#endif
+#ifdef TEST_MPFR_30
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> >());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT
+   test_extra(boost::multiprecision::cpp_dec_float_50());
+#endif
+#ifdef TEST_CPP_DEC_FLOAT_NO_ET
+   test_extra(boost::multiprecision::mp_number<boost::multiprecision::cpp_dec_float<100>, false>());
+#endif
+}
+
+int main()
+{
+   foo();
+}
Deleted: sandbox/big_number/libs/multiprecision/test/mp_number_concept_check.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/mp_number_concept_check.cpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
+++ (empty file)
@@ -1,237 +0,0 @@
-//  Copyright John Maddock 2011.
-//  Use, modification and distribution are subject to 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)
-
-//
-// This tests two things: that cpp_dec_float_50 meets our
-// conceptual requirements, and that we can instantiate
-// all our distributions and special functions on this type.
-//
-#define BOOST_MATH_ASSERT_UNDEFINED_POLICY false
-#define BOOST_MATH_INSTANTIATE_MINIMUM
-
-#ifdef _MSC_VER
-#  define _SCL_SECURE_NO_WARNINGS
-#  pragma warning(disable:4800)
-#  pragma warning(disable:4512)
-#  pragma warning(disable:4127)
-#  pragma warning(disable:4512)
-#  pragma warning(disable:4503) // decorated name length exceeded, name was truncated
-#endif
-
-#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) \
-   && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50)\
-   && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET)
-#  define TEST_MPF_50
-#  define TEST_BACKEND
-#  define TEST_MPZ
-#  define TEST_MPFR_50
-#  define TEST_MPFR_6
-#  define TEST_MPFR_15
-#  define TEST_MPFR_17
-#  define TEST_MPFR_30
-#  define TEST_CPP_DEC_FLOAT
-#  define TEST_CPP_DEC_FLOAT_NO_ET
-
-#ifdef _MSC_VER
-#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
-#endif
-#ifdef __GNUC__
-#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
-#endif
-
-#endif
-
-#if defined(TEST_MPF_50) || defined(TEST_MPZ)
-#include <boost/multiprecision/gmp.hpp>
-#endif
-#ifdef TEST_BACKEND
-#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
-#endif
-#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET)
-#include <boost/multiprecision/cpp_dec_float.hpp>
-#endif
-#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30)
-#include <boost/multiprecision/mpfr.hpp>
-#endif
-
-#include <boost/math/concepts/real_type_concept.hpp>
-#include "libs/math/test/compile_test/instantiate.hpp"
-
-template <class T>
-void test_extra(T)
-{
-   T t = 1;
-   t = abs(t);
-   t = abs(t*t);
-
-   t = fabs(t);
-   t = fabs(t*t);
-
-   t = sqrt(t);
-   t = sqrt(t*t);
-
-   t = floor(t);
-   t = floor(t*t);
-
-   t = ceil(t);
-   t = ceil(t*t);
-
-   t = trunc(t);
-   t = trunc(t*t);
-
-   t = round(t);
-   t = round(t*t);
-
-   t = exp(t);
-   t = exp(t*t);
-
-   t = log(t);
-   t = log(t*t);
-
-   t = log10(t);
-   t = log10(t*t);
-
-   t = cos(t);
-   t = cos(t*t);
-
-   t = sin(t);
-   t = sin(t*t);
-
-   t = tan(t);
-   t = tan(t*t);
-
-   t = asin(t);
-   t = asin(t*t);
-
-   t = atan(t);
-   t = atan(t*t);
-
-   t = acos(t);
-   t = acos(t*t);
-
-   t = cosh(t);
-   t = cosh(t*t);
-
-   t = sinh(t);
-   t = sinh(t*t);
-
-   t = tanh(t);
-   t = tanh(t*t);
-
-   double dval = 2;
-   t = pow(t, t);
-   t = pow(t, t*t);
-   t = pow(t, dval);
-   t = pow(t*t, t);
-   t = pow(t*t, t*t);
-   t = pow(t*t, dval);
-   t = pow(dval, t);
-   t = pow(dval, t*t);
-
-   t = atan2(t, t);
-   t = atan2(t, t*t);
-   t = atan2(t, dval);
-   t = atan2(t*t, t);
-   t = atan2(t*t, t*t);
-   t = atan2(t*t, dval);
-   t = atan2(dval, t);
-   t = atan2(dval, t*t);
-
-   t = fmod(t, t);
-   t = fmod(t, t*t);
-   t = fmod(t, dval);
-   t = fmod(t*t, t);
-   t = fmod(t*t, t*t);
-   t = fmod(t*t, dval);
-   t = fmod(dval, t);
-   t = fmod(dval, t*t);
-
-   typedef typename T::backend_type backend_type;
-   typedef typename backend_type::exponent_type exp_type;
-   exp_type e = 0;
-   int i = 0;
-
-   t = ldexp(t, i);
-   t = ldexp(t*t, i);
-   t = ldexp(t, e);
-   t = ldexp(t*t, e);
-
-   t = frexp(t, &i);
-   t = frexp(t*t, &i);
-   t = frexp(t, &e);
-   t = frexp(t*t, &e);
-}
-
-void foo()
-{
-#ifdef TEST_BACKEND
-   instantiate(boost::multiprecision::concepts::mp_number_float_architype());
-   test_extra(boost::multiprecision::concepts::mp_number_float_architype());
-#endif
-#ifdef TEST_MPF_50
-   instantiate(boost::multiprecision::mpf_float_50());
-   test_extra(boost::multiprecision::mpf_float_50());
-#endif
-#ifdef TEST_MPFR_50
-   instantiate(boost::multiprecision::mpfr_float_50());
-   test_extra(boost::multiprecision::mpfr_float_50());
-#endif
-#ifdef TEST_MPFR_6
-   instantiate(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> >());
-   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> >());
-#endif
-#ifdef TEST_MPFR_15
-   instantiate(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> >());
-   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> >());
-#endif
-#ifdef TEST_MPFR_17
-   instantiate(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> >());
-   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> >());
-#endif
-#ifdef TEST_MPFR_30
-   instantiate(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> >());
-   test_extra(boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> >());
-#endif
-#ifdef TEST_CPP_DEC_FLOAT
-   instantiate(boost::multiprecision::cpp_dec_float_50());
-   test_extra(boost::multiprecision::cpp_dec_float_50());
-#endif
-#ifdef TEST_CPP_DEC_FLOAT_NO_ET
-   instantiate(boost::multiprecision::mp_number<boost::multiprecision::cpp_dec_float<100>, false>());
-   test_extra(boost::multiprecision::mp_number<boost::multiprecision::cpp_dec_float<100>, false>());
-#endif
-}
-
-int main()
-{
-#ifdef TEST_BACKEND
-   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::concepts::mp_number_float_architype>));
-#endif
-#ifdef TEST_MPF_50
-   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpf_float_50>));
-#endif
-#ifdef TEST_MPFR_50
-   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpfr_float_50>));
-#endif
-#ifdef TEST_MPFR_6
-   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<6> > >));
-#endif
-#ifdef TEST_MPFR_15
-   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<15> > >));
-#endif
-#ifdef TEST_MPFR_17
-   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<17> > >));
-#endif
-#ifdef TEST_MPFR_30
-   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mp_number<boost::multiprecision::mpfr_float_backend<30> > >));
-#endif
-#ifdef TEST_MPFR_50
-   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpfr_float_50>));
-#endif
-#ifdef TEST_CPP_DEC_FLOAT
-   BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::cpp_dec_float_50>));
-#endif
-
-}
Added: sandbox/big_number/libs/multiprecision/test/test_constexpr.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/test_constexpr.cpp	2012-07-24 14:03:54 EDT (Tue, 24 Jul 2012)
@@ -0,0 +1,39 @@
+///////////////////////////////////////////////////////////////////////////////
+//  Copyright 2012 John Maddock. 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)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+#ifndef BOOST_NO_CONSTEXPR
+
+template <class T>
+void test1()
+{
+   constexpr T i1 = 2u;
+   constexpr T i2;
+   constexpr T i3 = -3;
+   constexpr T i4(i1);
+}
+template <class T>
+void test2()
+{
+   constexpr T i1 = 2u;
+   constexpr T i2;
+   constexpr T i3 = -3;
+}
+template <class T>
+void test3()
+{
+   constexpr T i1 = 2u;
+   constexpr T i2;
+}
+
+using namespace boost::multiprecision;
+
+template void test1<mp_number<backends::cpp_int_backend<64, false, void, true>, false> >();
+template void test1<mp_number<backends::cpp_int_backend<64, true, void, true>, false> >();
+template void test3<mp_number<backends::cpp_int_backend<2048, false, void>, false> >();
+template void test2<mp_number<backends::cpp_int_backend<2048, true, void>, false> >();
+
+#endif
\ No newline at end of file