functions.h

00001 #ifndef AFL_FUNCTIONS_H
00002 #define AFL_FUNCTIONS_H
00003 
00004 #include "afltypes.h"
00005 
00006 #include "basisinterpolator_1.h"
00007 #include "basisinterpolator_2.h"
00008 #include "basisinterpolator_3.h"
00009 #include "basisinterpolator_4.h"
00010 
00011 #include "functioniterator.h"
00012 
00013 #include <string>
00014 
00015 namespace afl
00016 {
00017     class CompositeField;
00021     class Function
00022     {
00023         public:
00027             struct Context
00028             {
00032                 Context(  );
00033 
00037                 size_t row;
00038 
00042                 size_t column;
00043             };
00044 
00045             virtual ~Function();
00052             virtual data_t evaluate( const Point& p, Context* ctxt = NULL ) const = 0;
00053             
00058             virtual void serialise( std::ostream& doc ) const = 0;
00059 
00063             virtual Function* clone(  ) const = 0;
00064 
00068             typedef FunctionIterator iterator;
00069 
00073             iterator begin(  ) { return iterator(this); }
00074 
00078             iterator end(  ) { return iterator(NULL); }
00079 
00080         private:
00081             friend class FunctionIterator;
00085             size_t getNumArgs(  ) const { return _args.size(); }
00086 
00091             Function* getArg( size_t argNum ) { return _args[argNum]; }
00092 
00093         protected:
00097             std::vector<Function*> _args;
00098     };
00099     
00103     class FieldFn : public Function
00104     {
00105         public:
00110             FieldFn( const Field* field, Function* arg );
00111             
00117             FieldFn( const Field* field, Function* arg1, Function* arg2 );
00118 
00125             FieldFn( const Field* field, Function* arg1, Function* arg2, Function* arg3 );
00126             
00134             FieldFn( const Field* field, Function* arg1, Function* arg2, Function* arg3, Function* arg4 );
00135             
00142             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00143             
00148             virtual void serialise( std::ostream& doc ) const;
00149 
00153             virtual Function* clone(  ) const;
00154 
00155 
00156         private:
00157             const Field* _f;
00158             size_t _row;
00159             size_t _col;
00160     };
00161 
00165     class Negate : public Function
00166     {
00167         public:
00171             Negate( Function* arg );
00172             
00179             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00180             
00185             virtual void serialise( std::ostream& doc ) const;
00186 
00190             virtual Function* clone(  ) const;
00191     };
00192 
00196     class Argument : public Function
00197     {
00198         public:
00202             Argument( aspectid_t aspect );
00203             
00210             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00211             
00216             virtual void serialise( std::ostream& doc ) const;
00217 
00221             virtual Function* clone(  ) const;
00222 
00223         private:
00224             aspectid_t _aspect;
00225             size_t _axis;
00226     };
00227 
00231     class BasisArgument : public Function
00232     {
00233         public:
00237             BasisArgument( size_t index );
00238             
00245             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const = 0;
00246             
00251             virtual void serialise( std::ostream& doc ) const;
00252 
00256             virtual Function* clone(  ) const = 0;
00257 
00258         protected:
00262             size_t _u;
00263     };
00264 
00268     class BasisArgument_1 : public BasisArgument
00269     {
00270         public:
00276             BasisArgument_1( const BasisInterpolator_1* interp, size_t index );
00277         
00284             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00285             
00289             virtual Function* clone(  ) const;
00290 
00291         private: 
00292             friend class BasisInterpolator_1;
00293 
00294             const BasisInterpolator_1* _interp;
00295     };
00296 
00300     class BasisArgument_2 : public BasisArgument
00301     {
00302         public:
00308             BasisArgument_2( const BasisInterpolator_2* interp, size_t index );
00309         
00316             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00317             
00321             virtual Function* clone(  ) const;
00322 
00323         private: 
00324             friend class BasisInterpolator_2;
00325 
00326             const BasisInterpolator_2* _interp;
00327     };
00328 
00332     class BasisArgument_3 : public BasisArgument
00333     {
00334         public:
00340             BasisArgument_3( const BasisInterpolator_3* interp, size_t index );
00341         
00348             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00349             
00353             virtual Function* clone(  ) const;
00354 
00355         private: 
00356             friend class BasisInterpolator_3;
00357 
00358             const BasisInterpolator_3* _interp;
00359     };
00360 
00364     class BasisArgument_4 : public BasisArgument
00365     {
00366         public:
00372             BasisArgument_4( const BasisInterpolator_4* interp, size_t index );
00373         
00380             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00381             
00385             virtual Function* clone(  ) const;
00386 
00387         private: 
00388             friend class BasisInterpolator_4;
00389 
00390             const BasisInterpolator_4* _interp;
00391     };
00392 
00396     class KsiBasisArgument_1 : public BasisArgument
00397     {
00398         public:
00404             KsiBasisArgument_1( const BasisInterpolator_1* interp, size_t index );
00405         
00412             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00413             
00418             virtual void serialise( std::ostream& doc ) const;
00419 
00423             virtual Function* clone(  ) const;
00424 
00425         private: 
00426             friend class BasisInterpolator_1;
00427 
00428             const BasisInterpolator_1* _interp;
00429     };
00430 
00434     class KsiBasisArgument_2 : public BasisArgument
00435     {
00436         public:
00442             KsiBasisArgument_2( const BasisInterpolator_2* interp, size_t index );
00443         
00450             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00451             
00456             virtual void serialise( std::ostream& doc ) const;
00457 
00461             virtual Function* clone(  ) const;
00462 
00463         private: 
00464             friend class BasisInterpolator_2;
00465 
00466             const BasisInterpolator_2* _interp;
00467     };
00468 
00472     class KsiBasisArgument_3 : public BasisArgument
00473     {
00474         public:
00480             KsiBasisArgument_3( const BasisInterpolator_3* interp, size_t index );
00481         
00488             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00489             
00494             virtual void serialise( std::ostream& doc ) const;
00495 
00499             virtual Function* clone(  ) const;
00500 
00501         private: 
00502             friend class BasisInterpolator_3;
00503 
00504             const BasisInterpolator_3* _interp;
00505     };
00506 
00510     class KsiBasisArgument_4 : public BasisArgument
00511     {
00512         public:
00518             KsiBasisArgument_4( const BasisInterpolator_4* interp, size_t index );
00519         
00526             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00527             
00532             virtual void serialise( std::ostream& doc ) const;
00533 
00537             virtual Function* clone(  ) const;
00538 
00539         private: 
00540             friend class BasisInterpolator_4;
00541 
00542             const BasisInterpolator_4* _interp;
00543     };
00544 
00548     class Constant : public Function
00549     {
00550         public:
00554             Constant( data_t val );
00555             
00562             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00563             
00568             virtual void serialise( std::ostream& doc ) const;
00569 
00573             virtual Function* clone(  ) const;
00574 
00575         private:
00576             data_t _val;
00577     };
00578 
00582     class Sum : public Function
00583     {
00584         public:
00589             Sum( Function* arg1, Function* arg2 );
00590             
00597             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00598             
00603             virtual void serialise( std::ostream& doc ) const;
00604 
00608             virtual Function* clone(  ) const;
00609     };
00610 
00614     class Subtract : public Function
00615     {
00616         public:
00621             Subtract( Function* arg1, Function* arg2 );
00622             
00629             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00630             
00635             virtual void serialise( std::ostream& doc ) const;
00636 
00640             virtual Function* clone(  ) const;
00641     };
00642 
00646     class Multiply : public Function
00647     {
00648         public:
00653             Multiply( Function* arg1, Function* arg2 );
00654 
00661             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00662             
00667             virtual void serialise( std::ostream& doc ) const;
00668 
00672             virtual Function* clone(  ) const;
00673     };
00674 
00678     class Divide : public Function
00679     {
00680         public:
00685             Divide( Function* arg1, Function* arg2 );
00686 
00693             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00694             
00699             virtual void serialise( std::ostream& doc ) const;
00700 
00704             virtual Function* clone(  ) const;
00705     };
00706 
00710     class Power : public Function
00711     {
00712         public:
00717             Power( Function* arg1, Function* arg2 );
00718 
00725             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00726             
00731             virtual void serialise( std::ostream& doc ) const;
00732 
00736             virtual Function* clone(  ) const;
00737     };
00738 
00742     class OnTopOf : public Function
00743     {
00744         public:
00749             OnTopOf( Function* arg1, Function* arg2 );
00750             
00757             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00758             
00763             virtual void serialise( std::ostream& doc ) const;
00764 
00768             virtual Function* clone(  ) const;
00769     };
00770 
00774     class Sin : public Function
00775     {
00776         public:
00780             Sin( Function* arg );
00781 
00788             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00789             
00794             virtual void serialise( std::ostream& doc ) const;
00795 
00799             virtual Function* clone(  ) const;
00800     };
00801 
00802 
00806     class ArcSin : public Function
00807     {
00808         public:
00812             ArcSin( Function* arg );
00813 
00820             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00821             
00826             virtual void serialise( std::ostream& doc ) const;
00827 
00831             virtual Function* clone(  ) const;
00832     };
00833 
00837     class Cos : public Function
00838     {
00839         public:
00843             Cos( Function* arg );
00844 
00851             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00852             
00857             virtual void serialise( std::ostream& doc ) const;
00858 
00862             virtual Function* clone(  ) const;
00863     };
00864 
00868     class ArcCos : public Function
00869     {
00870         public:
00874             ArcCos( Function* arg );
00875             
00882             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00883             
00888             virtual void serialise( std::ostream& doc ) const;
00889 
00893             virtual Function* clone(  ) const;
00894     };
00895 
00899     class Tan : public Function
00900     {
00901         public:
00905             Tan( Function* arg );
00906             
00913             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00914             
00919             virtual void serialise( std::ostream& doc ) const;
00920 
00924             virtual Function* clone(  ) const;
00925     };
00926 
00930     class ArcTan : public Function
00931     {
00932         public:
00936             ArcTan( Function* arg );
00937             
00944             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00945             
00950             virtual void serialise( std::ostream& doc ) const;
00951 
00955             virtual Function* clone(  ) const;
00956     };
00957 
00961     class Cot : public Function
00962     {
00963         public:
00967             Cot( Function* arg );
00968             
00975             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
00976             
00981             virtual void serialise( std::ostream& doc ) const;
00982 
00986             virtual Function* clone(  ) const;
00987     };
00988 
00992     class Ln : public Function
00993     {
00994         public:
00998             Ln( Function* arg );
00999 
01006             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
01007             
01012             virtual void serialise( std::ostream& doc ) const;
01013 
01017             virtual Function* clone(  ) const;
01018     };
01019     
01023     class Exp : public Function
01024     {
01025         public:
01029             Exp( Function* arg );
01030 
01037             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
01038             
01043             virtual void serialise( std::ostream& doc ) const;
01044 
01048             virtual Function* clone(  ) const;
01049     };
01050 
01051     
01055     class Sqrt : public Function
01056     {
01057         public:
01061             Sqrt( Function* arg );
01062             
01069             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
01070             
01075             virtual void serialise( std::ostream& doc ) const;
01076 
01080             virtual Function* clone(  ) const;
01081     };
01082 
01086     class Abs : public Function
01087     {
01088         public:
01092             Abs( Function* arg );
01093             
01100             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
01101             
01106             virtual void serialise( std::ostream& doc ) const;
01107 
01111             virtual Function* clone(  ) const;
01112     };
01113 
01117     class Min : public Function
01118     {
01119         public:
01124             Min( Function* arg1, Function* arg2 );
01125 
01132             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
01133             
01138             virtual void serialise( std::ostream& doc ) const;
01139 
01143             virtual Function* clone(  ) const;
01144     };
01145 
01149     class Max : public Function
01150     {
01151         public:
01156             Max( Function* arg1, Function* arg2 );
01157 
01164             virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const;
01165             
01170             virtual void serialise( std::ostream& doc ) const;
01171 
01175             virtual Function* clone(  ) const;
01176     };
01177 
01184     Function* parseFunction( const std::string& expression );
01185 
01193     Function* parseFunction( const std::string& expression, const CompositeField* cntxt );
01194 
01202     Function* parseFunction( const std::string& expression, const BasisInterpolator_1* cntxt );
01203 
01211     Function* parseFunction( const std::string& expression, const BasisInterpolator_2* cntxt );
01212 
01220     Function* parseFunction( const std::string& expression, const BasisInterpolator_3* cntxt );
01221 
01229     Function* parseFunction( const std::string& expression, const BasisInterpolator_4* cntxt );
01230 }
01231 
01232 #endif

Generated on Fri Dec 22 07:17:50 2006 for afl by  doxygen 1.4.6