00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef SeExprFunc_h
00011 #define SeExprFunc_h
00012
00013 #include "SeVec3d.h"
00014 #include <vector>
00015
00016 class SeExpression;
00017 class SeExprFuncNode;
00018
00020
00024 class SeExprFuncX {
00025 public:
00032 SeExprFuncX(const bool threadSafe)
00033 :_threadSafe(threadSafe)
00034 {}
00035
00037 virtual bool prep(SeExprFuncNode* node, bool wantVec);
00038
00041 virtual void eval(const SeExprFuncNode* node, SeVec3d& result) const = 0;
00042 virtual ~SeExprFuncX(){}
00043
00044 bool isThreadSafe() const {return _threadSafe;}
00045 private:
00046 bool _threadSafe;
00047 };
00048
00050
00063 class SeExprFunc {
00064 public:
00066
00068 static void init();
00070 static void loadPlugins(const char* path);
00072 static void loadPlugin(const char* path);
00073
00074
00075
00076
00077
00078 static void define(const char* name, SeExprFunc f,const char* docString);
00079 static void define(const char* name, SeExprFunc f);
00080 typedef void (*Define) (const char* name, SeExprFunc f);
00081 typedef void (*Define3) (const char* name, SeExprFunc f,const char* docString);
00082
00084 static const SeExprFunc* lookup(const std::string& name);
00085
00087 static void getFunctionNames(std::vector<std::string>& names);
00088
00090 static std::string getDocString(const char* functionName);
00091
00092 typedef double Func0();
00093 typedef double Func1(double);
00094 typedef double Func2(double, double);
00095 typedef double Func3(double, double, double);
00096 typedef double Func4(double, double, double, double);
00097 typedef double Func5(double, double, double, double, double);
00098 typedef double Func6(double, double, double, double, double, double);
00099 typedef double Func1v(const SeVec3d&);
00100 typedef double Func2v(const SeVec3d&, const SeVec3d&);
00101 typedef SeVec3d Func1vv(const SeVec3d&);
00102 typedef SeVec3d Func2vv(const SeVec3d&, const SeVec3d&);
00103 typedef double Funcn(int n, double* params);
00104 typedef double Funcnv(int n, const SeVec3d* params);
00105 typedef SeVec3d Funcnvv(int n, const SeVec3d* params);
00106
00107 enum FuncType {
00108 NONE=0,
00109
00110 FUNC0, FUNC1, FUNC2, FUNC3, FUNC4, FUNC5, FUNC6, FUNCN,
00111
00112 VEC, FUNC1V=VEC, FUNC2V, FUNCNV,
00113
00114 VECVEC, FUNC1VV=VECVEC, FUNC2VV, FUNCNVV,
00115
00116 FUNCX
00117 };
00118 bool hasVecArgs() const { return _type >= VEC; }
00119 bool isVec() const { return _type >= VECVEC; }
00120
00121 SeExprFunc() : _type(NONE), _func(0), _minargs(0), _maxargs(0) {}
00122
00124 SeExprFunc(Func0* f) : _type(FUNC0), _func((void*)f), _minargs(0), _maxargs(0) {}
00126 SeExprFunc(Func1* f) : _type(FUNC1), _func((void*)f), _minargs(1), _maxargs(1) {}
00128 SeExprFunc(Func2* f) : _type(FUNC2), _func((void*)f), _minargs(2), _maxargs(2) {}
00130 SeExprFunc(Func3* f) : _type(FUNC3), _func((void*)f), _minargs(3), _maxargs(3) {}
00132 SeExprFunc(Func4* f) : _type(FUNC4), _func((void*)f), _minargs(4), _maxargs(4) {}
00134 SeExprFunc(Func5* f) : _type(FUNC5), _func((void*)f), _minargs(5), _maxargs(5) {}
00136 SeExprFunc(Func6* f) : _type(FUNC6), _func((void*)f), _minargs(6), _maxargs(6) {}
00138 SeExprFunc(Func1v* f) : _type(FUNC1V), _func((void*)f), _minargs(1), _maxargs(1) {}
00140 SeExprFunc(Func2v* f) : _type(FUNC2V), _func((void*)f), _minargs(2), _maxargs(2) {}
00142 SeExprFunc(Func1vv* f) : _type(FUNC1VV), _func((void*)f), _minargs(1), _maxargs(1) {}
00144 SeExprFunc(Func2vv* f) : _type(FUNC2VV), _func((void*)f), _minargs(2), _maxargs(2) {}
00146 SeExprFunc(Funcn* f, int minargs, int maxargs)
00147 : _type(FUNCN), _func((void*)f), _minargs(minargs), _maxargs(maxargs) {}
00149 SeExprFunc(Funcnv* f, int minargs, int maxargs)
00150 : _type(FUNCNV), _func((void*)f), _minargs(minargs), _maxargs(maxargs) {}
00152 SeExprFunc(Funcnvv* f, int minargs, int maxargs)
00153 : _type(FUNCNVV), _func((void*)f), _minargs(minargs), _maxargs(maxargs) {}
00155 SeExprFunc(SeExprFuncX& f, int minargs=1, int maxargs=1)
00156 : _type(FUNCX), _func((void*)&f), _minargs(minargs), _maxargs(maxargs) {}
00157
00158 int type() const { return _type; }
00159 int minArgs() const { return _minargs; }
00160 int maxArgs() const { return _maxargs; }
00161 Func0* func0() const { return (Func0*)_func; }
00162 Func1* func1() const { return (Func1*)_func; }
00163 Func2* func2() const { return (Func2*)_func; }
00164 Func3* func3() const { return (Func3*)_func; }
00165 Func4* func4() const { return (Func4*)_func; }
00166 Func5* func5() const { return (Func5*)_func; }
00167 Func6* func6() const { return (Func6*)_func; }
00168 Func1v* func1v() const { return (Func1v*)_func; }
00169 Func2v* func2v() const { return (Func2v*)_func; }
00170 Func1vv* func1vv() const { return (Func1vv*)_func; }
00171 Func2vv* func2vv() const { return (Func2vv*)_func; }
00172 Funcn* funcn() const { return (Funcn*)_func; }
00173 Funcnv* funcnv() const { return (Funcnv*)_func; }
00174 Funcnvv* funcnvv() const { return (Funcnvv*)_func; }
00175 SeExprFuncX* funcx() const { return (SeExprFuncX*)_func; }
00176
00177 private:
00178 FuncType _type;
00179 void* _func;
00180 int _minargs;
00181 int _maxargs;
00182 };
00183
00184 #endif