[PPL-devel] [GIT] ppl/ppl(devel): Provide a common, correct implementation for the methods

Enea Zaffanella zaffanella at cs.unipr.it
Thu Nov 19 12:39:16 CET 2015


Module: ppl/ppl
Branch: devel
Commit: e7cc925274945a76599d9601a24e001adfc534a1
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=e7cc925274945a76599d9601a24e001adfc534a1

Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date:   Thu Nov 19 12:36:02 2015 +0100

Provide a common, correct implementation for the methods
  Pointset_Powerset<PSET>::relation_with()
working on Constraint and Congruence objects.

---

 src/Pointset_Powerset_defs.hh      |    7 ++++
 src/Pointset_Powerset_inlines.hh   |   12 ++++++++
 src/Pointset_Powerset_templates.hh |   56 +----------------------------------
 3 files changed, 21 insertions(+), 54 deletions(-)

diff --git a/src/Pointset_Powerset_defs.hh b/src/Pointset_Powerset_defs.hh
index 32615fb..6d4e321 100644
--- a/src/Pointset_Powerset_defs.hh
+++ b/src/Pointset_Powerset_defs.hh
@@ -1294,6 +1294,13 @@ private:
                                                    typename Cert::Compare>&
                                     y_cert_ms) const;
 
+  /*! \brief
+    Template helper: common implementation for constraints
+    and congruences.
+  */
+  template <typename Cons_or_Congr>
+  Poly_Con_Relation relation_with_aux(const Cons_or_Congr& c) const;
+
   // FIXME: here it should be enough to befriend the template constructor
   // template <typename QH>
   // Pointset_Powerset(const Pointset_Powerset<QH>&),
diff --git a/src/Pointset_Powerset_inlines.hh b/src/Pointset_Powerset_inlines.hh
index 460999e..54b03da 100644
--- a/src/Pointset_Powerset_inlines.hh
+++ b/src/Pointset_Powerset_inlines.hh
@@ -233,6 +233,18 @@ Pointset_Powerset<PSET>::time_elapse_assign(const Pointset_Powerset& y) {
 }
 
 template <typename PSET>
+inline Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Constraint& c) const {
+  return relation_with_aux(c);
+}
+
+template <typename PSET>
+inline Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Congruence& cg) const {
+  return relation_with_aux(cg);
+}
+
+template <typename PSET>
 inline bool
 Pointset_Powerset<PSET>
 ::geometrically_covers(const Pointset_Powerset& y) const {
diff --git a/src/Pointset_Powerset_templates.hh b/src/Pointset_Powerset_templates.hh
index f2858c1..0f160a3 100644
--- a/src/Pointset_Powerset_templates.hh
+++ b/src/Pointset_Powerset_templates.hh
@@ -829,61 +829,9 @@ Pointset_Powerset<PSET>::strictly_contains(const Pointset_Powerset& y) const {
 }
 
 template <typename PSET>
+template <typename Cons_or_Congr>
 Poly_Con_Relation
-Pointset_Powerset<PSET>::relation_with(const Congruence& cg) const {
-  const Pointset_Powerset& x = *this;
-
-  /* *this is included in cg if every disjunct is included in cg */
-  bool is_included = true;
-  /* *this is disjoint with cg if every disjunct is disjoint with cg */
-  bool is_disjoint = true;
-  /* *this strictly_intersects with cg if some disjunct strictly
-     intersects with cg */
-  bool is_strictly_intersecting = false;
-  /* *this saturates cg if some disjunct saturates cg and
-     every disjunct is either disjoint from cg or saturates cg */
-  bool saturates_once = false;
-  bool may_saturate = true;
-  for (Sequence_const_iterator si = x.sequence.begin(),
-         s_end = x.sequence.end(); si != s_end; ++si) {
-    Poly_Con_Relation relation_i = si->pointset().relation_with(cg);
-    if (!relation_i.implies(Poly_Con_Relation::is_included())) {
-      is_included = false;
-    }
-    if (!relation_i.implies(Poly_Con_Relation::is_disjoint())) {
-      is_disjoint = false;
-    }
-    if (relation_i.implies(Poly_Con_Relation::strictly_intersects())) {
-      is_strictly_intersecting = true;
-    }
-    if (relation_i.implies(Poly_Con_Relation::saturates())) {
-      saturates_once = true;
-    }
-    else if (!relation_i.implies(Poly_Con_Relation::is_disjoint())) {
-      may_saturate = false;
-    }
-  }
-
-  Poly_Con_Relation result = Poly_Con_Relation::nothing();
-  if (is_included) {
-    result = result && Poly_Con_Relation::is_included();
-  }
-  if (is_disjoint) {
-    result = result && Poly_Con_Relation::is_disjoint();
-  }
-  if (is_strictly_intersecting) {
-    result = result && Poly_Con_Relation::strictly_intersects();
-  }
-  if (saturates_once && may_saturate) {
-    result = result && Poly_Con_Relation::saturates();
-  }
-
-  return result;
-}
-
-template <typename PSET>
-Poly_Con_Relation
-Pointset_Powerset<PSET>::relation_with(const Constraint& c) const {
+Pointset_Powerset<PSET>::relation_with_aux(const Cons_or_Congr& c) const {
   const Pointset_Powerset& x = *this;
 
   /* *this is included in c if every disjunct is included in c */




More information about the PPL-devel mailing list