///////////////////////////////////////////////////////////////
// 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_
+// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
#ifndef BOOST_MATH_CONCEPTS_ER_HPP
#define BOOST_MATH_CONCEPTS_ER_HPP
#include <boost/multiprecision/number.hpp>
#include <boost/math/special_functions/fpclassify.hpp>
#include <boost/mpl/list.hpp>
+#include <boost/container_hash/hash.hpp>
-namespace boost{
-namespace multiprecision{
-namespace concepts{
+namespace boost {
+namespace multiprecision {
+namespace concepts {
#ifdef BOOST_MSVC
#pragma warning(push)
-#pragma warning(disable:4244)
+#pragma warning(disable : 4244)
#endif
struct number_backend_float_architype
{
- typedef mpl::list<boost::long_long_type> signed_types;
- typedef mpl::list<boost::ulong_long_type> unsigned_types;
- typedef mpl::list<long double> float_types;
- typedef int exponent_type;
+ typedef mpl::list<boost::long_long_type> signed_types;
+ typedef mpl::list<boost::ulong_long_type> unsigned_types;
+ typedef mpl::list<long double> float_types;
+ typedef int exponent_type;
number_backend_float_architype()
{
std::cout << "Copy construct" << std::endl;
m_value = o.m_value;
}
- number_backend_float_architype& operator = (const number_backend_float_architype& o)
+ number_backend_float_architype& operator=(const number_backend_float_architype& o)
{
m_value = o.m_value;
std::cout << "Assignment (" << m_value << ")" << std::endl;
return *this;
}
- number_backend_float_architype& operator = (boost::ulong_long_type i)
+ number_backend_float_architype& operator=(boost::ulong_long_type i)
{
m_value = i;
std::cout << "UInt Assignment (" << i << ")" << std::endl;
return *this;
}
- number_backend_float_architype& operator = (boost::long_long_type i)
+ number_backend_float_architype& operator=(boost::long_long_type i)
{
m_value = i;
std::cout << "Int Assignment (" << i << ")" << std::endl;
return *this;
}
- number_backend_float_architype& operator = (long double d)
+ number_backend_float_architype& operator=(long double d)
{
m_value = d;
std::cout << "long double Assignment (" << d << ")" << std::endl;
return *this;
}
- number_backend_float_architype& operator = (const char* s)
+ number_backend_float_architype& operator=(const char* s)
{
#ifndef BOOST_NO_EXCEPTIONS
try
m_value = boost::lexical_cast<long double>(s);
#ifndef BOOST_NO_EXCEPTIONS
}
- catch(const std::exception&)
+ catch (const std::exception&)
{
BOOST_THROW_EXCEPTION(std::runtime_error(std::string("Unable to parse input string: \"") + s + std::string("\" as a valid floating point number.")));
}
std::cout << "Swapping (" << m_value << " with " << o.m_value << ")" << std::endl;
std::swap(m_value, o.m_value);
}
- std::string str(std::streamsize digits, std::ios_base::fmtflags f)const
+ std::string str(std::streamsize digits, std::ios_base::fmtflags f) const
{
std::stringstream ss;
ss.flags(f);
- if(digits)
+ if (digits)
ss.precision(digits);
else
ss.precision(std::numeric_limits<long double>::digits10 + 3);
- boost::intmax_t i = m_value;
+ boost::intmax_t i = m_value;
boost::uintmax_t u = m_value;
- if(!(f & std::ios_base::scientific) && m_value == i)
+ if (!(f & std::ios_base::scientific) && m_value == i)
ss << i;
- else if(!(f & std::ios_base::scientific) && m_value == u)
+ else if (!(f & std::ios_base::scientific) && m_value == u)
ss << u;
else
ss << m_value;
std::cout << "Negating (" << m_value << ")" << std::endl;
m_value = -m_value;
}
- int compare(const number_backend_float_architype& o)const
+ int compare(const number_backend_float_architype& o) const
{
std::cout << "Comparison" << std::endl;
return m_value > o.m_value ? 1 : (m_value < o.m_value ? -1 : 0);
}
- int compare(boost::long_long_type i)const
+ int compare(boost::long_long_type i) const
{
std::cout << "Comparison with int" << std::endl;
return m_value > i ? 1 : (m_value < i ? -1 : 0);
}
- int compare(boost::ulong_long_type i)const
+ int compare(boost::ulong_long_type i) const
{
std::cout << "Comparison with unsigned" << std::endl;
return m_value > i ? 1 : (m_value < i ? -1 : 0);
}
- int compare(long double d)const
+ int compare(long double d) const
{
std::cout << "Comparison with long double" << std::endl;
return m_value > d ? 1 : (m_value < d ? -1 : 0);
return (boost::math::fpclassify)(arg.m_value);
}
+inline std::size_t hash_value(const number_backend_float_architype& v)
+{
+ boost::hash<long double> hasher;
+ return hasher(v.m_value);
+}
+
typedef boost::multiprecision::number<number_backend_float_architype> mp_number_float_architype;
-} // namespace
+} // namespace concepts
-template<>
-struct number_category<concepts::number_backend_float_architype> : public mpl::int_<number_kind_floating_point>{};
+template <>
+struct number_category<concepts::number_backend_float_architype> : public mpl::int_<number_kind_floating_point>
+{};
-}} // namespaces
+}} // namespace boost::multiprecision
-namespace std{
+namespace std {
template <boost::multiprecision::expression_template_option ExpressionTemplates>
class numeric_limits<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype, ExpressionTemplates> > : public std::numeric_limits<long double>
{
- typedef std::numeric_limits<long double> base_type;
+ typedef std::numeric_limits<long double> base_type;
typedef boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype, ExpressionTemplates> number_type;
-public:
- static number_type (min)() BOOST_NOEXCEPT { return (base_type::min)(); }
- static number_type (max)() BOOST_NOEXCEPT { return (base_type::max)(); }
+
+ public:
+ static number_type(min)() BOOST_NOEXCEPT { return (base_type::min)(); }
+ static number_type(max)() BOOST_NOEXCEPT { return (base_type::max)(); }
static number_type lowest() BOOST_NOEXCEPT { return -(max)(); }
static number_type epsilon() BOOST_NOEXCEPT { return base_type::epsilon(); }
static number_type round_error() BOOST_NOEXCEPT { return base_type::round_error(); }
static number_type denorm_min() BOOST_NOEXCEPT { return base_type::denorm_min(); }
};
-}
+} // namespace std
#ifdef BOOST_MSVC
#pragma warning(pop)