TypedInControl.hxx

Go to the documentation of this file.
00001 #ifndef _TypedInControl_
00002 #define _TypedInControl_
00003 
00004 #include <string>
00005 #include <list>
00006 #include <typeinfo>
00007 #include <CLAM/BaseTypedInControl.hxx>
00008 #include <CLAM/BaseTypedOutControl.hxx>
00009 
00010 namespace CLAM {
00011         class Processing;
00012         class BaseTypedOutControl;
00013 
00014         template<class TypedControlData>
00015         class TypedOutControl;
00016         
00017         template<class TypedControlData>
00018         class TypedInControl : public BaseTypedInControl
00019         {
00020                 
00021         protected:
00022                 TypedControlData mLastValue;
00023                 std::list< BaseTypedOutControl * > mLinks;
00024                 
00025         public:
00026                 TypedInControl(const std::string &name = "unnamed typed in control", Processing * proc = 0);
00027                 ~TypedInControl();
00028                 
00029                 void DoControl(const TypedControlData& val);
00030                 const TypedControlData& GetLastValue() const;
00032                 bool GetLastValueAsBoolean() const 
00033                 { 
00034                         return (mLastValue > 0) ? mLastValue>0.01 : mLastValue<-0.01;
00035                 };
00037                 int GetLastValueAsInteger() const { return (int)(mLastValue+0.5f); };
00038                 
00039                 bool IsConnected() const;
00040                 
00041                 // For the typed linking check
00042                 virtual const std::type_info& ControlType() const { return typeid(TypedControlData); };
00044                 void OutControlInterface_AddLink(TypedOutControl<TypedControlData> & outControl);
00046                 void OutControlInterface_RemoveLink(TypedOutControl<TypedControlData> & outControl);
00047         }; // End TypedInControl Class
00048         
00049         // TypedInControl Class Implementation
00050         template<class TypedControlData>
00051         TypedInControl<TypedControlData>::TypedInControl(const std::string &name, Processing * proc)
00052                 : BaseTypedInControl(name,proc)
00053         {
00054         }
00055         
00056         template<class TypedControlData>
00057         TypedInControl<TypedControlData>::~TypedInControl()
00058         {
00059                 while (!mLinks.empty())
00060                         mLinks.front()->RemoveLink(*this);
00061         }
00062 
00063         template<class TypedControlData>
00064         void TypedInControl<TypedControlData>::DoControl(const TypedControlData& val)
00065         {
00066                 mLastValue = val;
00067         }
00068 
00069         template<class TypedControlData>
00070         const TypedControlData& TypedInControl<TypedControlData>::GetLastValue() const
00071         {
00072                 return mLastValue;
00073         }
00074 
00075         template<class TypedControlData>
00076         bool TypedInControl<TypedControlData>::IsConnected() const
00077         {
00078                 return !mLinks.empty();
00079         }
00080 
00081         template<class TypedControlData>
00082         void TypedInControl<TypedControlData>::OutControlInterface_AddLink(TypedOutControl<TypedControlData> & outControl)
00083         {
00084                 mLinks.push_back(&outControl);
00085         }
00086 
00087         template<class TypedControlData>
00088         void TypedInControl<TypedControlData>::OutControlInterface_RemoveLink(TypedOutControl<TypedControlData> & outControl)
00089         {
00090                 mLinks.remove(&outControl);
00091         }
00092         
00093         
00100         template<class TypedControlData, class ProcObj>
00101         class CascadingTypedInControl : public TypedInControl<TypedControlData>
00102         {
00103                 public:
00104                         typedef int (ProcObj::*TPtrMemberFunc)(TypedControlData);
00105                         typedef int (ProcObj::*TPtrMemberFuncId)(int,TypedControlData);
00106 
00107                 private:
00108                         TPtrMemberFunc   mFunc;
00109                         TPtrMemberFuncId mFuncId;
00110                         ProcObj* mProcObj;
00111                         int mId;
00112                 
00113                 public:
00114                         // redeclaration
00115                         void DoControl(const TypedControlData& val);
00116 
00117                         bool ExistMemberFunc() { return (mFunc==0); };
00118                         void SetMemberFunc(TPtrMemberFunc f) { mFunc = f; };
00119 
00120                         int GetId(void) const { return mId; }
00121         
00129                 CascadingTypedInControl(const std::string &name, ProcObj* processing, TPtrMemberFunc f = 0)     :
00130                                 TypedInControl<TypedControlData>(name,processing),
00131                                 mFunc(f),
00132                                 mFuncId(0),
00133                                 mProcObj(processing)
00134                 {
00135                 };
00136                 
00137                 CascadingTypedInControl(int id,const std::string &name, ProcObj* processing, TPtrMemberFuncId f)
00138                         : TypedInControl<TypedControlData>(name,processing)
00139                         , mFunc(0)
00140                         , mFuncId(f)
00141                         , mProcObj(processing)
00142                         , mId(id)
00143                 {
00144                 };
00145 
00146                 ~CascadingTypedInControl(){};
00147                 
00148         };
00149 
00151         //  Implementation of class CascadingTypedInControl
00152         //
00153         template<class TypedControlData, class ProcObj>
00154         void CascadingTypedInControl<TypedControlData, ProcObj>::DoControl(const TypedControlData& val)
00155         {
00156                 TypedInControl<TypedControlData>::DoControl(val);
00157                 if(mFunc)
00158                         (mProcObj->*mFunc)(val);
00159                 else if (mFuncId)
00160                         (mProcObj->*mFuncId)(mId,val);
00161         }
00162         
00163 } // End namespace CLAM
00164 #endif // _TypedInControl_

Generated on Tue Aug 12 22:33:45 2008 for CLAM by  doxygen 1.5.5