CLAM-Development
1.1
|
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_