00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __BINARYCONTROLOP__
00023 #define __BINARYCONTROLOP__
00024
00025 #include "Processing.hxx"
00026 #include "InControl.hxx"
00027 #include "OutControl.hxx"
00028 #include <iosfwd>
00029
00030 namespace CLAM {
00031
00032 class BinaryControlOpConfig: public ProcessingConfig
00033 {
00034 public:
00035 DYNAMIC_TYPE_USING_INTERFACE (BinaryControlOpConfig, 1,ProcessingConfig);
00036
00037 DYN_ATTRIBUTE (0, public, std::string, Name);
00038
00039 protected:
00040
00041 void DefaultInit()
00042 {
00043 AddName();
00044 UpdateData();
00045 }
00046 };
00047
00048 template < typename BinOp >
00049 class BinaryControlOp:public Processing
00050 {
00051 private:
00052 TControlData mOutValue;
00053 TControlData mFirstParmLastValue;
00054 TControlData mSecondParmLastValue;
00055 OutControl mOutput;
00056 BinaryControlOpConfig mConfig;
00057 BinOp mOperation;
00058
00059 inline const char *GetClassName() const;
00060
00061 int HandleFirst( TControlData incoming_parm )
00062 {
00063 mFirstParmLastValue = incoming_parm;
00064 mOutValue = DoOperation();
00065 Do();
00066 return 1 ;
00067 }
00068
00069 int HandleSecond( TControlData incoming_parm )
00070 {
00071 mSecondParmLastValue = incoming_parm;
00072 mOutValue = DoOperation();
00073 Do();
00074 return 1;
00075 }
00076
00077 public:
00078 InControlTmpl< BinaryControlOp > mFirst;
00079 InControlTmpl< BinaryControlOp > mSecond;
00080
00081 BinaryControlOp()
00082 : mOutValue(0),
00083 mFirstParmLastValue( BinOp::IdentityElement ),
00084 mSecondParmLastValue(BinOp::IdentityElement),
00085 mOutput( "output", this ),
00086 mFirst( "first_parm", this, &BinaryControlOp::HandleFirst ),
00087 mSecond( "second_parm", this, &BinaryControlOp::HandleSecond )
00088 {
00089 Configure( BinaryControlOpConfig() );
00090 }
00091
00092 BinaryControlOp(const BinaryControlOpConfig& cfg)
00093 : mOutValue(0),
00094 mFirstParmLastValue( BinOp::IdentityElement ),
00095 mSecondParmLastValue(BinOp::IdentityElement),
00096 mOutput( "output", this ),
00097 mFirst( "first_parm", this, &BinaryControlOp::HandleFirst ),
00098 mSecond( "second_parm", this, &BinaryControlOp::HandleSecond )
00099 {
00100 Configure(cfg);
00101 }
00102
00103 bool ConcreteConfigure(const ProcessingConfig& c)
00104 {
00105 CopyAsConcreteConfig(mConfig, c);
00106 return true;
00107 }
00108
00109 const ProcessingConfig &GetConfig() const { return mConfig;};
00110
00111 TControlData DoOperation()
00112 {
00113 return mOperation( mFirstParmLastValue, mSecondParmLastValue );
00114 }
00115
00116 bool Do(void)
00117 {
00118 mOutput.SendControl( mOutValue );
00119 return true ;
00120 }
00121 };
00122
00123 template < typename BinOp >
00124 inline const char *BinaryControlOp<BinOp>::GetClassName() const { return "BinaryControlOperation"; }
00125
00126 }
00127
00128 #endif // BinaryControlOp.hxx
00129