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()37 fpc_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)76 tolerance( 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)86 tolerance( 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