diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/spirit/test/karma/real3.cpp | |
parent | Initial commit. (diff) | |
download | ceph-upstream.tar.xz ceph-upstream.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/spirit/test/karma/real3.cpp')
-rw-r--r-- | src/boost/libs/spirit/test/karma/real3.cpp | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/src/boost/libs/spirit/test/karma/real3.cpp b/src/boost/libs/spirit/test/karma/real3.cpp new file mode 100644 index 00000000..fda1508c --- /dev/null +++ b/src/boost/libs/spirit/test/karma/real3.cpp @@ -0,0 +1,185 @@ +// Copyright (c) 2001-2011 Hartmut Kaiser +// Copyright (c) 2011 Bryce Lelbach +// +// 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/spirit/include/version.hpp> +#include <boost/spirit/include/karma_phoenix_attributes.hpp> +#include <boost/spirit/include/phoenix_core.hpp> +#include <boost/spirit/include/phoenix_operator.hpp> +#include "real.hpp" + +/////////////////////////////////////////////////////////////////////////////// +// the customization points below have been added only recently +#if SPIRIT_VERSION >= 0x2050 +// does not provide proper std::numeric_limits, we need to roll our own +namespace boost { namespace spirit { namespace traits +{ + template <> + struct is_nan<boost::math::concepts::real_concept> + { + static bool call(boost::math::concepts::real_concept n) + { + return test_nan(n.value()); + } + }; + + template <> + struct is_infinite<boost::math::concepts::real_concept> + { + static bool call(boost::math::concepts::real_concept n) + { + return test_infinite(n.value()); + } + }; +}}} +#endif + +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + using namespace boost::spirit; + + { + using namespace boost::spirit::ascii; + + /////////////////////////////////////////////////////////////////////// + typedef karma::real_generator<double, fixed_policy<double> > fixed_type; + fixed_type const fixed = fixed_type(); + + BOOST_TEST(test("0.0", fixed, 0.0)); + BOOST_TEST(test("1.0", fixed, 1.0)); + + BOOST_TEST(test("0.0", fixed, 0.000012345)); + BOOST_TEST(test("0.0", fixed, 0.00012345)); + BOOST_TEST(test("0.001", fixed, 0.0012345)); + BOOST_TEST(test("0.012", fixed, 0.012345)); + BOOST_TEST(test("0.123", fixed, 0.12345)); + BOOST_TEST(test("1.234", fixed, 1.2345)); + BOOST_TEST(test("12.345", fixed, 12.345)); + BOOST_TEST(test("123.45", fixed, 123.45)); + BOOST_TEST(test("1234.5", fixed, 1234.5)); + BOOST_TEST(test("12342.0", fixed, 12342.)); + BOOST_TEST(test("123420.0", fixed, 123420.)); + BOOST_TEST(test("123420000000000000000.0", fixed, 1.23420e20)); + + BOOST_TEST(test("0.0", fixed, -0.000012345)); + BOOST_TEST(test("0.0", fixed, -0.00012345)); + BOOST_TEST(test("-0.001", fixed, -0.0012345)); + BOOST_TEST(test("-0.012", fixed, -0.012345)); + BOOST_TEST(test("-0.123", fixed, -0.12345)); + BOOST_TEST(test("-1.234", fixed, -1.2345)); + BOOST_TEST(test("-12.346", fixed, -12.346)); + BOOST_TEST(test("-123.46", fixed, -123.46)); + BOOST_TEST(test("-1234.5", fixed, -1234.5)); + BOOST_TEST(test("-12342.0", fixed, -12342.)); + BOOST_TEST(test("-123420.0", fixed, -123420.)); + BOOST_TEST(test("-123420000000000000000.0", fixed, -1.23420e20)); + } + +// support for using real_concept with a Karma generator has been implemented +// in Boost versions > 1.36 only, additionally real_concept is available only +// if BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS is not defined +#if BOOST_VERSION > 103600 && !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS) + { + using boost::math::concepts::real_concept; + typedef karma::real_generator<real_concept> custom_type; + custom_type const custom = custom_type(); + + BOOST_TEST(test("0.0", custom, real_concept(0.0))); + BOOST_TEST(test("1.0", custom, real_concept(1.0))); + BOOST_TEST(test("1.0", custom, real_concept(1.0001))); + BOOST_TEST(test("1.001", custom, real_concept(1.001))); + BOOST_TEST(test("1.01", custom, real_concept(1.010))); + BOOST_TEST(test("1.1", custom, real_concept(1.100))); + + BOOST_TEST(test("1.234e-04", custom, real_concept(0.00012345))); + BOOST_TEST(test("0.001", custom, real_concept(0.0012345))); + BOOST_TEST(test("0.012", custom, real_concept(0.012345))); + BOOST_TEST(test("0.123", custom, real_concept(0.12345))); + BOOST_TEST(test("1.234", custom, real_concept(1.2345))); + BOOST_TEST(test("12.346", custom, real_concept(12.346))); + BOOST_TEST(test("123.46", custom, real_concept(123.46))); + BOOST_TEST(test("1234.5", custom, real_concept(1234.5))); + BOOST_TEST(test("12342.0", custom, real_concept(12342.))); + BOOST_TEST(test("1.234e05", custom, real_concept(123420.))); + + BOOST_TEST(test("-1.0", custom, real_concept(-1.0))); + BOOST_TEST(test("-1.234", custom, real_concept(-1.2345))); + BOOST_TEST(test("-1.235", custom, real_concept(-1.2346))); + BOOST_TEST(test("-1234.2", custom, real_concept(-1234.2))); + + BOOST_TEST(test("1.0", custom(real_concept(1.0)))); + BOOST_TEST(test("1.0", custom(real_concept(1.0001)))); + BOOST_TEST(test("1.001", custom(real_concept(1.001)))); + BOOST_TEST(test("1.01", custom(real_concept(1.010)))); + BOOST_TEST(test("1.1", custom(real_concept(1.100)))); + + BOOST_TEST(test("1.234e-04", custom(real_concept(0.00012345)))); + BOOST_TEST(test("0.001", custom(real_concept(0.0012345)))); + BOOST_TEST(test("0.012", custom(real_concept(0.012345)))); + BOOST_TEST(test("0.123", custom(real_concept(0.12345)))); + BOOST_TEST(test("1.234", custom(real_concept(1.2345)))); + BOOST_TEST(test("12.346", custom(real_concept(12.346)))); + BOOST_TEST(test("123.46", custom(real_concept(123.46)))); + BOOST_TEST(test("1234.5", custom(real_concept(1234.5)))); + BOOST_TEST(test("12342.0", custom(real_concept(12342.)))); + BOOST_TEST(test("1.234e05", custom(real_concept(123420.)))); + } +#endif + +// this appears to be broken on Apple Tiger x86 with gcc4.0.1 +#if (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ != 40001) || \ + !defined(__APPLE__) + { + /////////////////////////////////////////////////////////////////////// + typedef karma::real_generator<double, bordercase_policy<double> > + bordercase_type; + bordercase_type const bordercase = bordercase_type(); + +// BOOST_TEST(test("-5.7222349715140557e307", +// bordercase(-5.7222349715140557e307))); + + BOOST_TEST(test("1.7976931348623158e308", + bordercase(1.7976931348623158e308))); // DBL_MAX + BOOST_TEST(test("-1.7976931348623158e308", + bordercase(-1.7976931348623158e308))); // -DBL_MAX + BOOST_TEST(test("2.2250738585072014e-308", + bordercase(2.2250738585072014e-308))); // DBL_MIN + BOOST_TEST(test("-2.2250738585072014e-308", + bordercase(-2.2250738585072014e-308))); // -DBL_MIN + } +#endif + + { + boost::optional<double> v; + BOOST_TEST(!test("", double_, v)); + BOOST_TEST(!test("", double_(1.0), v)); + + v = 1.0; + BOOST_TEST(test("1.0", double_, v)); + BOOST_TEST(test("1.0", double_(1.0), v)); + } + +// we support Phoenix attributes only starting with V2.2 +#if SPIRIT_VERSION >= 0x2020 + { // Phoenix expression tests (requires to include + // karma_phoenix_attributes.hpp) + namespace phoenix = boost::phoenix; + + BOOST_TEST(test("1.0", double_, phoenix::val(1.0))); + + double d = 1.2; + BOOST_TEST(test("1.2", double_, phoenix::ref(d))); + BOOST_TEST(test("2.2", double_, ++phoenix::ref(d))); + } +#endif + + // test for denormalized numbers + { + BOOST_TEST(test("4.941e-324", double_, std::numeric_limits<double>::denorm_min())); + } + return boost::report_errors(); +} + |