22 inline void* use_malloc::operator
new(
size_t sz)
25 if (!x)
throw std::bad_alloc();
29 inline void* use_malloc::operator
new[](
size_t sz)
32 if (!x)
throw std::bad_alloc();
36 inline void use_malloc::operator
delete(
void* p)
41 inline void use_malloc::operator
delete[](
void* p)
56 inline scalar::scalar()
58 ap_scalar_init(&c, AP_SCALAR_DOUBLE);
61 inline scalar::scalar(
int x)
63 ap_scalar_init(&c, AP_SCALAR_MPQ);
64 ap_scalar_set_int(&c, x);
67 inline scalar::scalar(
long x)
69 ap_scalar_init(&c, AP_SCALAR_MPQ);
70 ap_scalar_set_int(&c, x);
73 inline scalar::scalar(
double x)
75 ap_scalar_init(&c, AP_SCALAR_DOUBLE);
76 ap_scalar_set_double(&c, x);
79 inline scalar::scalar(
const frac& x)
81 ap_scalar_init(&c, AP_SCALAR_MPQ);
82 ap_scalar_set_frac(&c, x.num, x.den);
85 inline scalar::scalar(infty x)
87 ap_scalar_init(&c, AP_SCALAR_DOUBLE);
88 ap_scalar_set_infty(&c, x.sgn);
91 inline scalar::scalar(
const mpq_class& x)
93 ap_scalar_init(&c, AP_SCALAR_MPQ);
94 ap_scalar_set_mpq(&c, const_cast<mpq_class&>(x).get_mpq_t());
97 inline scalar::scalar(mpfr_t x)
99 ap_scalar_init(&c, AP_SCALAR_MPFR);
100 ap_scalar_set_mpfr(&c,x);
103 inline scalar::scalar(
const scalar& x)
105 ap_scalar_init(&c, x.c.discr);
106 ap_scalar_set(&c, const_cast<ap_scalar_t*>(&x.c));
113 inline scalar::~scalar()
124 inline scalar& scalar::operator= (
int x)
126 ap_scalar_set_int(&c, x);
130 inline scalar& scalar::operator= (
long x)
132 ap_scalar_set_int(&c, x);
136 inline scalar& scalar::operator= (
double x)
138 ap_scalar_set_double(&c, x);
142 inline scalar& scalar::operator= (
const frac& x)
144 ap_scalar_set_frac(&c, x.num, x.den);
148 inline scalar& scalar::operator= (infty x)
150 ap_scalar_set_infty(&c, x.sgn);
154 inline scalar& scalar::operator= (
const mpq_class& x)
156 ap_scalar_set_mpq(&c, const_cast<mpq_class&>(x).get_mpq_t());
160 inline scalar& scalar::operator= (mpfr_t x)
162 ap_scalar_set_mpfr(&c, x);
166 inline scalar& scalar::operator= (
const scalar& x)
168 ap_scalar_set(&c, const_cast<ap_scalar_t*>(&x.c));
175 inline void swap(scalar& a, scalar &b)
177 ap_scalar_swap(&a.c, &b.c);
184 inline ap_scalar_discr_t scalar::get_discr()
const 189 inline double& scalar::get_double()
191 if (c.discr!=AP_SCALAR_DOUBLE)
throw(bad_discriminant(
"apron::scalar::get_double()"));
195 inline const double& scalar::get_double()
const 197 if (c.discr!=AP_SCALAR_DOUBLE)
throw(bad_discriminant(
"apron::scalar::get_double()"));
201 inline mpq_class& scalar::get_mpq()
203 if (c.discr!=AP_SCALAR_MPQ)
throw(bad_discriminant(
"apron::scalar::get_mpq()"));
204 return reinterpret_cast<mpq_class&>(*c.val.mpq);
207 inline const mpq_class& scalar::get_mpq()
const 209 if (c.discr!=AP_SCALAR_MPQ)
throw(bad_discriminant(
"apron::scalar::get_mpq()"));
210 return reinterpret_cast<mpq_class&>(*c.val.mpq);
217 inline mpq_class scalar::to_mpq(mp_rnd_t round, order& conv)
const 220 int o = ap_mpq_set_scalar(r.get_mpq_t(), const_cast<ap_scalar_t*>(&c), round);
221 conv = (o>0) ? GREATER : (o<0) ? LESS : EQUAL;
225 inline double scalar::to_double(mp_rnd_t round, order& conv)
const 228 int o = ap_double_set_scalar(&r, const_cast<ap_scalar_t*>(&c), round);
229 conv = (o>0) ? GREATER : (o<0) ? LESS : EQUAL;
233 inline void scalar::to_mpfr(mpfr_t r, mp_rnd_t round, order& conv)
const 235 int o = ap_mpfr_set_scalar(r, const_cast<ap_scalar_t*>(&c), round);
236 conv = (o>0) ? GREATER : (o<0) ? LESS : EQUAL;
239 inline scalar::operator mpq_class()
const 242 return to_mpq(GMP_RNDN, c);
245 inline scalar::operator double()
const 248 return to_double(GMP_RNDN, c);
255 inline std::ostream&
operator<< (std::ostream& os,
const scalar& s)
257 int i = ap_scalar_infty(const_cast<ap_scalar_t*>(&s.c));
258 if (i>0)
return os <<
"+oo";
259 if (i<0)
return os <<
"-oo";
261 case AP_SCALAR_DOUBLE:
return os << s.c.val.dbl;
262 case AP_SCALAR_MPQ:
return os << s.c.val.mpq;
265 double d = mpfr_get_d(s.c.val.mpfr,GMP_RNDU);
266 if (!mpfr_cmp_d(s.c.val.mpfr,d))
return os << d;
268 char* tmp = mpfr_get_str(NULL,&e,10,os.precision(),s.c.val.mpfr,GMP_RNDU);
269 if (tmp[0]==
'-' || tmp[0]==
'+') {
270 os << tmp[0] <<
"." << tmp+1;
271 if (e>0) os <<
"e+" << e;
272 if (e<0) os <<
"e" << e;
276 if (e>0) os <<
"e+" << e;
277 if (e<0) os <<
"e" << e;
286 inline void scalar::print(FILE* stream)
const 288 ap_scalar_fprint(stream, const_cast<ap_scalar_t*>(&c));
295 inline scalar::order scalar::is_infty()
const 297 return (order) ap_scalar_infty(const_cast<ap_scalar_t*>(&c));
300 inline scalar::order scalar::sgn ()
const 302 return (order) ap_scalar_sgn(const_cast<ap_scalar_t*>(&c));
306 inline scalar::order
cmp(
const scalar& a,
const scalar& b)
308 return (scalar::order) ap_scalar_cmp(const_cast<ap_scalar_t*>(&a.c), const_cast<ap_scalar_t*>(&b.c));
313 return ap_scalar_cmp(const_cast<ap_scalar_t*>(&a.c), const_cast<ap_scalar_t*>(&b.c))>=0;
318 return ap_scalar_cmp(const_cast<ap_scalar_t*>(&a.c), const_cast<ap_scalar_t*>(&b.c))<=0;
323 return ap_scalar_cmp(const_cast<ap_scalar_t*>(&a.c), const_cast<ap_scalar_t*>(&b.c))>0;
328 return ap_scalar_cmp(const_cast<ap_scalar_t*>(&a.c), const_cast<ap_scalar_t*>(&b.c))<0;
333 return ap_scalar_equal(const_cast<ap_scalar_t*>(&a.c), const_cast<ap_scalar_t*>(&b.c));
338 return !ap_scalar_equal(const_cast<ap_scalar_t*>(&a.c), const_cast<ap_scalar_t*>(&b.c));
342 inline scalar::order
cmp(
const scalar& a,
int b)
344 return (scalar::order) ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&a.c), b);
349 return ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&a.c), b)>=0;
354 return ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&a.c), b)<=0;
359 return ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&a.c), b)>0;
364 return ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&a.c), b)<0;
369 return ap_scalar_equal_int(const_cast<ap_scalar_t*>(&a.c), b);
374 return !ap_scalar_equal_int(const_cast<ap_scalar_t*>(&a.c), b);
377 inline scalar::order
cmp(
int a,
const scalar& b)
379 return (scalar::order) ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&b.c), a);
384 return ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&b.c), a)<=0;
389 return ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&b.c), a)>=0;
394 return ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&b.c), a)<0;
399 return ap_scalar_cmp_int(const_cast<ap_scalar_t*>(&b.c), a)>0;
404 return ap_scalar_equal_int(const_cast<ap_scalar_t*>(&b.c), a);
409 return !ap_scalar_equal_int(const_cast<ap_scalar_t*>(&b.c), a);
418 ap_scalar_neg(&c, &c);
428 inline void scalar::inv()
430 ap_scalar_inv(&c, &c);
433 inline scalar scalar::operator~ ()
const 440 inline long scalar::hash()
const 442 return ap_scalar_hash(const_cast<ap_scalar_t*>(&c));
449 inline const ap_scalar_t* scalar::get_ap_scalar_t()
const 454 inline ap_scalar_t* scalar::get_ap_scalar_t()
bool operator==(const scalar &a, const scalar &b)
Definition: apxx_scalar_inline.hh:331
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
void swap(scalar &a, scalar &b)
Definition: apxx_scalar_inline.hh:175
std::ostream & operator<<(std::ostream &os, const scalar &s)
Definition: apxx_scalar_inline.hh:255
texpr0::builder operator-(const texpr0::builder &a)
Definition: apxx_texpr0.hh:854
bool operator<=(const scalar &a, const scalar &b)
Definition: apxx_scalar_inline.hh:316
friend builder neg(const builder &a, ap_texpr_rtype_t rtype, ap_texpr_rdir_t rdir)
Makes an AP_TEXPR_NEG expression node.
Definition: apxx_texpr0.hh:814
bool operator<(const scalar &a, const scalar &b)
Definition: apxx_scalar_inline.hh:326
bool operator>=(const scalar &a, const scalar &b)
Definition: apxx_scalar_inline.hh:311
scalar::order cmp(const scalar &a, const scalar &b)
Definition: apxx_scalar_inline.hh:306
bool operator!=(const scalar &a, const scalar &b)
Definition: apxx_scalar_inline.hh:336
bool operator>(const scalar &a, const scalar &b)
Definition: apxx_scalar_inline.hh:321