[GIT] ppl/ppl(master): Improved functions and methods to build linear expressions.

Module: ppl/ppl Branch: master Commit: 27265c8661e2ae0daef395d8ae9fffc63102d11c URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=27265c8661e2a...
Author: Roberto Bagnara bagnara@cs.unipr.it Date: Sun Mar 22 19:38:01 2009 +0100
Improved functions and methods to build linear expressions. Avoid complex inline functions and methods.
---
src/Linear_Expression.cc | 69 +++++++++++++++++++++++++++++++++++--- src/Linear_Expression.inlines.hh | 59 -------------------------------- 2 files changed, 64 insertions(+), 64 deletions(-)
diff --git a/src/Linear_Expression.cc b/src/Linear_Expression.cc index a694a15..23b4ca1 100644 --- a/src/Linear_Expression.cc +++ b/src/Linear_Expression.cc @@ -77,6 +77,35 @@ PPL::Linear_Expression::Linear_Expression(const Congruence& cg) e[i] = cg[i]; }
+PPL::Linear_Expression::Linear_Expression(const Variable v) + : Linear_Row(v.space_dimension() <= max_space_dimension() + ? v.space_dimension() + 1 + : (throw std::length_error("PPL::Linear_Expression::" + "Linear_Expression(v):\n" + "v exceeds the maximum allowed " + "space dimension."), + v.space_dimension() + 1) + , Linear_Row::Flags()) { + ++((*this)[v.space_dimension()]); +} + +PPL::Linear_Expression::Linear_Expression(const Variable v, const Variable w) + : Linear_Row() { + const dimension_type v_space_dim = v.space_dimension(); + const dimension_type w_space_dim = w.space_dimension(); + const dimension_type space_dim = std::max(v_space_dim, w_space_dim); + if (space_dim > max_space_dimension()) + throw std::length_error("PPL::Linear_Expression::" + "Linear_Expression(v, w):\n" + "v or w exceed the maximum allowed " + "space dimension."); + construct(space_dim+1, Linear_Row::Flags()); + if (v_space_dim != w_space_dim) { + ++((*this)[v_space_dim]); + --((*this)[w_space_dim]); + } +} + /*! \relates Parma_Polyhedra_Library::Linear_Expression */ PPL::Linear_Expression PPL::operator+(const Linear_Expression& e1, const Linear_Expression& e2) { @@ -110,6 +139,21 @@ PPL::operator+(const Linear_Expression& e1, const Linear_Expression& e2) { return r; }
+/*! \relates 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 space_dim = std::max(v_space_dim, e.space_dimension()); + Linear_Expression r(e, space_dim+1); + ++r[v_space_dim]; + return r; +} + /*! \relates Parma_Polyhedra_Library::Linear_Expression */ PPL::Linear_Expression PPL::operator+(Coefficient_traits::const_reference n, @@ -189,11 +233,26 @@ PPL::operator-(const Variable v, const Linear_Expression& e) { "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; + Linear_Expression r(e, space_dim+1); + for (dimension_type i = e.size(); i-- > 0; ) + neg_assign(r[i]); + ++r[v_space_dim]; + return r; +} + +/*! \relates Linear_Expression */ +PPL::Linear_Expression +PPL::operator-(const 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("Linear_Expression " + "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 r(e, space_dim+1); + --r[v_space_dim]; + return r; }
/*! \relates Parma_Polyhedra_Library::Linear_Expression */ diff --git a/src/Linear_Expression.inlines.hh b/src/Linear_Expression.inlines.hh index 1af543a..535fa91 100644 --- a/src/Linear_Expression.inlines.hh +++ b/src/Linear_Expression.inlines.hh @@ -45,37 +45,6 @@ Linear_Expression::Linear_Expression(dimension_type sz, bool) }
inline -Linear_Expression::Linear_Expression(const Variable v) - : Linear_Row(v.space_dimension() <= max_space_dimension() - ? v.space_dimension() + 1 - : (throw std::length_error("PPL::Linear_Expression::" - "Linear_Expression(v):\n" - "v exceeds the maximum allowed " - "space dimension."), - v.space_dimension() + 1) - , Linear_Row::Flags()) { - ++((*this)[v.space_dimension()]); -} - -inline -Linear_Expression::Linear_Expression(const Variable v, const Variable w) - : Linear_Row() { - const dimension_type v_space_dim = v.space_dimension(); - const dimension_type w_space_dim = w.space_dimension(); - const dimension_type space_dim = std::max(v_space_dim, w_space_dim); - if (space_dim > max_space_dimension()) - throw std::length_error("PPL::Linear_Expression::" - "Linear_Expression(v, w):\n" - "v or w exceed the maximum allowed " - "space dimension."); - construct(space_dim+1, Linear_Row::Flags()); - if (v_space_dim != w_space_dim) { - ++((*this)[v_space_dim]); - --((*this)[w_space_dim]); - } -} - -inline Linear_Expression::Linear_Expression(const Linear_Expression& e) : Linear_Row(e) { } @@ -143,20 +112,6 @@ operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
/*! \relates Linear_Expression */ inline Linear_Expression -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("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 */ -inline Linear_Expression operator+(const Linear_Expression& e, const Variable v) { return v + e; } @@ -175,20 +130,6 @@ operator-(const Variable v, const Variable w) {
/*! \relates Linear_Expression */ inline Linear_Expression -operator-(const 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" - "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 */ -inline Linear_Expression operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) { return n * e; }
participants (1)
-
Roberto Bagnara