00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef FUNCTION_EXPRESSION_MESH_REFERENCES_HPP
00021 #define FUNCTION_EXPRESSION_MESH_REFERENCES_HPP
00022
00023 #include <FunctionExpression.hpp>
00024 #include <RealExpression.hpp>
00025
00026 #include <vector>
00036 class FunctionExpressionMeshReferences
00037 : public FunctionExpression
00038 {
00039 public:
00049 class ReferencesSet
00050 {
00051 friend class FunctionExpressionMeshReferences;
00052
00053 public:
00054 typedef std::vector<std::pair<ReferenceCounting<RealExpression>,
00055 ReferenceCounting<FunctionExpression> > >
00056 FunctionReferences;
00059 private:
00060 FunctionReferences __functionReferences;
00062 public:
00069 FunctionReferences& functionReferences()
00070 {
00071 return __functionReferences;
00072 }
00073
00080 bool hasBoundaryExpression() const
00081 {
00082 bool found = false;
00083 for (FunctionReferences::const_iterator i = __functionReferences.begin();
00084 i != __functionReferences.end(); ++i) {
00085 found = (*(*i).second).hasBoundaryExpression();
00086 }
00087 return found;
00088 }
00089
00098 friend std::ostream& operator << (std::ostream& os, const ReferencesSet& r)
00099 {
00100 FunctionReferences::const_iterator i = r.__functionReferences.begin();
00101 if (i != r.__functionReferences.end())
00102 os << *i->first << ':' << *i->second;
00103 i++;
00104 for (; i != r.__functionReferences.end(); ++i) {
00105 os << ',' << *i->first << ':' << *i->second;
00106 }
00107 return os;
00108 }
00109
00114 void execute()
00115 {
00116 for (FunctionReferences::iterator i = __functionReferences.begin();
00117 i != __functionReferences.end(); ++i) {
00118 RealExpression* r = i->first;
00119 r->execute();
00120 i->second->execute();
00121 }
00122 }
00123
00130 void add(ReferenceCounting<RealExpression> ref,
00131 ReferenceCounting<FunctionExpression> function)
00132 {
00133 __functionReferences.push_back(std::make_pair(ref, function));
00134 }
00135
00142 ReferencesSet(ReferenceCounting<RealExpression> ref,
00143 ReferenceCounting<FunctionExpression> function)
00144 {
00145 __functionReferences.push_back(std::make_pair(ref, function));
00146 }
00147
00153 ReferencesSet(const ReferencesSet& r)
00154 : __functionReferences(r.__functionReferences)
00155 {
00156 ;
00157 }
00158
00163 ~ReferencesSet()
00164 {
00165 ;
00166 }
00167 };
00168
00169 enum ItemType {
00170 element,
00171 vertex,
00172 undefined
00173 };
00174
00175 private:
00176 std::string __itemName;
00178 ReferenceCounting<MeshExpression> __mesh;
00179 ReferenceCounting<ReferencesSet> __referenceSet;
00186 ItemType __getItemType();
00187
00188 std::ostream& put(std::ostream& os) const;
00189 public:
00194 void execute();
00195
00203 FunctionExpressionMeshReferences(const std::string itemName,
00204 ReferenceCounting<MeshExpression> mesh,
00205 ReferenceCounting<ReferencesSet> ref);
00206
00212 FunctionExpressionMeshReferences(const FunctionExpressionMeshReferences& f);
00213
00218 ~FunctionExpressionMeshReferences();
00219 };
00220
00221
00222 #endif // FUNCTION_EXPRESSION_MESH_REFERENCES_HPP