123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /*==============================================================================
- Copyright (c) 2001-2010 Hartmut Kaiser
- Copyright (c) 2010 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)
- ==============================================================================*/
- #if !defined(BOOST_SPIRIT_TEST_REAL_NUMERICS_HPP)
- #define BOOST_SPIRIT_TEST_REAL_NUMERICS_HPP
- #include <boost/version.hpp>
- #include <boost/config/warning_disable.hpp>
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/math/concepts/real_concept.hpp>
- #include <boost/spirit/include/karma_char.hpp>
- #include <boost/spirit/include/karma_numeric.hpp>
- #include <boost/spirit/include/karma_generate.hpp>
- #include <boost/spirit/include/karma_directive.hpp>
- #include <boost/limits.hpp>
- #include "test.hpp"
- using namespace spirit_test;
- ///////////////////////////////////////////////////////////////////////////////
- // policy for real_generator, which forces the scientific notation
- template <typename T>
- struct scientific_policy : boost::spirit::karma::real_policies<T>
- {
- // we want the numbers always to be in scientific format
- typedef boost::spirit::karma::real_policies<T> base_type;
- static int floatfield(T) { return base_type::fmtflags::scientific; }
- };
- ///////////////////////////////////////////////////////////////////////////////
- // policy for real_generator, which forces the fixed notation
- template <typename T>
- struct fixed_policy : boost::spirit::karma::real_policies<T>
- {
- typedef boost::spirit::karma::real_policies<T> base_type;
- // we want the numbers always to be in fixed format
- static int floatfield(T) { return base_type::fmtflags::fixed; }
- };
- ///////////////////////////////////////////////////////////////////////////////
- // policy for real_generator, which forces to output trailing zeros in the
- // fractional part
- template <typename T>
- struct trailing_zeros_policy : boost::spirit::karma::real_policies<T> // 4 digits
- {
- // we want the numbers always to contain trailing zeros up to 4 digits in
- // the fractional part
- static bool trailing_zeros(T) { return true; }
- // we want to generate up to 4 fractional digits
- static unsigned int precision(T) { return 4; }
- };
- ///////////////////////////////////////////////////////////////////////////////
- // policy for real_generator, which forces the sign to be generated
- template <typename T>
- struct signed_policy : boost::spirit::karma::real_policies<T>
- {
- // we want to always have a sign generated
- static bool force_sign(T)
- {
- return true;
- }
- };
- ///////////////////////////////////////////////////////////////////////////////
- // policy for real_generator, which forces to output trailing zeros in the
- // fractional part
- template <typename T>
- struct bordercase_policy : boost::spirit::karma::real_policies<T>
- {
- // we want to generate up to the maximum significant amount of fractional
- // digits
- static unsigned int precision(T)
- {
- return std::numeric_limits<T>::digits10 + 1;
- }
- };
- ///////////////////////////////////////////////////////////////////////////////
- // policy for real_generator, which forces to output trailing zeros in the
- // fractional part
- template <typename T>
- struct statefull_policy : boost::spirit::karma::real_policies<T>
- {
- statefull_policy(int precision = 4, bool trailingzeros = false)
- : precision_(precision), trailingzeros_(trailingzeros)
- {}
- // we want to generate up to the maximum significant amount of fractional
- // digits
- unsigned int precision(T) const
- {
- return precision_;
- }
- bool trailing_zeros(T) const
- {
- return trailingzeros_;
- }
- int precision_;
- bool trailingzeros_;
- };
- #endif // BOOST_SPIRIT_TEST_REAL_NUMERICS_HPP
|