00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef PPL_Linear_Expression_inlines_hh
00024 #define PPL_Linear_Expression_inlines_hh 1
00025
00026 #include "Variable.defs.hh"
00027 #include "Coefficient.defs.hh"
00028 #include <stdexcept>
00029
00030 namespace Parma_Polyhedra_Library {
00031
00032 inline dimension_type
00033 Linear_Expression::max_space_dimension() {
00034 return Linear_Row::max_space_dimension();
00035 }
00036
00037 inline
00038 Linear_Expression::Linear_Expression()
00039 : Linear_Row(1, Linear_Row::Flags()) {
00040 }
00041
00042 inline
00043 Linear_Expression::Linear_Expression(dimension_type sz, bool)
00044 : Linear_Row(sz, Linear_Row::Flags()) {
00045 }
00046
00047 inline
00048 Linear_Expression::Linear_Expression(const Variable v)
00049 : Linear_Row(v.space_dimension() <= max_space_dimension()
00050 ? v.id() + 2
00051 : (throw std::length_error("PPL::Linear_Expression::"
00052 "Linear_Expression(v):\n"
00053 "v exceeds the maximum allowed "
00054 "space dimension."),
00055 v.id() + 2)
00056 , Linear_Row::Flags()) {
00057 (*this)[v.id() + 1] = 1;
00058 }
00059
00060 inline
00061 Linear_Expression::Linear_Expression(const Linear_Expression& e)
00062 : Linear_Row(e) {
00063 }
00064
00065 inline
00066 Linear_Expression::~Linear_Expression() {
00067 }
00068
00069 inline
00070 Linear_Expression::Linear_Expression(const Linear_Expression& e,
00071 dimension_type sz)
00072 : Linear_Row(e, sz, sz) {
00073 }
00074
00075 inline
00076 Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n)
00077 : Linear_Row(1, Linear_Row::Flags()) {
00078 (*this)[0] = n;
00079 }
00080
00081 inline dimension_type
00082 Linear_Expression::space_dimension() const {
00083 return size() - 1;
00084 }
00085
00086 inline Coefficient_traits::const_reference
00087 Linear_Expression::coefficient(Variable v) const {
00088 if (v.space_dimension() > space_dimension())
00089 return Coefficient_zero();
00090 return Linear_Row::coefficient(v.id());
00091 }
00092
00093 inline Coefficient_traits::const_reference
00094 Linear_Expression::inhomogeneous_term() const {
00095 return Linear_Row::inhomogeneous_term();
00096 }
00097
00098 inline const Linear_Expression&
00099 Linear_Expression::zero() {
00100 static Linear_Expression z = Linear_Expression(Coefficient_zero());
00101 return z;
00102 }
00103
00104 inline memory_size_type
00105 Linear_Expression::external_memory_in_bytes() const {
00106 return Linear_Row::external_memory_in_bytes();
00107 }
00108
00109 inline memory_size_type
00110 Linear_Expression::total_memory_in_bytes() const {
00111 return Linear_Row::total_memory_in_bytes();
00112 }
00113
00115 inline Linear_Expression
00116 operator+(const Linear_Expression& e) {
00117 return e;
00118 }
00119
00121 inline Linear_Expression
00122 operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
00123 return n + e;
00124 }
00125
00127 inline Linear_Expression
00128 operator+(const Variable v, const Variable w) {
00129
00130 return Linear_Expression(v) + Linear_Expression(w);
00131 }
00132
00134 inline Linear_Expression
00135 operator+(const Variable v, const Linear_Expression& e) {
00136
00137 return e + Linear_Expression(v);
00138 }
00139
00141 inline Linear_Expression
00142 operator+(const Linear_Expression& e, const Variable v) {
00143 return v + e;
00144 }
00145
00147 inline Linear_Expression
00148 operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
00149 return -n + e;
00150 }
00151
00153 inline Linear_Expression
00154 operator-(const Variable v, const Variable w) {
00155
00156 return Linear_Expression(v) - Linear_Expression(w);
00157 }
00158
00160 inline Linear_Expression
00161 operator-(const Variable v, const Linear_Expression& e) {
00162
00163 return Linear_Expression(v) - e;
00164 }
00165
00167 inline Linear_Expression
00168 operator-(const Linear_Expression& e, const Variable v) {
00169
00170 return e - Linear_Expression(v);
00171 }
00172
00174 inline Linear_Expression
00175 operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
00176 return n * e;
00177 }
00178
00180 inline Linear_Expression&
00181 operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
00182 e[0] += n;
00183 return e;
00184 }
00185
00187 inline Linear_Expression&
00188 operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
00189 e[0] -= n;
00190 return e;
00191 }
00192
00193 inline void
00194 Linear_Expression::swap(Linear_Expression& y) {
00195 Linear_Row::swap(y);
00196 }
00197
00198 }
00199
00200
00201 namespace std {
00202
00204 inline void
00205 swap(Parma_Polyhedra_Library::Linear_Expression& x,
00206 Parma_Polyhedra_Library::Linear_Expression& y) {
00207 x.swap(y);
00208 }
00209
00210 }
00211
00212 #endif // !defined(PPL_Linear_Expression_inlines_hh)