
Module: ppl/ppl Branch: master Commit: 916b06c687704282b44f34390905bc425bd64680 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=916b06c687704...
Author: Enea Zaffanella zaffanella@cs.unipr.it Date: Wed Mar 31 22:17:48 2010 +0200
Drafted drop_some_non_integer_points() for Interval and Box.
---
src/Box.templates.hh | 17 +++++++++++++++-- src/Interval.defs.hh | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/src/Box.templates.hh b/src/Box.templates.hh index 524a4f5..930af84 100644 --- a/src/Box.templates.hh +++ b/src/Box.templates.hh @@ -1674,7 +1674,13 @@ Box<ITV>::drop_some_non_integer_points(Complexity_Class) { && !ITV::info_type::store_open) return;
- // FIXME(0.11): complete. + if (marked_empty()) + return; + + for (dimension_type k = seq.size(); k-- > 0; ) + seq[k].drop_some_non_integer_points(); + + PPL_ASSERT(OK()); }
template <typename ITV> @@ -1691,7 +1697,14 @@ Box<ITV>::drop_some_non_integer_points(const Variables_Set& vars, && !ITV::info_type::store_open) return;
- // FIXME(0.11): complete. + if (marked_empty()) + return; + + for (Variables_Set::const_iterator v_i = vars.begin(), + v_end = vars.end(); v_i != v_end; ++v_i) + seq[*v_i].drop_some_non_integer_points(); + + PPL_ASSERT(OK()); }
template <typename ITV> diff --git a/src/Interval.defs.hh b/src/Interval.defs.hh index aed3be3..ac6ce24 100644 --- a/src/Interval.defs.hh +++ b/src/Interval.defs.hh @@ -535,6 +535,25 @@ public: return u >= l; }
+ void drop_some_non_integer_points() { + if (is_empty()) + return; + if (lower_is_open() && !lower_is_boundary_infinity()) { + add_assign_r(lower(), lower(), Boundary(1), ROUND_DOWN); + floor_assign_r(lower(), lower(), ROUND_DOWN); + info().set_boundary_property(LOWER, OPEN, false); + } + else + ceil_assign_r(lower(), lower(), ROUND_DOWN); + if (upper_is_open() && !upper_is_boundary_infinity()) { + sub_assign_r(upper(), upper(), Boundary(1), ROUND_UP); + ceil_assign_r(upper(), upper(), ROUND_UP); + info().set_boundary_property(UPPER, OPEN, false); + } + else + floor_assign_r(upper(), upper(), ROUND_UP); + } + template <typename From> typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type wrap_assign(Bounded_Integer_Type_Width w,