• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Boost interval/rounding.hpp template implementation file
2  *
3  * Copyright 2002-2003 Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * (See accompanying file LICENSE_1_0.txt or
7  * copy at http://www.boost.org/LICENSE_1_0.txt)
8  */
9 
10 #ifndef BOOST_NUMERIC_INTERVAL_ROUNDING_HPP
11 #define BOOST_NUMERIC_INTERVAL_ROUNDING_HPP
12 
13 namespace boost {
14 namespace numeric {
15 namespace interval_lib {
16 
17 /*
18  * Default rounding_control class (does nothing)
19  */
20 
21 template<class T>
22 struct rounding_control
23 {
24   typedef int rounding_mode;
get_rounding_modeboost::numeric::interval_lib::rounding_control25   static void get_rounding_mode(rounding_mode&) {}
set_rounding_modeboost::numeric::interval_lib::rounding_control26   static void set_rounding_mode(rounding_mode)  {}
upwardboost::numeric::interval_lib::rounding_control27   static void upward()     {}
downwardboost::numeric::interval_lib::rounding_control28   static void downward()   {}
to_nearestboost::numeric::interval_lib::rounding_control29   static void to_nearest() {}
to_intboost::numeric::interval_lib::rounding_control30   static const T& to_int(const T& x)         { return x; }
force_roundingboost::numeric::interval_lib::rounding_control31   static const T& force_rounding(const T& x) { return x; }
32 };
33 
34 /*
35  * A few rounding control classes (exact/std/opp: see documentation)
36  *   rounded_arith_* control the rounding of the arithmetic operators
37  *   rounded_transc_* control the rounding of the transcendental functions
38  */
39 
40 template<class T, class Rounding = rounding_control<T> >
41 struct rounded_arith_exact;
42 
43 template<class T, class Rounding = rounding_control<T> >
44 struct rounded_arith_std;
45 
46 template<class T, class Rounding = rounding_control<T> >
47 struct rounded_arith_opp;
48 
49 template<class T, class Rounding>
50 struct rounded_transc_dummy;
51 
52 template<class T, class Rounding = rounded_arith_exact<T> >
53 struct rounded_transc_exact;
54 
55 template<class T, class Rounding = rounded_arith_std<T> >
56 struct rounded_transc_std;
57 
58 template<class T, class Rounding = rounded_arith_opp<T> >
59 struct rounded_transc_opp;
60 
61 /*
62  * State-saving classes: allow to set and reset rounding control
63  */
64 
65 namespace detail {
66 
67 template<class Rounding>
68 struct save_state_unprotected: Rounding
69 {
70   typedef save_state_unprotected<Rounding> unprotected_rounding;
71 };
72 
73 } // namespace detail
74 
75 template<class Rounding>
76 struct save_state: Rounding
77 {
78   typename Rounding::rounding_mode mode;
save_stateboost::numeric::interval_lib::save_state79   save_state() {
80     this->get_rounding_mode(mode);
81     this->init();
82   }
~save_stateboost::numeric::interval_lib::save_state83   ~save_state() { this->set_rounding_mode(mode); }
84   typedef detail::save_state_unprotected<Rounding> unprotected_rounding;
85 };
86 
87 template<class Rounding>
88 struct save_state_nothing: Rounding
89 {
90   typedef save_state_nothing<Rounding> unprotected_rounding;
91 };
92 
93 template<class T>
94 struct rounded_math: save_state_nothing<rounded_arith_exact<T> >
95 {};
96 
97 } // namespace interval_lib
98 } // namespace numeric
99 } // namespace boost
100 
101 #endif // BOOST_NUMERIC_INTERVAL_ROUNDING_HPP
102