PPL  1.2
Interval_defs.hh
Go to the documentation of this file.
1 /* Declarations for the Interval class and its constituents.
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_Interval_defs_hh
25 #define PPL_Interval_defs_hh 1
26 
27 #include "Interval_types.hh"
28 #include "globals_defs.hh"
29 #include "meta_programming.hh"
30 #include "assign_or_swap.hh"
31 #include "intervals_defs.hh"
32 #include "Interval_Info_defs.hh"
33 #include <iosfwd>
34 
35 namespace Parma_Polyhedra_Library {
36 
38 
39 inline I_Result
41  const unsigned res
42  = static_cast<unsigned>(l) | (static_cast<unsigned>(u) << 6);
43  return static_cast<I_Result>(res);
44 }
45 
46 struct Interval_Base {
47 };
48 
49 using namespace Boundary_NS;
50 using namespace Interval_NS;
51 
52 template <typename T, typename Enable = void>
53 struct Is_Singleton : public Is_Native_Or_Checked<T> {};
54 
55 template <typename T>
56 struct Is_Interval : public Is_Same_Or_Derived<Interval_Base, T> {};
57 
59 
80 template <typename Boundary, typename Info>
81 class Interval : public Interval_Base, private Info {
82 private:
83  PPL_COMPILE_TIME_CHECK(!Info::store_special
84  || !std::numeric_limits<Boundary>::has_infinity,
85  "store_special is meaningless"
86  " when boundary type may contains infinity");
87  Info& w_info() const {
88  return const_cast<Interval&>(*this);
89  }
90 
91 public:
92  typedef Boundary boundary_type;
93  typedef Info info_type;
94 
96 
97  template <typename T>
99  operator=(const T& x) {
100  assign(x);
101  return *this;
102  }
103 
104  template <typename T>
106  operator+=(const T& x) {
107  add_assign(*this, x);
108  return *this;
109  }
110  template <typename T>
112  operator-=(const T& x) {
113  sub_assign(*this, x);
114  return *this;
115  }
116  template <typename T>
118  operator*=(const T& x) {
119  mul_assign(*this, x);
120  return *this;
121  }
122  template <typename T>
124  operator/=(const T& x) {
125  div_assign(*this, x);
126  return *this;
127  }
128 
130  void m_swap(Interval& y);
131 
132  Info& info() {
133  return *this;
134  }
135 
136  const Info& info() const {
137  return *this;
138  }
139 
140  Boundary& lower() {
141  return lower_;
142  }
143 
144  const Boundary& lower() const {
145  return lower_;
146  }
147 
148  Boundary& upper() {
149  return upper_;
150  }
151 
152  const Boundary& upper() const {
153  return upper_;
154  }
155 
157  PPL_ASSERT(!is_empty());
158  if (info().get_boundary_property(LOWER, SPECIAL)) {
160  }
161  return i_constraint(lower_is_open() ? GREATER_THAN : GREATER_OR_EQUAL,
162  lower(), true);
163  }
165  PPL_ASSERT(!is_empty());
166  if (info().get_boundary_property(UPPER, SPECIAL)) {
168  }
169  return i_constraint(upper_is_open() ? LESS_THAN : LESS_OR_EQUAL,
170  upper(), true);
171  }
172 
173  bool is_empty() const {
174  return lt(UPPER, upper(), info(), LOWER, lower(), info());
175  }
176 
177  bool check_empty(I_Result r) const {
178  return (r & I_ANY) == I_EMPTY
179  || ((r & I_ANY) != I_NOT_EMPTY && is_empty());
180  }
181 
182  bool is_singleton() const {
183  return eq(LOWER, lower(), info(), UPPER, upper(), info());
184  }
185 
186  bool lower_is_open() const {
187  PPL_ASSERT(OK());
188  return is_open(LOWER, lower(), info());
189  }
190 
191  bool upper_is_open() const {
192  PPL_ASSERT(OK());
193  return is_open(UPPER, upper(), info());
194  }
195 
197  PPL_ASSERT(OK());
198  return Boundary_NS::is_boundary_infinity(LOWER, lower(), info());
199  }
200 
202  PPL_ASSERT(OK());
203  return Boundary_NS::is_boundary_infinity(UPPER, upper(), info());
204  }
205 
206  bool lower_is_domain_inf() const {
207  PPL_ASSERT(OK());
208  return Boundary_NS::is_domain_inf(LOWER, lower(), info());
209  }
210 
211  bool upper_is_domain_sup() const {
212  PPL_ASSERT(OK());
213  return Boundary_NS::is_domain_sup(UPPER, upper(), info());
214  }
215 
216  bool is_bounded() const {
217  PPL_ASSERT(OK());
218  return !lower_is_boundary_infinity() && !upper_is_boundary_infinity();
219  }
220 
221  bool is_universe() const {
222  PPL_ASSERT(OK());
223  return lower_is_domain_inf() && upper_is_domain_sup();
224  }
225 
227  info().clear_boundary_properties(LOWER);
228  set_unbounded(LOWER, lower(), info());
229  return I_ANY;
230  }
231 
232  template <typename C>
234  lower_extend(const C& c);
235 
237  info().clear_boundary_properties(UPPER);
238  set_unbounded(UPPER, upper(), info());
239  return I_ANY;
240  }
241 
242  template <typename C>
244  upper_extend(const C& c);
245 
247  return assign(UNIVERSE);
248  }
249 
250  template <typename C>
252  build(const C& c) {
253  Relation_Symbol rs;
254  switch (c.rel()) {
255  case V_LGE:
256  case V_GT_MINUS_INFINITY:
257  case V_LT_PLUS_INFINITY:
258  return assign(UNIVERSE);
259  default:
260  return assign(EMPTY);
261  case V_LT:
262  case V_LE:
263  case V_GT:
264  case V_GE:
265  case V_EQ:
266  case V_NE:
267  assign(UNIVERSE);
268  rs = static_cast<Relation_Symbol>(c.rel());
269  return refine_existential(rs, c.value());
270  }
271  }
272 
273  template <typename C1, typename C2>
275  &&
277  I_Result>::type
278  build(const C1& c1, const C2& c2) {
279  switch (c1.rel()) {
280  case V_LGE:
281  return build(c2);
282  case V_NAN:
283  return assign(EMPTY);
284  default:
285  break;
286  }
287  switch (c2.rel()) {
288  case V_LGE:
289  return build(c1);
290  case V_NAN:
291  return assign(EMPTY);
292  default:
293  break;
294  }
295  build(c1);
296  const I_Result r = add_constraint(c2);
297  return r - (I_CHANGED | I_UNCHANGED);
298  }
299 
300  template <typename C>
302  add_constraint(const C& c) {
303  Interval x;
304  x.build(c);
305  return intersect_assign(x);
306  }
307 
309  I_Result r;
310  info().clear();
311  switch (e) {
312  case EMPTY:
313  lower_ = 1;
314  upper_ = 0;
315  r = I_EMPTY | I_EXACT;
316  break;
317  case UNIVERSE:
318  set_unbounded(LOWER, lower(), info());
319  set_unbounded(UPPER, upper(), info());
320  r = I_UNIVERSE | I_EXACT;
321  break;
322  default:
323  PPL_UNREACHABLE;
324  r = I_EMPTY;
325  break;
326  }
327  PPL_ASSERT(OK());
328  return r;
329  }
330 
331  template <typename From>
333  assign(const From&) {
334  info().clear();
335  Result rl;
336  Result ru;
337  switch (From::vclass) {
338  case VC_MINUS_INFINITY:
339  rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
340  ru = Boundary_NS::set_minus_infinity(UPPER, upper(), info());
341  break;
342  case VC_PLUS_INFINITY:
343  rl = Boundary_NS::set_plus_infinity(LOWER, lower(), info());
344  ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
345  break;
346  default:
347  PPL_UNREACHABLE;
348  rl = V_NAN;
349  ru = V_NAN;
350  break;
351  }
352  PPL_ASSERT(OK());
353  return combine(rl, ru);
354  }
355 
357  info().clear();
358  Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
359  Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
360  PPL_ASSERT(OK());
361  return combine(rl, ru);
362  }
363 
365  return !Info::store_open;
366  }
367 
368  bool is_topologically_closed() const {
369  PPL_ASSERT(OK());
370  return is_always_topologically_closed()
371  || is_empty()
372  || ((lower_is_boundary_infinity() || !lower_is_open())
373  && (upper_is_boundary_infinity() || !upper_is_open()));
374  }
375 
378  if (!Info::store_open || is_empty()) {
379  return;
380  }
381  if (lower_is_open() && !lower_is_boundary_infinity()) {
382  info().set_boundary_property(LOWER, OPEN, false);
383  }
384  if (upper_is_open() && !upper_is_boundary_infinity()) {
385  info().set_boundary_property(UPPER, OPEN, false);
386  }
387  }
388 
389  void remove_inf() {
390  PPL_ASSERT(!is_empty());
391  if (!Info::store_open) {
392  return;
393  }
394  info().set_boundary_property(LOWER, OPEN, true);
395  }
396 
397  void remove_sup() {
398  PPL_ASSERT(!is_empty());
399  if (!Info::store_open) {
400  return;
401  }
402  info().set_boundary_property(UPPER, OPEN, true);
403  }
404 
405  int infinity_sign() const {
406  PPL_ASSERT(OK());
407  if (is_reverse_infinity(LOWER, lower(), info())) {
408  return 1;
409  }
410  else if (is_reverse_infinity(UPPER, upper(), info())) {
411  return -1;
412  }
413  else {
414  return 0;
415  }
416  }
417 
418  bool contains_integer_point() const {
419  PPL_ASSERT(OK());
420  if (is_empty()) {
421  return false;
422  }
423  if (!is_bounded()) {
424  return true;
425  }
426  Boundary l;
427  if (lower_is_open()) {
428  add_assign_r(l, lower(), Boundary(1), ROUND_DOWN);
429  floor_assign_r(l, l, ROUND_DOWN);
430  }
431  else {
432  ceil_assign_r(l, lower(), ROUND_DOWN);
433  }
434  Boundary u;
435  if (upper_is_open()) {
436  sub_assign_r(u, upper(), Boundary(1), ROUND_UP);
437  ceil_assign_r(u, u, ROUND_UP);
438  }
439  else {
440  floor_assign_r(u, upper(), ROUND_UP);
441  }
442  return u >= l;
443  }
444 
446  if (is_empty()) {
447  return;
448  }
449  if (lower_is_open() && !lower_is_boundary_infinity()) {
450  add_assign_r(lower(), lower(), Boundary(1), ROUND_DOWN);
451  floor_assign_r(lower(), lower(), ROUND_DOWN);
452  info().set_boundary_property(LOWER, OPEN, false);
453  }
454  else {
455  ceil_assign_r(lower(), lower(), ROUND_DOWN);
456  }
457  if (upper_is_open() && !upper_is_boundary_infinity()) {
458  sub_assign_r(upper(), upper(), Boundary(1), ROUND_UP);
459  ceil_assign_r(upper(), upper(), ROUND_UP);
460  info().set_boundary_property(UPPER, OPEN, false);
461  }
462  else {
463  floor_assign_r(upper(), upper(), ROUND_UP);
464  }
465  }
466 
467  template <typename From>
471  const From& refinement) {
472  if (is_empty()) {
473  return I_EMPTY;
474  }
475  if (lower_is_boundary_infinity() || upper_is_boundary_infinity()) {
476  return assign(refinement);
477  }
478  PPL_DIRTY_TEMP(Boundary, u);
479  Result result = sub_2exp_assign_r(u, upper(), w, ROUND_UP);
480  if (result_overflow(result) == 0 && u > lower()) {
481  return assign(refinement);
482  }
483  info().clear();
484  switch (r) {
485  case UNSIGNED:
486  umod_2exp_assign(LOWER, lower(), info(),
487  LOWER, lower(), info(), w);
488  umod_2exp_assign(UPPER, upper(), info(),
489  UPPER, upper(), info(), w);
490  break;
491  case SIGNED_2_COMPLEMENT:
492  smod_2exp_assign(LOWER, lower(), info(),
493  LOWER, lower(), info(), w);
494  smod_2exp_assign(UPPER, upper(), info(),
495  UPPER, upper(), info(), w);
496  break;
497  default:
498  PPL_UNREACHABLE;
499  break;
500  }
501  if (le(LOWER, lower(), info(), UPPER, upper(), info())) {
502  return intersect_assign(refinement);
503  }
504  PPL_DIRTY_TEMP(Interval, tmp);
505  tmp.info().clear();
506  Boundary_NS::assign(LOWER, tmp.lower(), tmp.info(),
507  LOWER, lower(), info());
508  set_unbounded(UPPER, tmp.upper(), tmp.info());
509  tmp.intersect_assign(refinement);
510  lower_extend();
511  intersect_assign(refinement);
512  return join_assign(tmp);
513  }
514 
517 
520 
521  void ascii_dump(std::ostream& s) const;
522  bool ascii_load(std::istream& s);
523 
524  bool OK() const {
525  if (!Info::may_be_empty && is_empty()) {
526 #ifndef NDEBUG
527  std::cerr << "The interval is unexpectedly empty.\n";
528 #endif
529  return false;
530  }
531 
532  if (is_open(LOWER, lower(), info())) {
533  if (is_plus_infinity(LOWER, lower(), info())) {
534 #ifndef NDEBUG
535  std::cerr << "The lower boundary is +inf open.\n";
536 #endif
537  }
538  }
539  else if (!Info::may_contain_infinity
540  && (is_minus_infinity(LOWER, lower(), info())
541  || is_plus_infinity(LOWER, lower(), info()))) {
542 #ifndef NDEBUG
543  std::cerr << "The lower boundary is unexpectedly infinity.\n";
544 #endif
545  return false;
546  }
547  if (!info().get_boundary_property(LOWER, SPECIAL)) {
548  if (is_not_a_number(lower())) {
549 #ifndef NDEBUG
550  std::cerr << "The lower boundary is not a number.\n";
551 #endif
552  return false;
553  }
554  }
555 
556  if (is_open(UPPER, upper(), info())) {
557  if (is_minus_infinity(UPPER, upper(), info())) {
558 #ifndef NDEBUG
559  std::cerr << "The upper boundary is -inf open.\n";
560 #endif
561  }
562  }
563  else if (!Info::may_contain_infinity
564  && (is_minus_infinity(UPPER, upper(), info())
565  || is_plus_infinity(UPPER, upper(), info()))) {
566 #ifndef NDEBUG
567  std::cerr << "The upper boundary is unexpectedly infinity."
568  << std::endl;
569 #endif
570  return false;
571  }
572  if (!info().get_boundary_property(UPPER, SPECIAL)) {
573  if (is_not_a_number(upper())) {
574 #ifndef NDEBUG
575  std::cerr << "The upper boundary is not a number.\n";
576 #endif
577  return false;
578  }
579  }
580 
581  // Everything OK.
582  return true;
583  }
584 
586  }
587 
588  template <typename T>
589  explicit Interval(const T& x) {
590  assign(x);
591  }
592 
597  explicit Interval(const char* s);
598 
599  template <typename T>
601  || Is_Interval<T>::value, bool>::type
602  contains(const T& y) const;
603 
604  template <typename T>
606  || Is_Interval<T>::value, bool>::type
607  strictly_contains(const T& y) const;
608 
609  template <typename T>
611  || Is_Interval<T>::value, bool>::type
612  is_disjoint_from(const T& y) const;
613 
614 
615  template <typename From>
618  assign(const From& x);
619 
620  template <typename Type>
622  || Is_Interval<Type>::value, bool>::type
623  can_be_exactly_joined_to(const Type& x) const;
624 
625  template <typename From>
628  join_assign(const From& x);
629 
630  template <typename From1, typename From2>
635  join_assign(const From1& x, const From2& y);
636 
637  template <typename From>
640  intersect_assign(const From& x);
641 
642  template <typename From1, typename From2>
647  intersect_assign(const From1& x, const From2& y);
648 
653  template <typename From>
656  difference_assign(const From& x);
657 
662  template <typename From1, typename From2>
667  difference_assign(const From1& x, const From2& y);
668 
673  template <typename From>
676  lower_approximation_difference_assign(const From& x);
677 
685  template <typename From>
686  typename Enable_If<Is_Interval<From>::value, bool>::type
687  simplify_using_context_assign(const From& y);
688 
693  template <typename From>
694  typename Enable_If<Is_Interval<From>::value, void>::type
695  empty_intersection_assign(const From& y);
696 
712  template <typename From>
715  refine_existential(Relation_Symbol rel, const From& x);
716 
732  template <typename From>
735  refine_universal(Relation_Symbol rel, const From& x);
736 
737  template <typename From>
740  neg_assign(const From& x);
741 
742  template <typename From1, typename From2>
745  add_assign(const From1& x, const From2& y);
746 
747  template <typename From1, typename From2>
750  sub_assign(const From1& x, const From2& y);
751 
752  template <typename From1, typename From2>
755  mul_assign(const From1& x, const From2& y);
756 
757  template <typename From1, typename From2>
760  div_assign(const From1& x, const From2& y);
761 
762  template <typename From, typename Iterator>
763  typename Enable_If<Is_Interval<From>::value, void>::type
764  CC76_widening_assign(const From& y, Iterator first, Iterator last);
765 
766 private:
767  Boundary lower_;
768  Boundary upper_;
769 };
770 
772 
773 template <typename Boundary, typename Info>
775 
776 } // namespace Parma_Polyhedra_Library
777 
778 #include "Interval_inlines.hh"
779 #include "Interval_templates.hh"
780 
781 #endif // !defined(PPL_Interval_defs_hh)
int result_overflow(Result r)
I_Constraint< T > i_constraint(I_Constraint_Rel rel, const T &v)
The empty element, i.e., the empty set.
The computed result is exact.
Definition: Result_defs.hh:81
void swap(CO_Tree &x, CO_Tree &y)
I_Result
The result of an operation on intervals.
Result set_minus_infinity(Boundary_Type type, T &x, Info &info, bool open=false)
Result set_plus_infinity(Boundary_Type type, T &x, Info &info, bool open=false)
Enable_If< Is_Same_Or_Derived< I_Constraint_Base, C >::value, I_Result >::type build(const C &c)
A positive integer overflow occurred (rounding up).
Definition: Result_defs.hh:111
Enable_If< Is_Native_Or_Checked< T >::value, void >::type ascii_dump(std::ostream &s, const T &t)
bool lt(Boundary_Type type1, const T1 &x1, const Info1 &info1, Boundary_Type type2, const T2 &x2, const Info2 &info2)
Result may be empty or not empty.
I_Constraint< boundary_type > upper_constraint() const
Result
Possible outcomes of a checked arithmetic computation.
Definition: Result_defs.hh:76
const Boundary & upper() const
Negative infinity result class.
Definition: Result_defs.hh:34
Enable_If< Is_Same_Or_Derived< I_Constraint_Base, C >::value, I_Result >::type add_constraint(const C &c)
bool is_reverse_infinity(Boundary_Type type, const T &x, const Info &info)
bool is_domain_inf(Boundary_Type type, const T &x, const Info &info)
bool is_minus_infinity(Boundary_Type type, const T &x, const Info &info)
static const Property OPEN(Property::OPEN_)
Not a number result.
Definition: Result_defs.hh:123
Result may be the domain universe.
The computed result is inexact and rounded down.
Definition: Result_defs.hh:87
static const Property SPECIAL(Property::SPECIAL_)
Enable_If< Is_Singleton< T >::value||Is_Interval< T >::value, Interval & >::type operator/=(const T &x)
Result assign(Boundary_Type to_type, To &to, To_Info &to_info, Boundary_Type type, const T &x, const Info &info, bool should_shrink=false)
Result neg_assign(Boundary_Type to_type, To &to, To_Info &to_info, Boundary_Type type, const T &x, const Info &info)
I_Result assign(Degenerate_Element e)
Enable_If< Is_Singleton< T >::value||Is_Interval< T >::value, Interval & >::type operator*=(const T &x)
Positive infinity result class.
Definition: Result_defs.hh:37
#define PPL_COMPILE_TIME_CHECK(e, msg)
Produces a compilation error if the compile-time constant e does not evaluate to true ...
bool is_open(Boundary_Type type, const T &x, const Info &info)
A class holding a constant called value that evaluates to true if and only if Base is the same type a...
Result div_assign(Boundary_Type to_type, To &to, To_Info &to_info, Boundary_Type type1, const T1 &x1, const Info1 &info1, Boundary_Type type2, const T2 &x2, const Info2 &info2)
Relation_Symbol
Relation symbols.
void topological_closure_assign()
Assigns to *this its topological closure.
Degenerate_Element
Kinds of degenerate abstract elements.
Enable_If< Is_Singleton< From >::value||Is_Interval< From >::value, I_Result >::type wrap_assign(Bounded_Integer_Type_Width w, Bounded_Integer_Type_Representation r, const From &refinement)
Enable_If< Is_Native< T >::value, memory_size_type >::type external_memory_in_bytes(const T &)
For native types, returns the size in bytes of the memory managed by the type of the (unused) paramet...
I_Constraint< boundary_type > lower_constraint() const
bool is_plus_infinity(Boundary_Type type, const T &x, const Info &info)
bool eq(Boundary_Type type1, const T1 &x1, const Info1 &info1, Boundary_Type type2, const T2 &x2, const Info2 &info2)
bool check_empty(I_Result r) const
The computed result is inexact.
Definition: Result_defs.hh:90
Enable_If< Is_Native_Or_Checked< T >::value, bool >::type is_not_a_number(const T &x)
Enable_If< Is_Native_Or_Checked< T >::value, bool >::type ascii_load(std::istream &s, T &t)
Result sub_assign(Boundary_Type to_type, To &to, To_Info &to_info, Boundary_Type type1, const T1 &x1, const Info1 &info1, Boundary_Type type2, const T2 &x2, const Info2 &info2)
Result is definitely exact.
Interval_NS::Property Property
Result set_unbounded(Boundary_Type type, T &x, Info &info)
The computed result may be inexact and rounded up.
Definition: Result_defs.hh:93
#define PPL_DIRTY_TEMP(T, id)
Result umod_2exp_assign(Boundary_Type to_type, To &to, To_Info &to_info, Boundary_Type type, const T &x, const Info &info, unsigned int exp)
The universe element, i.e., the whole vector space.
const Boundary & lower() const
A generic, not necessarily closed, possibly restricted interval.
From bool Type Type Rounding_Dir Rounding_Dir Rounding_Dir Rounding_Dir Rounding_Dir From1
Result mul_assign(Boundary_Type to_type, To &to, To_Info &to_info, Boundary_Type type1, const T1 &x1, const Info1 &info1, Boundary_Type type2, const T2 &x2, const Info2 &info2)
The entire library is confined to this namespace.
Definition: version.hh:61
Signed binary where negative values are represented by the two's complement of the absolute value...
Operation has definitely changed the set.
Result add_assign(Boundary_Type to_type, To &to, To_Info &to_info, Boundary_Type type1, const T1 &x1, const Info1 &info1, Boundary_Type type2, const T2 &x2, const Info2 &info2)
The computed result may be inexact and rounded down.
Definition: Result_defs.hh:96
From bool Type Type Rounding_Dir Rounding_Dir Rounding_Dir Rounding_Dir Rounding_Dir From2
I_Result combine(Result l, Result u)
From bool Type Type Rounding_Dir From
Result smod_2exp_assign(Boundary_Type to_type, To &to, To_Info &to_info, Boundary_Type type, const T &x, const Info &info, unsigned int exp)
Enable_If< Is_Singleton< T >::value||Is_Interval< T >::value, Interval & >::type operator+=(const T &x)
Enable_If< Is_Singleton< T >::value||Is_Interval< T >::value, Interval & >::type operator-=(const T &x)
size_t memory_size_type
An unsigned integral type for representing memory size in bytes.
A negative integer overflow occurred (rounding down).
Definition: Result_defs.hh:114
Coefficient c
Definition: PIP_Tree.cc:64
Enable_If< Is_Singleton< T >::value||Is_Interval< T >::value, Interval & >::type operator=(const T &x)
The computed result is inexact and rounded up.
Definition: Result_defs.hh:84
A class that provides a type member called type equivalent to T if and only if b is true...
Enable_If< Is_Native< T >::value, memory_size_type >::type total_memory_in_bytes(const T &)
For native types, returns the total size in bytes of the memory occupied by the type of the (unused) ...
Operation has left the set definitely unchanged.
Enable_If< Is_Special< From >::value, I_Result >::type assign(const From &)
The computed result may be inexact.
Definition: Result_defs.hh:99
Enable_If< Is_Same_Or_Derived< I_Constraint_Base, C1 >::value &&Is_Same_Or_Derived< I_Constraint_Base, C2 >::value, I_Result >::type build(const C1 &c1, const C2 &c2)
bool le(Boundary_Type type1, const T1 &x1, const Info1 &info1, Boundary_Type type2, const T2 &x2, const Info2 &info2)
bool is_domain_sup(Boundary_Type type, const T &x, const Info &info)
bool is_boundary_infinity(Boundary_Type type, const T &x, const Info &info)