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