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
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 };
00048
00049
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
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
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 }
00164 #endif // _TypedInControl_