1 // (C) Copyright Gennadiy Rozental 2011-2014. 2 // Distributed under the Boost Software License, Version 1.0. 3 // (See accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 // See http://www.boost.org/libs/test for the library home page. 7 // 8 // File : $RCSfile$ 9 // 10 // Version : $Revision: 74248 $ 11 // 12 // Description : FPC tools tolerance holder 13 // *************************************************************************** 14 15 #ifndef BOOST_TEST_TOOLS_FPC_TOLERANCE_HPP_121612GER 16 #define BOOST_TEST_TOOLS_FPC_TOLERANCE_HPP_121612GER 17 18 // Boost Test 19 #include <boost/test/tree/decorator.hpp> 20 #include <boost/test/tools/floating_point_comparison.hpp> 21 22 #include <boost/test/detail/suppress_warnings.hpp> 23 24 //____________________________________________________________________________// 25 26 namespace boost { 27 namespace test_tools { 28 29 namespace fpc = math::fpc; 30 31 // ************************************************************************** // 32 // ************** floating point comparison tolerance ************** // 33 // ************************************************************************** // 34 35 template<typename FPT> 36 inline FPT& fpc_tolerance()37fpc_tolerance() 38 { 39 static FPT s_value = 0; 40 return s_value; 41 } 42 43 //____________________________________________________________________________// 44 45 template<typename FPT> 46 struct local_fpc_tolerance { local_fpc_toleranceboost::test_tools::local_fpc_tolerance47 local_fpc_tolerance( FPT fraction_tolerance ) : m_old_tolerance( fpc_tolerance<FPT>() ) 48 { 49 fpc_tolerance<FPT>() = fraction_tolerance; 50 } 51 ~local_fpc_toleranceboost::test_tools::local_fpc_tolerance52 ~local_fpc_tolerance() 53 { 54 if( m_old_tolerance != (FPT)-1 ) 55 fpc_tolerance<FPT>() = m_old_tolerance; 56 } 57 58 private: 59 // Data members 60 FPT m_old_tolerance; 61 }; 62 63 //____________________________________________________________________________// 64 65 } // namespace test_tools 66 67 // ************************************************************************** // 68 // ************** decorator::tolerance ************** // 69 // ************************************************************************** // 70 71 namespace unit_test { 72 namespace decorator { 73 74 template<typename FPT> 75 inline fixture_t tolerance(FPT v)76tolerance( FPT v ) 77 { 78 return fixture_t( test_unit_fixture_ptr( 79 new unit_test::class_based_fixture<test_tools::local_fpc_tolerance<FPT>,FPT>( v ) ) ); 80 } 81 82 //____________________________________________________________________________// 83 84 template<typename FPT> 85 inline fixture_t tolerance(test_tools::fpc::percent_tolerance_t<FPT> v)86tolerance( test_tools::fpc::percent_tolerance_t<FPT> v ) 87 { 88 return fixture_t( test_unit_fixture_ptr( 89 new unit_test::class_based_fixture<test_tools::local_fpc_tolerance<FPT>,FPT>( boost::math::fpc::fpc_detail::fraction_tolerance<FPT>( v ) ) ) ); 90 } 91 92 //____________________________________________________________________________// 93 94 } // namespace decorator 95 96 using decorator::tolerance; 97 98 } // namespace unit_test 99 } // namespace boost 100 101 #include <boost/test/detail/enable_warnings.hpp> 102 103 #endif // BOOST_TEST_TOOLS_FPC_TOLERANCE_HPP_121612GER 104