APRONXX  0.9.12
/builddir/build/BUILD/apron-0.9.13/apronxx/apxx_texpr0_inline.hh
Go to the documentation of this file.
1 /* -*- C++ -*-
2  * apxx_texpr0_inline.hh
3  *
4  * APRON Library / C++ inline functions
5  *
6  * DO NOT INCLUDE THIS FILE DIRECTLY
7  *
8  * Copyright (C) Antoine Mine' 2007
9  *
10  */
11 /* This file is part of the APRON Library, released under LGPL license
12  with an exception allowing the redistribution of statically linked
13  executables.
14 
15  Please read the COPYING file packaged in the distribution.
16 */
17 
18 
19 inline dim::dim(ap_dim_t d) : d(d)
20 {}
21 
22 inline dim::dim(const environment& e, const var& v)
23 {
24  ap_dim_t d = ap_environment_dim_of_var(const_cast<ap_environment_t*>(e.get_ap_environment_t()),
25  v.get_ap_var_t());
26  if (d==AP_DIM_MAX)
27  throw std::invalid_argument("apron::dim::dim(const environment&, const var&) invalid variable name");
28 }
29 
30 
31 
32 inline bool is_unop(ap_texpr_op_t op)
33 {
34  return ap_texpr_is_unop(op);
35 }
36 
37 inline bool is_binop(ap_texpr_op_t op)
38 {
39  return ap_texpr_is_binop(op);
40 }
41 
42 
43 /* ================================= */
44 /* texpr0 */
45 /* ================================= */
46 
47 inline void texpr0::init_from(ap_texpr0_t* x)
48 {
49  l = *x;
50  free(x);
51 }
52 
53 inline texpr0::texpr0(ap_texpr0_t* x)
54 { init_from(x); }
55 
56 inline texpr0::texpr0(const builder& x)
57 { init_from(ap_texpr0_copy(const_cast<ap_texpr0_t*>(x.get_ap_texpr0_t()))); }
58 
60 { init_from(ap_texpr0_copy(const_cast<ap_texpr0_t*>(x.get_ap_texpr0_t()))); }
61 
62 inline texpr0::texpr0(const texpr0& x)
63 { init_from(ap_texpr0_copy(const_cast<ap_texpr0_t*>(&x.l))); }
64 
65 
66 /* linear expression */
67 
68 inline texpr0::texpr0(const linexpr0& l)
69 { init_from(ap_texpr0_from_linexpr0(const_cast<ap_linexpr0_t*>(l.get_ap_linexpr0_t()))); }
70 
71 
72 /* change of dimension */
73 
74 inline texpr0::texpr0(const texpr0& x, const dimchange& d, bool add)
75 {
76  if (add)
77  init_from(ap_texpr0_add_dimensions(const_cast<ap_texpr0_t*>(&x.l),
78  const_cast<ap_dimchange_t*>(d.get_ap_dimchange_t())));
79  else
80  init_from(ap_texpr0_remove_dimensions(const_cast<ap_texpr0_t*>(&x.l),
81  const_cast<ap_dimchange_t*>(d.get_ap_dimchange_t())));
82 }
83 
84 inline texpr0::texpr0(const texpr0& x, const dimperm& d)
85 {
86  init_from(ap_texpr0_permute_dimensions(const_cast<ap_texpr0_t*>(&x.l),
87  const_cast<ap_dimperm_t*>(d.get_ap_dimperm_t())));
88 }
89 
90 inline texpr0::texpr0(const texpr0& x, ap_dim_t dim, const texpr0& dst)
91 {
92  init_from(ap_texpr0_substitute(const_cast<ap_texpr0_t*>(&x.l),
93  dim, const_cast<ap_texpr0_t*>(&dst.l)));
94 }
95 
96 
97 /* destructor */
98 /* ========== */
99 
100 /* (deep) destruction */
101 
103 {
104  ap_texpr0_clear(&l);
105 }
106 
107 
108 /* assignment */
109 /* ========== */
110 
111 /* (deep) copy */
112 
113 
115 {
116  // copy first, as x.l may alias this!
117  ap_texpr0_t* c = ap_texpr0_copy(const_cast<ap_texpr0_t*>(x.get_ap_texpr0_t()));
118  ap_texpr0_clear(&l);
119  init_from(c);
120  return *this;
121 }
122 
124 {
125  // copy first, as x.l may alias this!
126  ap_texpr0_t* c = ap_texpr0_copy(const_cast<ap_texpr0_t*>(&x.l));
127  ap_texpr0_clear(&l);
128  init_from(c);
129  return *this;
130 }
131 
133 {
134  // copy first, as x.l may alias this!
135  ap_texpr0_t* c = ap_texpr0_copy(const_cast<ap_texpr0_t*>(x.get_ap_texpr0_t()));
136  ap_texpr0_clear(&l);
137  init_from(c);
138  return *this;
139 }
140 
142 {
143  ap_texpr0_clear(&l);
144  init_from(ap_texpr0_from_linexpr0(const_cast<ap_linexpr0_t*>(x.get_ap_linexpr0_t())));
145  return *this;
146 }
147 
148 
149 /* print */
150 /* ===== */
151 
152 inline std::ostream& operator<< (std::ostream& os, const texpr0& s)
153 {
154  return os << s.root();
155 }
156 
157 inline void texpr0::print(char** name_of_dim, FILE* stream) const
158 {
159  root().print(name_of_dim,stream);
160 }
161 
162 
163 /* tests, size */
164 /* =========== */
165 
166 inline bool texpr0::is_zero() const
167 {
168  return root().is_zero();
169 }
170 
171 inline bool texpr0::equal(const texpr0& x) const
172 {
173  return root().equal(x);
174 }
175 
176 inline size_t texpr0::depth() const
177 {
178  return root().depth();
179 }
180 
181 inline size_t texpr0::size() const
182 {
183  return root().size();
184 }
185 
186 inline ap_dim_t texpr0::max_dim() const
187 {
188  return root().max_dim();
189 }
190 
191 inline bool texpr0::has_dim(ap_dim_t d) const
192 {
193  return root().has_dim(d);
194 }
195 
196 inline std::vector<ap_dim_t> texpr0::dimlist() const
197 {
198  return root().dimlist();
199 }
200 
201 inline bool texpr0::is_interval_cst() const
202 {
203  return root().is_interval_cst();
204 }
205 
206 inline bool texpr0::is_interval_linear() const
207 {
208  return root().is_interval_linear();
209 }
210 
212 {
213  return root().is_interval_polynomial();
214 }
215 
216 inline bool texpr0::is_interval_polyfrac() const
217 {
218  return root().is_interval_polyfrac();
219 }
220 
221 inline bool texpr0::is_scalar() const
222 {
223  return root().is_scalar();
224 }
225 
226 
227 /* operations */
228 /* ========== */
229 
230 inline void texpr0::substitute(ap_dim_t dim, const texpr0& dst)
231 {
232  ap_texpr0_substitute_with(&l,dim,const_cast<ap_texpr0_t*>(&dst.l));
233 }
234 
235 #if 0
236 inline interval texpr0::eval(manager& m, const abstract0& a, ap_scalar_discr_t discr,
237  bool* pexact) const
238 {
239  bool b;
240  if (!pexact) pexact = &b;
241  return
242  ap_eval_texpr0(m.get_ap_manager_t(),
243  const_cast<ap_abstract0_t*>(a.get_ap_abstract0_t()),
244  const_cast<ap_texpr0_t*>(l),
245  discr, pexact);
246 }
247 
248 inline linexpr0 texpr0::intlinearize(manager& m, const abstract0& a, ap_scalar_discr_t discr,
249  bool quasilinearize, bool* pexact) const
250 {
251  bool b;
252  if (!pexact) pexact = &b;
253  return
254  ap_intlinearize_texpr0(m.get_ap_manager_t(),
255  const_cast<ap_abstract0_t*>(a.get_ap_abstract0_t()),
256  const_cast<ap_texpr0_t*>(l),
257  pexact, discr, quasilinearize);
258 }
259 #endif
260 
261 inline long texpr0::hash() const
262 {
263  return ap_texpr0_hash(const_cast<ap_texpr0_t*>(&l));
264 }
265 
266 
267 
268 /* change of dimension */
269 /* =================== */
270 
271 
272 inline void texpr0::add_dimensions(const dimchange& d)
273 {
274  ap_texpr0_add_dimensions_with(&l, const_cast<ap_dimchange_t*>(d.get_ap_dimchange_t()));
275 }
276 
277 
279 {
280  ap_texpr0_remove_dimensions_with(&l, const_cast<ap_dimchange_t*>(d.get_ap_dimchange_t()));
281 }
282 
283 inline void texpr0::permute_dimensions(const dimperm& d)
284 {
285  ap_texpr0_permute_dimensions_with(&l, const_cast<ap_dimperm_t*>(d.get_ap_dimperm_t()));
286 }
287 
288 
289 
290 /* C-level compatibility */
291 /* ===================== */
292 
293 inline ap_texpr0_t* texpr0::get_ap_texpr0_t()
294 {
295  return &l;
296 }
297 
298 inline const ap_texpr0_t* texpr0::get_ap_texpr0_t() const
299 {
300  return &l;
301 }
302 
303 
304 
305 
306 
307 /* ================================= */
308 /* iterator */
309 /* ================================= */
310 
311 
312 /* constructors */
313 /* ============ */
314 
316 {
317  return const_iterator(const_cast<ap_texpr0_t*>(&l));
318 }
319 
320 inline texpr0::const_iterator::const_iterator(ap_texpr0_t* l) : l(l)
321 {}
322 
323 
325  : l(const_cast<ap_texpr0_t*>(e.get_ap_texpr0_t()))
326 {}
327 
329 {}
330 
331 
332 /* access */
333 /* ====== */
334 
335 inline ap_texpr_discr_t texpr0::const_iterator::get_discr() const
336 {
337  return l->discr;
338 }
339 
341 {
342  if (l->discr!=AP_TEXPR_CST) throw(bad_discriminant("apron::texpr0::const_iterator::get_coeff()"));
343  return reinterpret_cast<coeff&>(l->val.cst);
344 }
345 
346 inline ap_dim_t texpr0::const_iterator::get_dim() const
347 {
348  if (l->discr!=AP_TEXPR_DIM) throw(bad_discriminant("apron::texpr0::const_iterator::get_dim()"));
349  return l->val.dim;
350 }
351 
352 inline ap_texpr_op_t texpr0::const_iterator::get_op() const
353 {
354  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::const_iterator::get_op()"));
355  return l->val.node->op;
356 }
357 
358 inline ap_texpr_rtype_t texpr0::const_iterator::get_rtype() const
359 {
360  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::const_iterator::get_type()"));
361  return l->val.node->type;
362 }
363 
364 inline ap_texpr_rdir_t texpr0::const_iterator::get_rdir() const
365 {
366  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::const_iterator::get_dir()"));
367  return l->val.node->dir;
368 }
369 
370 
371 /* traversal */
372 /* ========= */
373 
375 {
376  l = i.l;
377  return *this;
378 }
379 
381 {
382  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::const_iterator::child()"));
383  if (!l->val.node->exprA) throw(std::out_of_range("apron::texpr0::const_iterator::child()"));
384  return l->val.node->exprA;
385 }
386 
388 {
389  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::const_iterator::left()"));
390  if (!l->val.node->exprA) throw(std::out_of_range("apron::texpr0::const_iterator::left()"));
391  return l->val.node->exprA;
392 }
393 
395 {
396  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::const_iterator::right()"));
397  if (!l->val.node->exprB) throw(std::out_of_range("apron::texpr0::const_iterator::right()"));
398  return l->val.node->exprB;
399 }
400 
401 
402 /* print */
403 /* ===== */
404 
405 extern void apxx_texpr0_ostream(std::ostream& os, ap_texpr0_t* a,
406  std::vector<std::string>* names);
407 
408 inline std::ostream& operator<< (std::ostream& os, const texpr0::const_iterator& s)
409 {
410  apxx_texpr0_ostream(os, const_cast<ap_texpr0_t*>(s.l), get_varname(os));
411  return os;
412 }
413 
414 inline void texpr0::const_iterator::print(char** name_of_dim, FILE* stream) const
415 {
416  ap_texpr0_fprint(stream, const_cast<ap_texpr0_t*>(l), name_of_dim);
417 }
418 
419 
420 /* tests, size */
421 /* =========== */
422 
424 {
425  return l->discr==AP_TEXPR_CST && ap_coeff_zero(&const_cast<ap_texpr0_t*>(l)->val.cst);
426 }
427 
428 inline bool texpr0::const_iterator::equal(const texpr0& x) const
429 {
430  return ap_texpr0_equal(const_cast<ap_texpr0_t*>(l),
431  const_cast<ap_texpr0_t*>(x.get_ap_texpr0_t()));
432 }
433 
434 inline size_t texpr0::const_iterator::depth() const
435 {
436  return ap_texpr0_depth(const_cast<ap_texpr0_t*>(l));
437 }
438 
439 inline size_t texpr0::const_iterator::size() const
440 {
441  return ap_texpr0_size(const_cast<ap_texpr0_t*>(l));
442 }
443 
444 inline ap_dim_t texpr0::const_iterator::max_dim() const
445 {
446  return ap_texpr0_max_dim(const_cast<ap_texpr0_t*>(l));
447 }
448 
449 inline bool texpr0::const_iterator::has_dim(ap_dim_t d) const
450 {
451  return ap_texpr0_has_dim(const_cast<ap_texpr0_t*>(l), d);
452 }
453 
454 inline std::vector<ap_dim_t> texpr0::const_iterator::dimlist() const
455 {
456  ap_dim_t* d = ap_texpr0_dimlist(const_cast<ap_texpr0_t*>(l));
457  ap_dim_t i;
458  for (i=0; d[i]!=AP_DIM_MAX; i++) ;
459  std::vector<ap_dim_t> r = std::vector<ap_dim_t>(i,0);
460  for (i=0; d[i]!=AP_DIM_MAX; i++) r[i] = d[i];
461  free(d);
462  return r;
463 }
464 
466 {
467  return ap_texpr0_is_interval_cst(const_cast<ap_texpr0_t*>(l));
468 }
469 
471 {
472  return ap_texpr0_is_interval_linear(const_cast<ap_texpr0_t*>(l));
473 }
474 
476 {
477  return ap_texpr0_is_interval_polynomial(const_cast<ap_texpr0_t*>(l));
478 }
479 
481 {
482  return ap_texpr0_is_interval_polyfrac(const_cast<ap_texpr0_t*>(l));
483 }
484 
486 {
487  return ap_texpr0_is_scalar(const_cast<ap_texpr0_t*>(l));
488 }
489 
490 
491 /* C-level compatibility */
492 /* ===================== */
493 
495 {
496  return l;
497 }
498 
499 inline const ap_texpr0_t* texpr0::const_iterator::get_ap_texpr0_t() const
500 {
501  return l;
502 }
503 
504 
505 /* constructors */
506 /* ============ */
507 
509 {
510  return iterator(*this);
511 }
512 
513 inline texpr0::iterator::iterator(ap_texpr0_t* l)
515 {}
516 
517 
520 {}
521 
523  : texpr0::const_iterator(i)
524 {}
525 
526 
527 
528 /* substitution */
529 /* ============ */
530 
532 {
533  ap_texpr0_t* cc = ap_texpr0_copy(const_cast<ap_texpr0_t*>(c.get_ap_texpr0_t()));
534  ap_texpr0_clear(l);
535  *l = *cc;
536  free(cc);
537  return *this;
538 }
539 
540 
541 /* access */
542 /* ====== */
543 
545 {
546  if (l->discr!=AP_TEXPR_CST) throw(bad_discriminant("apron::texpr0::iterator::get_coeff()"));
547  return reinterpret_cast<coeff&>(l->val.cst);
548 }
549 
550 inline ap_dim_t& texpr0::iterator::get_dim() const
551 {
552  if (l->discr!=AP_TEXPR_DIM) throw(bad_discriminant("apron::texpr0::iterator::get_dim()"));
553  return l->val.dim;
554 }
555 
556 inline ap_texpr_op_t& texpr0::iterator::get_op() const
557 {
558  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::iterator::get_op()"));
559  return l->val.node->op;
560 }
561 
562 inline ap_texpr_rtype_t& texpr0::iterator::get_rtype() const
563 {
564  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::iterator::get_type()"));
565  return l->val.node->type;
566 }
567 
568 inline ap_texpr_rdir_t& texpr0::iterator::get_rdir() const
569 {
570  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::iterator::get_dir()"));
571  return l->val.node->dir;
572 }
573 
574 
575 /* traversal */
576 /* ========= */
577 
579 {
580  l = i.l;
581  return *this;
582 }
583 
585 {
586  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::iterator::child()"));
587  if (!l->val.node->exprA) throw(std::out_of_range("apron::texpr0::iterator::child()"));
588  return l->val.node->exprA;
589 }
590 
592 {
593  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::iterator::left()"));
594  if (!l->val.node->exprA) throw(std::out_of_range("apron::texpr0::iterator::left()"));
595  return l->val.node->exprA;
596 }
597 
599 {
600  if (l->discr!=AP_TEXPR_NODE) throw(bad_discriminant("apron::texpr0::iterator::right()"));
601  if (!l->val.node->exprB) throw(std::out_of_range("apron::texpr0::iterator::right()"));
602  return l->val.node->exprB;
603 }
604 
605 
606 /* C-level compatibility */
607 /* ===================== */
608 
610 {
611  return l;
612 }
613 
614 inline const ap_texpr0_t* texpr0::iterator::get_ap_texpr0_t() const
615 {
616  return l;
617 }
618 
619 
620 
621 /* ================================= */
622 /* builder */
623 /* ================================= */
624 
625 
626 inline void texpr0::builder::init_from(ap_texpr0_t* x)
627 {
628  switch (x->discr) {
629  case AP_TEXPR_DIM: l = ap_texpr0_dim(x->val.dim); break;
630  case AP_TEXPR_CST: l = ap_texpr0_cst(const_cast<ap_coeff_t*>(&x->val.cst)); break;
631  case AP_TEXPR_NODE:
632  l = ap_texpr0_node(x->val.node->op,
633  x->val.node->type, x->val.node->dir,
634  x->val.node->exprA, x->val.node->exprB);
635  break;
636  default: throw std::invalid_argument("apron::texpr0::builder::init_from(ap_texpr0_t*) invalid discriminant");
637  }
638 }
639 
640 inline texpr0::builder::builder(ap_texpr0_t* x)
641 {
642  init_from(x);
643 }
644 
646 {
647  init_from(x.l);
648 }
649 
651 {
652  init_from(const_cast<ap_texpr0_t*>(x.get_ap_texpr0_t()));
653 }
654 
656 {
657  init_from(const_cast<ap_texpr0_t*>(x.get_ap_texpr0_t()));
658 }
659 
661  : l(ap_texpr0_cst(const_cast<ap_coeff_t*>(x.get_ap_coeff_t())))
662 {}
663 
665  : l(ap_texpr0_cst_scalar(const_cast<ap_scalar_t*>(x.get_ap_scalar_t())))
666 {}
667 
668 inline texpr0::builder::builder(const mpq_class& x)
669  : l(ap_texpr0_cst_scalar_mpq(const_cast<mpq_class&>(x).get_mpq_t()))
670 {}
671 
672 inline texpr0::builder::builder(mpfr_t x)
673  : l(ap_texpr0_cst_scalar_mpfr(x))
674 {}
675 
677  : l(ap_texpr0_cst_scalar_int(x))
678 {}
679 
681  : l(ap_texpr0_cst_scalar_int(x))
682 {}
683 
684 inline texpr0::builder::builder(double x)
685  : l(ap_texpr0_cst_scalar_double(x))
686 {}
687 
689  : l(ap_texpr0_cst_scalar_frac(x.num, x.den))
690 {}
691 
693  : l(ap_texpr0_cst_interval(const_cast<ap_interval_t*>(x.get_ap_interval_t())))
694 {}
695 
696 inline texpr0::builder::builder(const scalar& inf, const scalar& sup)
697  : l(ap_texpr0_cst_interval_scalar(const_cast<ap_scalar_t*>(inf.get_ap_scalar_t()),
698  const_cast<ap_scalar_t*>(sup.get_ap_scalar_t())))
699 {}
700 
701 inline texpr0::builder::builder(const mpq_class& inf, const mpq_class& sup)
702  : l(ap_texpr0_cst_interval_mpq(const_cast<mpq_class&>(inf).get_mpq_t(),
703  const_cast<mpq_class&>(sup).get_mpq_t()))
704 {}
705 
706 inline texpr0::builder::builder(mpfr_t inf, mpfr_t sup)
707  : l(ap_texpr0_cst_interval_mpfr(inf,sup))
708 {}
709 
710 inline texpr0::builder::builder(int inf, int sup)
711  : l(ap_texpr0_cst_interval_int(inf, sup))
712 {}
713 
714 inline texpr0::builder::builder(long inf, long sup)
715  : l(ap_texpr0_cst_interval_int(inf, sup))
716 {}
717 
718 inline texpr0::builder::builder(double inf, double sup)
719  : l(ap_texpr0_cst_interval_double(inf, sup))
720 {}
721 
722 inline texpr0::builder::builder(const frac& inf, const frac& sup)
723  : l(ap_texpr0_cst_interval_frac(inf.num, inf.den, sup.num, sup.den))
724 {}
725 
727  : l(ap_texpr0_cst_interval_top())
728 {}
729 
731  : l(ap_texpr0_dim(d.d))
732 {}
733 
734 inline texpr0::builder::builder(ap_texpr_op_t op, const builder& argA, ap_texpr_rtype_t rtype, ap_texpr_rdir_t rdir)
735 {
736  if (!ap_texpr_is_unop(op))
737  throw std::invalid_argument("apron::texpr0::builder::builder(ap_texpr_op_t, const builder&, ap_texpr_rtype_t, ap_texpr_rdir_t) not a unary operator");
738  l = ap_texpr0_unop(op,
739  const_cast<ap_texpr0_t*>(argA.l),
740  rtype, rdir);
741 }
742 
743 inline texpr0::builder::builder(ap_texpr_op_t op, const builder& argA, const builder& argB, ap_texpr_rtype_t rtype, ap_texpr_rdir_t rdir)
744 {
745  if (!ap_texpr_is_binop(op))
746  throw std::invalid_argument("apron::texpr0::builder::builder(ap_texpr_op_t, const builder&, const builder&, ap_texpr_rtype_t, ap_texpr_rdir_t) not a binary operator");
747  l = ap_texpr0_binop(op,
748  const_cast<ap_texpr0_t*>(argA.l),
749  const_cast<ap_texpr0_t*>(argB.l),
750  rtype, rdir);
751 }
752 
753 
754 /* 'intelligent' constructors */
755 
756 inline texpr0::builder unary(ap_texpr_op_t op, const texpr0::builder& a,
757  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
758  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
759 {
760  return texpr0::builder(op, a, rtype, rdir);
761 }
762 
763 inline texpr0::builder binary(ap_texpr_op_t op, const texpr0::builder& a, const texpr0::builder& b,
764  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
765  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
766 {
767  return texpr0::builder(op, a, b, rtype, rdir);
768 }
769 
770 
771 inline texpr0::builder add(const texpr0::builder& a, const texpr0::builder& b,
772  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
773  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
774 {
775  return texpr0::builder(AP_TEXPR_ADD, a, b, rtype, rdir);
776 }
777 
778 inline texpr0::builder sub(const texpr0::builder& a, const texpr0::builder& b,
779  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
780  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
781 {
782  return texpr0::builder(AP_TEXPR_SUB, a, b, rtype, rdir);
783 }
784 
785 inline texpr0::builder mul(const texpr0::builder& a, const texpr0::builder& b,
786  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
787  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
788 {
789  return texpr0::builder(AP_TEXPR_MUL, a, b, rtype, rdir);
790 }
791 
792 inline texpr0::builder div(const texpr0::builder& a, const texpr0::builder& b,
793  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
794  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
795 {
796  return texpr0::builder(AP_TEXPR_DIV, a, b, rtype, rdir);
797 }
798 
799 inline texpr0::builder mod(const texpr0::builder& a, const texpr0::builder& b,
800  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
801  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
802 {
803  return texpr0::builder(AP_TEXPR_MOD, a, b, rtype, rdir);
804 }
805 
806 inline texpr0::builder pow(const texpr0::builder& a, const texpr0::builder& b,
807  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
808  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
809 {
810  return texpr0::builder(AP_TEXPR_POW, a, b, rtype, rdir);
811 }
812 
813 inline texpr0::builder neg(const texpr0::builder& a,
814  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
815  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
816 {
817  return texpr0::builder(AP_TEXPR_NEG, a, rtype, rdir);
818 }
819 
820 inline texpr0::builder cast(const texpr0::builder& a, ap_texpr_rtype_t rtype,
821  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
822 {
823  return texpr0::builder(AP_TEXPR_CAST, a, rtype, rdir);
824 }
825 
826 inline texpr0::builder floor(const texpr0::builder& a)
827 {
828  return texpr0::builder(AP_TEXPR_CAST, a, AP_RTYPE_INT, AP_RDIR_DOWN);
829 }
830 
831 inline texpr0::builder ceil(const texpr0::builder& a)
832 {
833  return texpr0::builder(AP_TEXPR_CAST, a, AP_RTYPE_INT, AP_RDIR_UP);
834 }
835 
836 inline texpr0::builder trunc(const texpr0::builder& a)
837 {
838  return texpr0::builder(AP_TEXPR_CAST, a, AP_RTYPE_INT, AP_RDIR_ZERO);
839 }
840 
841 inline texpr0::builder sqrt(const texpr0::builder& a,
842  ap_texpr_rtype_t rtype = AP_RTYPE_REAL,
843  ap_texpr_rdir_t rdir = AP_RDIR_NEAREST)
844 {
845  return texpr0::builder(AP_TEXPR_SQRT, a, rtype, rdir);
846 }
847 
848 inline texpr0::builder operator+(const texpr0::builder& a)
849 {
850  return a;
851 }
852 
853 inline texpr0::builder operator-(const texpr0::builder& a)
854 {
855  return neg(a);
856 }
857 
858 inline texpr0::builder operator+(const texpr0::builder& a, const texpr0::builder& b)
859 {
860  return add(a,b);
861 }
862 
863 inline texpr0::builder operator-(const texpr0::builder& a, const texpr0::builder& b)
864 {
865  return sub(a,b);
866 }
867 
868 inline texpr0::builder operator*(const texpr0::builder& a, const texpr0::builder& b)
869 {
870  return mul(a,b);
871 }
872 
873 inline texpr0::builder operator/(const texpr0::builder& a, const texpr0::builder& b)
874 {
875  return div(a,b);
876 }
877 
878 inline texpr0::builder operator%(const texpr0::builder& a, const texpr0::builder& b)
879 {
880  return mod(a,b);
881 }
882 
883 inline texpr0::builder operator^(const texpr0::builder& a, const texpr0::builder& b)
884 {
885  return pow(a,b);
886 }
887 
888 
889 /* destructor */
890 /* ========== */
891 
893 {
894  switch(l->discr){
895  case AP_TEXPR_CST: ap_coeff_clear(&l->val.cst); break;
896  case AP_TEXPR_DIM: break;
897  case AP_TEXPR_NODE: free(l->val.node); break;
898  default: assert(false);
899  }
900  free(l);
901 }
902 
903 inline bool texpr0::builder::is_zero() const
904 {
905  return l->discr==AP_TEXPR_CST && ap_coeff_zero(&const_cast<ap_texpr0_t*>(l)->val.cst);
906 }
907 
908 
909 /* C-level compatibility */
910 /* ===================== */
911 
912 inline ap_texpr0_t* texpr0::builder::get_ap_texpr0_t()
913 {
914  return l;
915 }
916 
917 inline const ap_texpr0_t* texpr0::builder::get_ap_texpr0_t() const
918 {
919  return l;
920 }
std::vector< std::string > * get_varname(std::basic_ostream< charT, Traits > &os)
Definition: apxx_dimension_inline.hh:43
texpr0::builder floor(const texpr0::builder &a)
Definition: apxx_texpr0_inline.hh:826
texpr0::builder trunc(const texpr0::builder &a)
Definition: apxx_texpr0_inline.hh:836
std::ostream & operator<<(std::ostream &os, const texpr0 &s)
Definition: apxx_texpr0_inline.hh:152
texpr0::builder sqrt(const texpr0::builder &a, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:841
texpr0::builder sub(const texpr0::builder &a, const texpr0::builder &b, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:778
texpr0::builder operator/(const texpr0::builder &a, const texpr0::builder &b)
Definition: apxx_texpr0_inline.hh:873
texpr0::builder div(const texpr0::builder &a, const texpr0::builder &b, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:792
texpr0::builder cast(const texpr0::builder &a, ap_texpr_rtype_t rtype, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:820
texpr0::builder binary(ap_texpr_op_t op, const texpr0::builder &a, const texpr0::builder &b, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:763
texpr0::builder pow(const texpr0::builder &a, const texpr0::builder &b, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:806
texpr0::builder add(const texpr0::builder &a, const texpr0::builder &b, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:771
texpr0::builder operator%(const texpr0::builder &a, const texpr0::builder &b)
Definition: apxx_texpr0_inline.hh:878
texpr0::builder unary(ap_texpr_op_t op, const texpr0::builder &a, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:756
texpr0::builder operator^(const texpr0::builder &a, const texpr0::builder &b)
Definition: apxx_texpr0_inline.hh:883
void apxx_texpr0_ostream(std::ostream &os, ap_texpr0_t *a, std::vector< std::string > *names)
texpr0::builder operator*(const texpr0::builder &a, const texpr0::builder &b)
Definition: apxx_texpr0_inline.hh:868
texpr0::builder mod(const texpr0::builder &a, const texpr0::builder &b, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:799
texpr0::builder operator+(const texpr0::builder &a)
Definition: apxx_texpr0_inline.hh:848
texpr0::builder operator-(const texpr0::builder &a)
Definition: apxx_texpr0_inline.hh:853
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_inline.hh:813
texpr0::builder ceil(const texpr0::builder &a)
Definition: apxx_texpr0_inline.hh:831
texpr0::builder mul(const texpr0::builder &a, const texpr0::builder &b, ap_texpr_rtype_t rtype=AP_RTYPE_REAL, ap_texpr_rdir_t rdir=AP_RDIR_NEAREST)
Definition: apxx_texpr0_inline.hh:785
Level 0 abstract value (ap_abstract0_t* wrapper).
Definition: apxx_abstract0.hh:78
ap_abstract0_t * get_ap_abstract0_t()
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_abstract0_inline.hh:1172
Exception raised when an operation is incompatible with a discriminant.
Definition: apxx_scalar.hh:55
Coefficient (ap_coeff_t wrapper).
Definition: apxx_coeff.hh:36
Represents a dimension (i.e., variable by index) in an expression tree.
Definition: apxx_texpr0.hh:33
ap_dim_t d
Dimension index.
Definition: apxx_texpr0.hh:37
dim(ap_dim_t d)
Standard constructor.
Definition: apxx_texpr0_inline.hh:19
Dimension change object (ap_dimchange_t wrapper).
Definition: apxx_dimension.hh:102
const ap_dimchange_t * get_ap_dimchange_t() const
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_dimension_inline.hh:204
Dimension permutation object (ap_dimperm_t wrapper).
Definition: apxx_dimension.hh:292
const ap_dimperm_t * get_ap_dimperm_t() const
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_dimension_inline.hh:422
Level 1 environment (ap_environment_t wrapper).
Definition: apxx_environment.hh:51
const ap_environment_t * get_ap_environment_t() const
Returns a pointer to the internal APRON object pointed by *this.
Definition: apxx_environment_inline.hh:425
Interval (ap_interval_t wrapper).
Definition: apxx_interval.hh:47
Level 0 linear expression (ap_linexpr0_t wrapper).
Definition: apxx_linexpr0.hh:44
const ap_linexpr0_t * get_ap_linexpr0_t() const
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_linexpr0_inline.hh:459
Library manager (ap_manager_t wrapper).
Definition: apxx_manager.hh:137
ap_manager_t * get_ap_manager_t()
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_manager_inline.hh:206
Scalar (ap_scalar_t wrapper).
Definition: apxx_scalar.hh:89
Temporary expression nodes used when constructing a texpr0.
Definition: apxx_texpr0.hh:581
void init_from(ap_texpr0_t *x)
Internal use only: makes a shallow copy, copying only the root node.
Definition: apxx_texpr0_inline.hh:626
~builder()
Frees the memory occupied by the node, not its sub-expressions.
Definition: apxx_texpr0_inline.hh:892
ap_texpr0_t * l
Definition: apxx_texpr0.hh:587
builder(ap_texpr0_t *x)
Internal use only: makes a shallow copy, copying only the root node.
Definition: apxx_texpr0_inline.hh:640
bool is_zero() const
Whether the expression is a single coefficient node with 0 value.
Definition: apxx_texpr0_inline.hh:903
ap_texpr0_t * get_ap_texpr0_t()
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_texpr0_inline.hh:912
Iterators to traverse a constant expression tree.
Definition: apxx_texpr0.hh:211
size_t size() const
Returns the number of operator nodes in the expression tree.
Definition: apxx_texpr0_inline.hh:439
ap_texpr0_t * l
Definition: apxx_texpr0.hh:215
bool is_interval_polynomial() const
Whether the expression is polynomial and there is no rounding.
Definition: apxx_texpr0_inline.hh:475
bool is_interval_cst() const
Whether the expression is constant (i.e., has no dimension leaves).
Definition: apxx_texpr0_inline.hh:465
bool is_zero() const
Whether the expression is a single coefficient node with 0 value.
Definition: apxx_texpr0_inline.hh:423
ap_texpr_op_t get_op() const
Returns the operator kind of an operator node.
Definition: apxx_texpr0_inline.hh:352
const_iterator & operator=(const const_iterator &i)
Resets the const_iterator at position i.
Definition: apxx_texpr0_inline.hh:374
bool equal(const texpr0 &x) const
Whether two expressions are syntactically, structurally equal.
Definition: apxx_texpr0_inline.hh:428
const_iterator left() const
Constructs a const_iterator to the only of left sub-expression of an operator node.
Definition: apxx_texpr0_inline.hh:387
bool is_scalar() const
Whether all occurring constants are scalar.
Definition: apxx_texpr0_inline.hh:485
ap_texpr_discr_t get_discr() const
Returns the node kind.
Definition: apxx_texpr0_inline.hh:335
ap_texpr_rdir_t get_rdir() const
Returns the rounding direction of an operator node.
Definition: apxx_texpr0_inline.hh:364
size_t depth() const
Returns the depth of the expression tree (counting only operator nodes).
Definition: apxx_texpr0_inline.hh:434
const coeff & get_coeff() const
Returns a reference to the coefficient of a constant node.
Definition: apxx_texpr0_inline.hh:340
ap_texpr0_t * get_ap_texpr0_t()
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_texpr0_inline.hh:494
ap_dim_t max_dim() const
Returns the maximal dimension occurring in the expression (or 0 if there is no variable).
Definition: apxx_texpr0_inline.hh:444
const_iterator child() const
Constructs a const_iterator to the only or left sub-expression of an operator node.
Definition: apxx_texpr0_inline.hh:380
void print(char **name_of_dim=NULL, FILE *stream=stdout) const
Prints to a C stream.
Definition: apxx_texpr0_inline.hh:414
bool is_interval_linear() const
Whether the expression is linear and there is no rounding.
Definition: apxx_texpr0_inline.hh:470
ap_dim_t get_dim() const
Returns the dimension of a dimension node.
Definition: apxx_texpr0_inline.hh:346
const_iterator right() const
Constructs a const_iterator to the right sub-expression argument of a binary operator node.
Definition: apxx_texpr0_inline.hh:394
const_iterator(ap_texpr0_t *l)
Internal use only.
Definition: apxx_texpr0_inline.hh:320
std::vector< ap_dim_t > dimlist() const
Returns a list of all dimensions occurring in the expression (in strict increasing order)
Definition: apxx_texpr0_inline.hh:454
bool has_dim(ap_dim_t d) const
Whether the given dimension occurs in the expression.
Definition: apxx_texpr0_inline.hh:449
bool is_interval_polyfrac() const
Whether the expression is a polynomial fraction and there is no rounding.
Definition: apxx_texpr0_inline.hh:480
ap_texpr_rtype_t get_rtype() const
Returns the destination type of an operator node.
Definition: apxx_texpr0_inline.hh:358
Iterators to traverse and mutate an expression tree.
Definition: apxx_texpr0.hh:413
coeff & get_coeff() const
Returns a (modifiable) reference to the coefficient of a constant node.
Definition: apxx_texpr0_inline.hh:544
iterator left() const
Constructs an iterator to the only of left sub-expression of an operator node.
Definition: apxx_texpr0_inline.hh:591
ap_texpr_rtype_t & get_rtype() const
Returns a (modifiable) reference to the destination type of an operator node.
Definition: apxx_texpr0_inline.hh:562
iterator(ap_texpr0_t *l)
Internal use only.
Definition: apxx_texpr0_inline.hh:513
iterator child() const
Constructs an iterator to the only or left sub-expression of an operator node.
Definition: apxx_texpr0_inline.hh:584
iterator right() const
Constructs an iterator to the right sub-expression argument of a binary operator node.
Definition: apxx_texpr0_inline.hh:598
ap_texpr_rdir_t & get_rdir() const
Returns a (modifiable) reference to the rounding direction of an operator node.
Definition: apxx_texpr0_inline.hh:568
iterator & operator=(const builder &c)
Replace the sub-expression at the iterator position with a (deep) copy of c.
Definition: apxx_texpr0_inline.hh:531
ap_texpr0_t * get_ap_texpr0_t()
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_texpr0_inline.hh:609
ap_dim_t & get_dim() const
Returns a (modifiable) reference to the dimension of a dimension node.
Definition: apxx_texpr0_inline.hh:550
ap_texpr_op_t & get_op() const
Returns a (modifiable) reference to the operator kind of an operator node.
Definition: apxx_texpr0_inline.hh:556
Level 0 arbitrary expression tree (ap_texpr0_t wrapper).
Definition: apxx_texpr0.hh:92
bool is_interval_linear() const
Whether the expression is linear and there is no rounding.
Definition: apxx_texpr0_inline.hh:206
~texpr0()
Frees the memory occupied by the expression (and, recursively, all sub-expressions).
Definition: apxx_texpr0_inline.hh:102
friend std::ostream & operator<<(std::ostream &os, const texpr0 &s)
Printing.
size_t size() const
Returns the number of operator nodes in the expression tree.
Definition: apxx_texpr0_inline.hh:181
size_t depth() const
Returns the depth of the expression tree (counting only operator nodes).
Definition: apxx_texpr0_inline.hh:176
ap_texpr0_t * get_ap_texpr0_t()
Returns a pointer to the internal APRON object stored in *this.
Definition: apxx_texpr0_inline.hh:293
ap_dim_t max_dim() const
Returns the maximal dimension occurring in the expression (or 0 if there is no variable).
Definition: apxx_texpr0_inline.hh:186
bool has_dim(ap_dim_t d) const
Whether the given dimension occurs in the expression.
Definition: apxx_texpr0_inline.hh:191
texpr0(ap_texpr0_t *x)
Internal use only. Shallow copy.
Definition: apxx_texpr0_inline.hh:53
const_iterator root() const
Returns a new iterator at the root of a constant expression tree.
Definition: apxx_texpr0_inline.hh:315
texpr0 & operator=(const texpr0 &x)
Makes a (deep) copy of the expression.
Definition: apxx_texpr0_inline.hh:123
bool is_interval_cst() const
Whether the expression is constant (i.e., has no dimension leaves).
Definition: apxx_texpr0_inline.hh:201
ap_texpr0_t l
Structure managed by APRON.
Definition: apxx_texpr0.hh:96
void add_dimensions(const dimchange &d)
Adds some dimensions, shifting dimension if needed.
Definition: apxx_texpr0_inline.hh:272
bool is_interval_polyfrac() const
Whether the expression is a polynomial fraction and there is no rounding.
Definition: apxx_texpr0_inline.hh:216
bool is_interval_polynomial() const
Whether the expression is polynomial and there is no rounding.
Definition: apxx_texpr0_inline.hh:211
bool equal(const texpr0 &x) const
Whether two expressions are syntactically, structurally equal.
Definition: apxx_texpr0_inline.hh:171
void permute_dimensions(const dimperm &d)
Permutes dimensions.
Definition: apxx_texpr0_inline.hh:283
long hash() const
Returns a hash code.
Definition: apxx_texpr0_inline.hh:261
bool is_scalar() const
Whether all occurring constants are scalar.
Definition: apxx_texpr0_inline.hh:221
void init_from(ap_texpr0_t *x)
Internal use only. Shallow copy.
Definition: apxx_texpr0_inline.hh:47
std::vector< ap_dim_t > dimlist() const
Returns a list of all dimensions occurring in the expression (in strict increasing order)
Definition: apxx_texpr0_inline.hh:196
bool is_zero() const
Whether the expression is a single coefficient node with 0 value.
Definition: apxx_texpr0_inline.hh:166
void substitute(ap_dim_t dim, const texpr0 &dst)
Substitutes each occurrence of dim with (a fresh copy of) dst.
Definition: apxx_texpr0_inline.hh:230
void print(char **name_of_dim=NULL, FILE *stream=stdout) const
Prints to a C stream.
Definition: apxx_texpr0_inline.hh:157
void remove_dimensions(const dimchange &d)
Removes some dimensions, shifting dimension if needed.
Definition: apxx_texpr0_inline.hh:278
Variable name (ap_var_t wrapper).
Definition: apxx_var.hh:39
const ap_var_t & get_ap_var_t() const
Returns a reference to the APRON object wrapped (no copy).
Definition: apxx_var_inline.hh:156
bool is_unop(ap_texpr_op_t op)
Whether the operator is unary.
bool is_binop(ap_texpr_op_t op)
Whether the operator is binary.
A fraction with native int coefficients, to simplify initialisations and assignments.
Definition: apxx_scalar.hh:41
Full interval (]-oo,+oo[) or domain, to simplify initialisations and assignments.
Definition: apxx_interval.hh:27