00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MULTI_LINEAR_FORM_EXPRESSION_HPP
00021 #define MULTI_LINEAR_FORM_EXPRESSION_HPP
00022
00023 #include <Expression.hpp>
00024 #include <MultiLinearExpressionSum.hpp>
00025
00026 #include <BoundaryExpression.hpp>
00027
00028 #include <Stringify.hpp>
00029 #include <ErrorHandler.hpp>
00030
00031
00032 class MultiLinearFormExpression
00033 : public Expression
00034 {
00035 public:
00036 enum FormType {
00037 oneD,
00038 twoD,
00039 threeD
00040 };
00041
00042 private:
00043 ReferenceCounting<BoundaryExpression> __boundary;
00044 ReferenceCounting<MultiLinearExpressionSum> __multiLinearExpression;
00045 const FormType __formType;
00046
00047 std::ostream& put(std::ostream& os) const
00048 {
00049 switch(__formType) {
00050 case oneD: {
00051 os << "int1d(";
00052 break;
00053 }
00054 case twoD: {
00055 os << "int2d(" << *__boundary << ")(";
00056 break;
00057 }
00058 case threeD: {
00059 os << "int3d(";
00060 break;
00061 }
00062 default: {
00063 throw ErrorHandler(__FILE__,__LINE__,
00064 "not implemented",
00065 ErrorHandler::unexpected);
00066 }
00067 }
00068
00069 os << *__multiLinearExpression << ')';
00070
00071 return os;
00072 }
00073
00074 public:
00075 bool hasPOVBoundary() const
00076 {
00077 if (__boundary != 0)
00078 return (*__boundary).hasPOVBoundary();
00079 else
00080 return false;
00081 }
00082
00083 ReferenceCounting<BoundaryExpression> boundaryExpression()
00084 {
00085 return __boundary;
00086 }
00087
00088 ReferenceCounting<MultiLinearExpressionSum> multiLinearExpression()
00089 {
00090 return __multiLinearExpression;
00091 }
00092
00093 void execute()
00094 {
00095 (*__multiLinearExpression).execute();
00096 if(__boundary != 0) {
00097 (*__boundary).execute();
00098 }
00099 }
00100
00101 const FormType& formType() const
00102 {
00103 return __formType;
00104 }
00105
00106 MultiLinearFormExpression(ReferenceCounting<MultiLinearExpressionSum> me,
00107 const FormType t,
00108 ReferenceCounting<BoundaryExpression> b = 0)
00109 : Expression(Expression::multiLinearForm),
00110 __boundary(b),
00111 __multiLinearExpression(me),
00112 __formType(t)
00113 {
00115 (*me).check();
00116 }
00117
00118 MultiLinearFormExpression(const MultiLinearFormExpression& m)
00119 : Expression(m),
00120 __boundary(m.__boundary),
00121 __multiLinearExpression(m.__multiLinearExpression),
00122 __formType(m.__formType)
00123 {
00124 ;
00125 }
00126
00127 ~MultiLinearFormExpression()
00128 {
00129 ;
00130 }
00131 };
00132
00133
00134 class MultiLinearFormSumExpression
00135 : public Expression
00136 {
00137 private:
00138 typedef std::list<ReferenceCounting<MultiLinearFormExpression> > ListType;
00139
00140 public:
00141 typedef ListType::iterator iterator;
00142
00143 private:
00144 ListType __listPlus;
00145 ListType __listMinus;
00146
00147 std::ostream& put(std::ostream& os) const
00148 {
00149 bool first = true;
00150
00151 for (ListType::const_iterator i = __listPlus.begin();
00152 i != __listPlus.end(); ++i) {
00153 if (!first) {
00154 os << '+';
00155 } else {
00156 first = false;
00157 }
00158 os << *(*i);
00159 }
00160
00161 for (ListType::const_iterator i = __listMinus.begin();
00162 i != __listMinus.end(); ++i) {
00163 os << '-' << *(*i);
00164 }
00165
00166 return os;
00167 }
00168
00169 public:
00170 bool hasPOVBoundary() const
00171 {
00172 for (ListType::const_iterator i = __listMinus.begin();
00173 i != __listMinus.end(); ++i) {
00174 if ((**i).hasPOVBoundary()) return true;
00175 }
00176
00177 for (ListType::const_iterator i = __listPlus.begin();
00178 i != __listPlus.end(); ++i) {
00179 if ((**i).hasPOVBoundary()) return true;
00180 }
00181
00182 return false;
00183 }
00184
00185 void clear()
00186 {
00187 __listPlus.clear();
00188 __listMinus.clear();
00189 }
00190
00191 const MultiLinearFormSumExpression&
00192 operator-=(MultiLinearFormSumExpression& M)
00193 {
00194 for (MultiLinearFormSumExpression::iterator i = M.plusBegin();
00195 i != M.plusEnd(); ++i) {
00196 __listMinus.push_back(*i);
00197 }
00198
00199 for (MultiLinearFormSumExpression::iterator i = M.minusBegin();
00200 i != M.minusEnd(); ++i) {
00201 __listPlus.push_back(*i);
00202 }
00203
00204 return *this;
00205 }
00206
00207 MultiLinearFormSumExpression::iterator
00208 plusBegin()
00209 {
00210 return __listPlus.begin();
00211 }
00212
00213 MultiLinearFormSumExpression::iterator
00214 plusEnd()
00215 {
00216 return __listPlus.end();
00217 }
00218
00219
00220 MultiLinearFormSumExpression::iterator
00221 minusBegin()
00222 {
00223 return __listMinus.begin();
00224 }
00225
00226 MultiLinearFormSumExpression::iterator
00227 minusEnd()
00228 {
00229 return __listMinus.end();
00230 }
00231
00232 void execute()
00233 {
00234 for (ListType::iterator i = __listPlus.begin();
00235 i != __listPlus.end(); ++i) {
00236 (*(*i)).execute();
00237 }
00238
00239 for (ListType::iterator i = __listMinus.begin();
00240 i != __listMinus.end(); ++i) {
00241 (*(*i)).execute();
00242 }
00243 }
00244
00245 void plus(ReferenceCounting<MultiLinearFormExpression> ml)
00246 {
00247 __listPlus.push_back(ml);
00248 }
00249
00250 void minus(ReferenceCounting<MultiLinearFormExpression> ml)
00251 {
00252 __listMinus.push_back(ml);
00253 }
00254
00255 MultiLinearFormSumExpression()
00256 : Expression(Expression::multiLinearFormSum)
00257 {
00258 ;
00259 }
00260
00261 MultiLinearFormSumExpression(const MultiLinearFormSumExpression& m)
00262 : Expression(m),
00263 __listPlus(m.__listPlus),
00264 __listMinus(m.__listMinus)
00265 {
00266 ;
00267 }
00268
00269 ~MultiLinearFormSumExpression()
00270 {
00271 ;
00272 }
00273
00274 };
00275
00276 #endif // MULTI_LINEAR_FORM_EXPRESSION_HPP
00277