[GIT] ppl/ppl(master): Three FIXMEs related to Linear_Expression resolved.

Module: ppl/ppl Branch: master Commit: 1491112a597743c630269e2c67f84eafc6b31928 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=1491112a59774...
Author: Enea Zaffanella zaffanella@cs.unipr.it Date: Sun Mar 22 17:47:33 2009 +0100
Three FIXMEs related to Linear_Expression resolved. The three operators are now friend of Linear_Expression: hence they can use the sizing constructors and limit the use of short-lived temporaries.
---
src/Linear_Expression.cc | 25 ++++++++++++++++++++++--- src/Linear_Expression.defs.hh | 6 ++++++ src/Linear_Expression.inlines.hh | 29 ++++++++++++++++++----------- 3 files changed, 46 insertions(+), 14 deletions(-)
diff --git a/src/Linear_Expression.cc b/src/Linear_Expression.cc index aabaad5..a694a15 100644 --- a/src/Linear_Expression.cc +++ b/src/Linear_Expression.cc @@ -180,13 +180,30 @@ PPL::operator-(const Linear_Expression& e1, const Linear_Expression& e2) {
/*! \relates Parma_Polyhedra_Library::Linear_Expression */ PPL::Linear_Expression +PPL::operator-(const Variable v, const Linear_Expression& e) { + const dimension_type v_space_dim = v.space_dimension(); + if (v_space_dim > Linear_Expression::max_space_dimension()) + throw std::length_error("Linear_Expression " + "PPL::operator-(v, e):\n" + "v exceeds the maximum allowed " + "space dimension."); + const dimension_type e_space_dim = e.space_dimension(); + const dimension_type space_dim = std::max(v_space_dim, e_space_dim); + Linear_Expression result(space_dim+1, false); + ++result[v_space_dim]; + for (dimension_type i = e_space_dim+1; i-- > 0; ) + result[i] -= e[i]; + return result; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression PPL::operator-(Coefficient_traits::const_reference n, const Linear_Expression& e) { Linear_Expression r(e); for (dimension_type i = e.size(); i-- > 0; ) neg_assign(r[i]); r[0] += n; - return r; }
@@ -222,7 +239,8 @@ PPL::Linear_Expression& PPL::operator+=(Linear_Expression& e, const Variable v) { const dimension_type v_space_dim = v.space_dimension(); if (v_space_dim > Linear_Expression::max_space_dimension()) - throw std::length_error("PPL::operator+=(e, v):\n" + throw std::length_error("Linear_Expression& " + "PPL::operator+=(e, v):\n" "v exceeds the maximum allowed space dimension."); const dimension_type e_size = e.size(); if (e_size <= v_space_dim) { @@ -255,7 +273,8 @@ PPL::Linear_Expression& PPL::operator-=(Linear_Expression& e, const Variable v) { const dimension_type v_space_dim = v.space_dimension(); if (v_space_dim > Linear_Expression::max_space_dimension()) - throw std::length_error("PPL::operator-=(e, v):\n" + throw std::length_error("Linear_Expression& " + "PPL::operator-=(e, v):\n" "v exceeds the maximum allowed space dimension."); const dimension_type e_size = e.size(); if (e_size <= v_space_dim) { diff --git a/src/Linear_Expression.defs.hh b/src/Linear_Expression.defs.hh index db4af74..6b1adc1 100644 --- a/src/Linear_Expression.defs.hh +++ b/src/Linear_Expression.defs.hh @@ -409,6 +409,8 @@ private: friend Linear_Expression operator+(const Linear_Expression& e, Coefficient_traits::const_reference n); friend Linear_Expression + operator+(Variable v, const Linear_Expression& e); + friend Linear_Expression operator+(Variable v, Variable w);
friend Linear_Expression @@ -422,6 +424,10 @@ private: operator-(Coefficient_traits::const_reference n, const Linear_Expression& e); friend Linear_Expression operator-(const Linear_Expression& e, Coefficient_traits::const_reference n); + friend Linear_Expression + operator-(Variable v, const Linear_Expression& e); + friend Linear_Expression + operator-(const Linear_Expression& e, Variable v);
friend Linear_Expression operator*(Coefficient_traits::const_reference n, const Linear_Expression& e); diff --git a/src/Linear_Expression.inlines.hh b/src/Linear_Expression.inlines.hh index a5da9d2..1af543a 100644 --- a/src/Linear_Expression.inlines.hh +++ b/src/Linear_Expression.inlines.hh @@ -144,8 +144,15 @@ operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) { /*! \relates Linear_Expression */ inline Linear_Expression operator+(const Variable v, const Linear_Expression& e) { - // FIXME(0.10.1): provide a better implementation. - return e + Linear_Expression(v); + const dimension_type v_space_dim = v.space_dimension(); + if (v_space_dim > Linear_Expression::max_space_dimension()) + throw std::length_error("PPL::operator+(v, e):\n" + "v exceeds the maximum allowed " + "space dimension."); + const dimension_type space_dim = std::max(v_space_dim, e.space_dimension()); + Linear_Expression result(e, space_dim+1); + ++result[v_space_dim]; + return result; }
/*! \relates Linear_Expression */ @@ -168,16 +175,16 @@ operator-(const Variable v, const Variable w) {
/*! \relates Linear_Expression */ inline Linear_Expression -operator-(const Variable v, const Linear_Expression& e) { - // FIXME(0.10.1): provide a better implementation. - return Linear_Expression(v) - e; -} - -/*! \relates Linear_Expression */ -inline Linear_Expression operator-(const Linear_Expression& e, const Variable v) { - // FIXME(0.10.1): provide a better implementation. - return e - Linear_Expression(v); + const dimension_type v_space_dim = v.space_dimension(); + if (v_space_dim > Linear_Expression::max_space_dimension()) + throw std::length_error("PPL::operator-(e, v):\n" + "v exceeds the maximum allowed " + "space dimension."); + const dimension_type space_dim = std::max(v_space_dim, e.space_dimension()); + Linear_Expression result(e, space_dim+1); + --result[v_space_dim]; + return result; }
/*! \relates Linear_Expression */
participants (1)
-
Enea Zaffanella