00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef SeExpression_h
00011 #define SeExpression_h
00012
00013 #include <string>
00014 #include <map>
00015 #include <set>
00016 #include <vector>
00017 #include <SeExprMacros.h>
00018 #include "SeVec3d.h"
00019
00020 class SeExprNode;
00021 class SeExprVarNode;
00022 class SeExprLocalVarRef;
00023 class SeExprFunc;
00024 class SeExpression;
00025
00027 class SeExprVarRef
00028 {
00029 public:
00030 virtual ~SeExprVarRef() {}
00031
00033 virtual bool isVec() = 0;
00034
00037 virtual void eval(const SeExprVarNode* node, SeVec3d& result) = 0;
00038 };
00039
00041 class SeExprVectorVarRef : public SeExprVarRef
00042 {
00043 public:
00044 virtual bool isVec() { return 1; }
00045 };
00046
00047
00049 class SeExprScalarVarRef : public SeExprVarRef
00050 {
00051 public:
00052 virtual bool isVec() { return 0; }
00053 };
00054
00056 class SeExprLocalVarRef : public SeExprVarRef
00057 {
00058 public:
00059 SeVec3d val;
00060 SeExprLocalVarRef() : _isVec(false) {}
00061 void setIsVec() { _isVec = true; }
00062 virtual void eval(const SeExprVarNode*, SeVec3d& result)
00063 { result = val; }
00064 virtual bool isVec() { return _isVec; }
00065 private:
00066 bool _isVec;
00067 };
00068
00069
00071 class SeExpression
00072 {
00073 public:
00074 typedef std::map<std::string, SeExprLocalVarRef> LocalVarTable;
00075
00077 struct Error
00078 {
00080 std::string error;
00081
00083 int startPos;
00084
00086 int endPos;
00087
00088 Error(const std::string& errorIn,const int startPosIn,const int endPosIn)
00089 :error(errorIn),startPos(startPosIn),endPos(endPosIn)
00090 {}
00091 };
00092
00093 SeExpression( );
00094 SeExpression( const std::string &e, bool wantVec=true );
00095 virtual ~SeExpression();
00096
00100 void setWantVec(bool wantVec);
00101
00104 void setExpr(const std::string& e);
00105
00107 const std::string& getExpr() const { return _expression; }
00108
00112 bool syntaxOK() const;
00113
00118 bool isValid() const;
00119
00122 const std::string& parseError() const { return _parseError; }
00123
00126 const std::vector<Error>& getErrors() const
00127 {return _errors;}
00128
00131 bool isConstant() const;
00132
00135 bool usesVar(const std::string& name) const;
00136
00139 bool usesFunc(const std::string& name) const;
00140
00142 bool isThreadSafe() const
00143 {return _threadUnsafeFunctionCalls.size()==0;}
00144
00147 void setThreadUnsafe(const std::string& functionName) const
00148 {_threadUnsafeFunctionCalls.push_back(functionName);}
00149
00151 const std::vector<std::string>& getThreadUnsafeFunctionCalls() const
00152 {return _threadUnsafeFunctionCalls;}
00153
00155 bool wantVec() const { return _wantVec; }
00156
00160 bool isVec() const;
00161
00163 SeVec3d evaluate() const;
00164
00166 void reset();
00167
00169 virtual SeExprVarRef* resolveVar(const std::string& ) const {return 0;}
00170
00172 virtual SeExprFunc* resolveFunc(const std::string& ) const {return 0;}
00173
00175 void addError(const std::string& error,const int startPos,const int endPos) const
00176 {_errors.push_back(Error(error,startPos,endPos));}
00177
00179 const LocalVarTable& getLocalVars() const {return _localVars;}
00180
00181 private:
00183 SeExpression( const SeExpression &e );
00184 SeExpression &operator=( const SeExpression &e );
00185
00187 void parse() const;
00188
00191 void prep() const;
00192
00194 void parseIfNeeded() const { if (!_parsed) parse(); }
00195
00197 void prepIfNeeded() const { if (!_prepped) prep(); }
00198
00200 bool _wantVec;
00201
00203 std::string _expression;
00204
00206 mutable SeExprNode *_parseTree;
00207
00209 mutable bool _parsed, _prepped;
00210
00212 mutable std::string _parseError;
00213
00215 mutable std::vector<Error> _errors;
00216
00218 mutable std::set<std::string> _vars;
00219
00221 mutable std::set<std::string> _funcs;
00222
00224 mutable LocalVarTable _localVars;
00225
00227 mutable std::vector<std::string> _threadUnsafeFunctionCalls;
00228
00230 mutable std::vector<char*> _stringTokens;
00231
00232 public:
00233
00235 void addVar(const char* n) const { _vars.insert(n); }
00236
00238 void addFunc(const char* n) const { _funcs.insert(n); }
00239
00241 SeExprVarRef* resolveLocalVar(const char* n) const {
00242 LocalVarTable::iterator iter = _localVars.find(n);
00243 if (iter != _localVars.end()) return &iter->second;
00244 return 0;
00245 }
00246
00249 SeExprLocalVarRef* getLocalVar(const char* n) const {
00250 return &_localVars[n];
00251 }
00252 };
00253
00254 #endif