]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/test/include/boost/test/tools/fpc_tolerance.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / test / include / boost / test / tools / fpc_tolerance.hpp
1 // (C) Copyright Gennadiy Rozental 2001.
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&
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 {
47 local_fpc_tolerance( FPT fraction_tolerance ) : m_old_tolerance( fpc_tolerance<FPT>() )
48 {
49 fpc_tolerance<FPT>() = fraction_tolerance;
50 }
51
52 ~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
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
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