1 /* Declaration of Rounding_Dir and related functions.
2    Copyright (C) 2001-2010 Roberto Bagnara <bagnara@cs.unipr.it>
3    Copyright (C) 2010-2016 BUGSENG srl (http://bugseng.com)
4 
5 This file is part of the Parma Polyhedra Library (PPL).
6 
7 The PPL is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 The PPL is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software Foundation,
19 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
20 
21 For the most up-to-date information see the Parma Polyhedra Library
22 site: http://bugseng.com/products/ppl/ . */
23 
24 #ifndef PPL_Rounding_defs_hh
25 #define PPL_Rounding_defs_hh 1
26 
27 #include "Result_defs.hh"
28 #include "fpu_defs.hh"
29 
30 namespace Parma_Polyhedra_Library {
31 
32 //! Rounding directions for arithmetic computations.
33 /*! \ingroup PPL_CXX_interface */
34 enum Rounding_Dir {
35   /*! \hideinitializer
36     Round toward \f$-\infty\f$.
37   */
38   ROUND_DOWN = 0U,
39 
40   /*! \hideinitializer
41     Round toward \f$+\infty\f$.
42   */
43   ROUND_UP = 1U,
44 
45   /*! \hideinitializer
46     Rounding is delegated to lower level. Result info is evaluated lazily.
47   */
48   ROUND_IGNORE = 6U,
49   ROUND_NATIVE = ROUND_IGNORE,
50 
51   /*! \hideinitializer
52     Rounding is not needed: client code must ensure that the operation
53     result is exact and representable in the destination type.
54     Result info is evaluated lazily.
55   */
56   ROUND_NOT_NEEDED = 7U,
57 
58   ROUND_DIRECT = ROUND_UP,
59   ROUND_INVERSE = ROUND_DOWN,
60 
61   ROUND_DIR_MASK = 7U,
62 
63   /*! \hideinitializer
64     The client code is willing to pay an extra price to know the exact
65     relation between the exact result and the computed one.
66    */
67   ROUND_STRICT_RELATION = 8U,
68 
69   ROUND_CHECK = ROUND_DIRECT | ROUND_STRICT_RELATION
70 };
71 
72 //! \name Functions Inspecting and/or Combining Rounding_Dir Values
73 //@{
74 
75 /*! \ingroup PPL_CXX_interface */
76 Rounding_Dir operator&(Rounding_Dir x, Rounding_Dir y);
77 
78 /*! \ingroup PPL_CXX_interface */
79 Rounding_Dir operator|(Rounding_Dir x, Rounding_Dir y);
80 
81 /*! \ingroup PPL_CXX_interface \brief
82   Returns the inverse rounding mode of \p dir,
83   <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
84 */
85 Rounding_Dir inverse(Rounding_Dir dir);
86 
87 /*! \ingroup PPL_CXX_interface */
88 Rounding_Dir round_dir(Rounding_Dir dir);
89 
90 /*! \ingroup PPL_CXX_interface */
91 bool round_down(Rounding_Dir dir);
92 
93 /*! \ingroup PPL_CXX_interface */
94 bool round_up(Rounding_Dir dir);
95 
96 /*! \ingroup PPL_CXX_interface */
97 bool round_ignore(Rounding_Dir dir);
98 
99 /*! \ingroup PPL_CXX_interface */
100 bool round_not_needed(Rounding_Dir dir);
101 
102 /*! \ingroup PPL_CXX_interface */
103 bool round_not_requested(Rounding_Dir dir);
104 
105 /*! \ingroup PPL_CXX_interface */
106 bool round_direct(Rounding_Dir dir);
107 
108 /*! \ingroup PPL_CXX_interface */
109 bool round_inverse(Rounding_Dir dir);
110 
111 /*! \ingroup PPL_CXX_interface */
112 bool round_strict_relation(Rounding_Dir dir);
113 
114 /*! \ingroup PPL_CXX_interface */
115 fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir);
116 
117 //@} // Functions Inspecting and/or Combining Rounding_Dir Values
118 
119 } // namespace Parma_Polyhedra_Library
120 
121 #include "Rounding_Dir_inlines.hh"
122 
123 #endif // !defined(PPL_Float_defs_hh)
124 
125