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