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
26namespace boost {
27namespace test_tools {
28
29namespace fpc = math::fpc;
30
31// ************************************************************************** //
32// ************** floating point comparison tolerance ************** //
33// ************************************************************************** //
34
35template<typename FPT>
36inline FPT&
37fpc_tolerance()
38{
39 static FPT s_value = 0;
40 return s_value;
41}
42
43//____________________________________________________________________________//
44
45template<typename FPT>
46struct 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
58private:
59 // Data members
60 FPT m_old_tolerance;
61};
62
63//____________________________________________________________________________//
64
65} // namespace test_tools
66
67// ************************************************************************** //
68// ************** decorator::tolerance ************** //
69// ************************************************************************** //
70
71namespace unit_test {
72namespace decorator {
73
74template<typename FPT>
75inline fixture_t
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
84template<typename FPT>
85inline fixture_t
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
96using 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