APRONXX  0.9.7
/builddir/build/BUILD/apron-0.9.10/apronxx/apxx_scalar.hh
Go to the documentation of this file.
1 /* -*- C++ -*-
2  * apxx_scalar.hh
3  *
4  * APRON Library / C++ class wrappers
5  *
6  * Copyright (C) Antoine Mine' 2007
7  *
8  */
9 /* This file is part of the APRON Library, released under LGPL license
10  with an exception allowing the redistribution of statically linked
11  executables.
12 
13  Please read the COPYING file packaged in the distribution.
14 */
15 
16 #ifndef __APXX_SCALAR_HH
17 #define __APXX_SCALAR_HH
18 
19 #include <stdlib.h>
20 #include <iostream>
21 
22 #include "ap_scalar.h"
23 #include "gmpxx.h"
24 
25 
26 namespace apron {
27 
28 
30 struct infty {
31 
32  int sgn;
33 
35  infty(int sgn=1) : sgn(sgn) {};
36 
37 };
38 
39 
41 struct frac {
42 
43  long num;
44  unsigned long den;
45 
49  frac(long num, unsigned long den=1) : num(num), den(den) {}
50 
51 };
52 
53 
55 class bad_discriminant : public std::logic_error {
56 public:
59  bad_discriminant(const std::string &arg) : logic_error(arg) {}
60 };
61 
62 
63 /* ================================= */
64 /* use_malloc */
65 /* ================================= */
66 
67 
69 struct use_malloc {
70  void* operator new (size_t sz);
71  void* operator new[] (size_t sz);
72  void operator delete (void* p);
73  void operator delete[](void* p);
74 };
75 
76 
77 
78 /* ================================= */
79 /* scalar */
80 /* ================================= */
81 
82 
89 class scalar : public use_malloc {
90 
91 protected:
92  ap_scalar_t c;
93 
94 public:
95 
97  enum order {
98  LESS = -1,
99  EQUAL = 0,
100  GREATER = 1,
101  };
102 
103 
104  /* constructors */
105  /* ============ */
106 
109 
111  scalar();
112 
114  scalar(int x);
115 
117  scalar(long x);
118 
120  scalar(double x);
121 
123  scalar(const frac& x);
124 
126  scalar(infty x);
127 
129  scalar(const mpq_class& x);
130 
132  scalar(mpfr_t x);
133 
135  scalar(const scalar& x);
136 
138 
139 
140  /* destructor */
141  /* ========== */
142 
145 
146  ~scalar();
147 
150 
151  /* assignments */
152  /* =========== */
153 
156 
158  scalar& operator= (int x);
159 
161  scalar& operator= (long x);
162 
164  scalar& operator= (double x);
165 
167  scalar& operator= (const frac& x);
168 
170  scalar& operator= (infty x);
171 
173  scalar& operator= (const mpq_class& x);
174 
176  scalar& operator= (mpfr_t x);
177 
179  scalar& operator= (const scalar& x);
180 
182  friend void swap(scalar& a, scalar &b);
183 
186 
187  /* access */
188  /* ====== */
189 
192 
197  ap_scalar_discr_t get_discr() const;
198 
203  double& get_double();
204 
209  const double& get_double() const;
210 
215  mpq_class& get_mpq();
216 
221  const mpq_class& get_mpq() const;
222 
224 
225 
226  /* conversion */
227  /* ========== */
228 
231 
239  mpq_class to_mpq(mp_rnd_t round, order& conv) const;
247  double to_double(mp_rnd_t round, order& conv) const;
248 
255  void to_mpfr(mpfr_t x, mp_rnd_t round, order& conv) const;
258  operator mpq_class() const;
259 
261  operator double() const;
262 
264 
265 
266  /* print */
267  /* ===== */
268 
271 
273  friend std::ostream& operator<< (std::ostream& os, const scalar& s);
274 
276  void print(FILE* stream=stdout) const;
277 
279 
280 
281  /* tests */
282  /* ===== */
283 
286 
288  order is_infty() const;
289 
291  order sgn () const;
292 
294  friend order cmp(const scalar& a, const scalar& b);
295 
296  friend bool operator>=(const scalar& a, const scalar& b);
297  friend bool operator<=(const scalar& a, const scalar& b);
298  friend bool operator> (const scalar& a, const scalar& b);
299  friend bool operator< (const scalar& a, const scalar& b);
300  friend bool operator==(const scalar& a, const scalar& b);
301  friend bool operator!=(const scalar& a, const scalar& b);
302 
303  friend order cmp(const scalar& a, int b);
304  friend bool operator>=(const scalar& a, int b);
305  friend bool operator<=(const scalar& a, int b);
306  friend bool operator> (const scalar& a, int b);
307  friend bool operator< (const scalar& a, int b);
308  friend bool operator==(const scalar& a, int b);
309  friend bool operator!=(const scalar& a, int b);
310 
311  friend order cmp(int a, const scalar& b);
312  friend bool operator>=(int a, const scalar& b);
313  friend bool operator<=(int a, const scalar& b);
314  friend bool operator> (int a, const scalar& b);
315  friend bool operator< (int a, const scalar& b);
316  friend bool operator==(int a, const scalar& b);
317  friend bool operator!=(int a, const scalar& b);
318 
320 
321 
322  /* other operators */
323  /* =============== */
324 
329  void neg();
330 
333 
335  void inv();
336 
338  scalar operator~ () const;
339 
341  long hash() const;
342 
344 
345 
346  /* C API compatibility */
347  /* =================== */
351 
353  const ap_scalar_t* get_ap_scalar_t() const;
354 
356  ap_scalar_t* get_ap_scalar_t();
357 
359 
360 };
361 
362 
364 
365 }
366 
367 #endif /* __APXX_SCALAR_HH */
Definition: apxx_abstract0.hh:27
unsigned long den
Denominator.
Definition: apxx_scalar.hh:44
Exception raised when an operation is incompatible with a discriminant.
Definition: apxx_scalar.hh:55
std::ostream & operator<<(std::ostream &os, const abstract0 &s)
Definition: apxx_abstract0.hh:293
void swap(coeff &a, coeff &b)
Definition: apxx_coeff.hh:382
texpr0::builder neg(const texpr0::builder &a, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0.hh:814
int cmp(const coeff &a, const coeff &b)
Definition: apxx_coeff.hh:415
Either +oo or -oo, to simplify initialisations and assignments.
Definition: apxx_scalar.hh:30
texpr0::builder operator-(const texpr0::builder &a)
Definition: apxx_texpr0.hh:854
~scalar()
Definition: apxx_scalar.hh:114
bool operator==(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:410
bool operator>(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:434
frac(long num, unsigned long den=1)
Definition: apxx_scalar.hh:49
order
Returned by ordering functions.
Definition: apxx_scalar.hh:97
bad_discriminant(const std::string &arg)
Definition: apxx_scalar.hh:59
bool operator>=(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:429
bool operator!=(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:417
Inherited by most wrappers to map new and delete to malloc and free.
Definition: apxx_scalar.hh:69
infty(int sgn=1)
Definition: apxx_scalar.hh:35
A fraction with native int coefficients, to simplify initialisations and assignments.
Definition: apxx_scalar.hh:41
long num
Numerator.
Definition: apxx_scalar.hh:43
int sgn
Sign: >0 for +oo, <0 for -oo.
Definition: apxx_scalar.hh:32
ap_scalar_discr_t get_discr() const
Whether the object wraps a double or a MPQ.
Definition: apxx_scalar.hh:185
bool operator<=(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:422
bool operator<(const abstract0 &x, const abstract0 &y)
Definition: apxx_abstract0.hh:439
Scalar (ap_scalar_t wrapper).
Definition: apxx_scalar.hh:89