[PPL-devel] [GIT] ppl/ppl(bounded_arithmetic): Added wrap_assign.
Abramo Bagnara
abramo.bagnara at gmail.com
Wed May 13 23:45:10 CEST 2009
Module: ppl/ppl
Branch: bounded_arithmetic
Commit: 5f9892fcb2fce2ee9f7071820035e1be1b31aa59
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=5f9892fcb2fce2ee9f7071820035e1be1b31aa59
Author: Abramo Bagnara <abramo.bagnara at gmail.com>
Date: Wed May 13 23:42:29 2009 +0200
Added wrap_assign.
---
src/Interval.defs.hh | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/src/Interval.defs.hh b/src/Interval.defs.hh
index b0bc3d2..e58b084 100644
--- a/src/Interval.defs.hh
+++ b/src/Interval.defs.hh
@@ -233,6 +233,11 @@ public:
return lt(UPPER, upper(), info(), LOWER, lower(), info());
}
+ bool check_empty(I_Result r) const {
+ return (r & I_ANY) == I_EMPTY ||
+ ((r & I_ANY) != I_NOT_EMPTY && is_empty());
+ }
+
bool is_singleton() const {
return eq(LOWER, lower(), info(), UPPER, upper(), info());
}
@@ -523,6 +528,49 @@ public:
return u >= l;
}
+ template <typename T>
+ typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+ wrap_assign(const T& x, Bounded_Integer_Type_Width w,
+ Bounded_Integer_Type_Signedness s, const Interval& refinement) {
+ if (is_empty())
+ return I_EMPTY;
+ if (lower_is_boundary_infinity() || upper_is_boundary_infinity())
+ return assign(refinement);
+ PPL_DIRTY_TEMP(Boundary, u);
+ Result r;
+ r = sub_2exp_assign_r(u, upper(), w, ROUND_UP);
+ if (!result_overflow(r) && u > lower())
+ return assign(refinement);
+ switch (s) {
+ case UNSIGNED:
+ umod_2exp_assign(LOWER, lower(), info(),
+ LOWER, f_lower(x), f_info(x), w);
+ umod_2exp_assign(UPPER, upper(), info(),
+ UPPER, f_upper(x), f_info(x), w);
+ break;
+ case SIGNED_2_COMPLEMENT:
+ smod_2exp_assign(LOWER, lower(), info(),
+ LOWER, f_lower(x), f_info(x), w);
+ smod_2exp_assign(UPPER, upper(), info(),
+ UPPER, f_upper(x), f_info(x), w);
+ break;
+ default:
+ assert(false);
+ break;
+ }
+ if (le(LOWER, lower(), info(), UPPER, upper(), info()))
+ return intersect_assign(refinement);
+ PPL_DIRTY_TEMP(Interval, tmp);
+ tmp.info.clear();
+ Boundary_NS::assign(LOWER, tmp.lower(), tmp.info(),
+ LOWER, lower(), info());
+ set_unbounded(UPPER, tmp.upper(), tmp.info());
+ tmp.intersect_assign(refinement);
+ lower_extend();
+ intersect_assign(refinement);
+ return join_assign(tmp);
+ }
+
//! Returns the total size in bytes of the memory occupied by \p *this.
memory_size_type total_memory_in_bytes() const;
More information about the PPL-devel
mailing list