fastdelegate.h.svn-base

来自「ffshow源码」· SVN-BASE 代码 · 共 1,415 行 · 第 1/5 页

SVN-BASE
1,415
字号
// Implicit conversion to "bool" is achieved using the safe_bool idiom,// using member data pointers (MDP). This allows "if (dg)..." syntax// Because some compilers (eg codeplay) don't have a unique value for a zero// MDP, an extra padding member is added to the SafeBool struct.// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so// in that case the static function constructor is not made explicit; this// allows "if (dg==0) ..." to compile.//N=0template<class RetType=detail::DefaultVoid>class FastDelegate0 {private:	typedef typename detail::DefaultVoidToVoid<RetType>::type DesiredRetType;	typedef DesiredRetType (*StaticFunctionPtr)();	typedef RetType (*UnvoidStaticFunctionPtr)();	typedef RetType (detail::GenericClass::*GenericMemFn)();	typedef detail::ClosurePtr<GenericMemFn, StaticFunctionPtr, UnvoidStaticFunctionPtr> ClosureType;	ClosureType m_Closure;public:	// Typedefs to aid generic programming	typedef FastDelegate0 type;	// Construction and comparison functions	FastDelegate0() { clear(); }	FastDelegate0(const FastDelegate0 &x) {		m_Closure.CopyFrom(this, x.m_Closure); }	void operator = (const FastDelegate0 &x)  {		m_Closure.CopyFrom(this, x.m_Closure); }	bool operator ==(const FastDelegate0 &x) const {		return m_Closure.IsEqual(x.m_Closure);	}	bool operator !=(const FastDelegate0 &x) const {		return !m_Closure.IsEqual(x.m_Closure); }	bool operator <(const FastDelegate0 &x) const {		return m_Closure.IsLess(x.m_Closure);	}	bool operator >(const FastDelegate0 &x) const {		return x.m_Closure.IsLess(m_Closure);	}	// Binding to non-const member functions	template < class X, class Y >	FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) {		m_Closure.bindmemfunc(detail::implicit_cast<X*>(pthis), function_to_bind); }	template < class X, class Y >	inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) {		m_Closure.bindmemfunc(detail::implicit_cast<X*>(pthis), function_to_bind);	}	// Binding to const member functions.	template < class X, class Y >	FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) {		m_Closure.bindconstmemfunc(detail::implicit_cast<const X*>(pthis), function_to_bind);	}	template < class X, class Y >	inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) {		m_Closure.bindconstmemfunc(detail::implicit_cast<const X *>(pthis), function_to_bind);	}	// Static functions. We convert them into a member function call.	// This constructor also provides implicit conversion	FastDelegate0(DesiredRetType (*function_to_bind)() ) {		bind(function_to_bind);	}	// for efficiency, prevent creation of a temporary	void operator = (DesiredRetType (*function_to_bind)() ) {		bind(function_to_bind);	}	inline void bind(DesiredRetType (*function_to_bind)()) {		m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, 			function_to_bind); }	// Invoke the delegate	RetType operator() () const {	return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); }	// Implicit conversion to "bool" using the safe_bool idiomprivate:	typedef struct SafeBoolStruct {		int a_data_pointer_to_this_is_0_on_buggy_compilers;		StaticFunctionPtr m_nonzero;	} UselessTypedef;    typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type;public:	operator unspecified_bool_type() const {        return empty()? 0: &SafeBoolStruct::m_nonzero;    }	// necessary to allow ==0 to work despite the safe_bool idiom	inline bool operator==(StaticFunctionPtr funcptr) {		return m_Closure.IsEqualToStaticFuncPtr(funcptr);	}	inline bool operator!=(StaticFunctionPtr funcptr) { 		return !m_Closure.IsEqualToStaticFuncPtr(funcptr);    }	inline bool operator ! () const	{	// Is it bound to anything?			return !m_Closure; }	inline bool empty() const	{			return !m_Closure; }	void clear() { m_Closure.clear();}	// Conversion to and from the DelegateMemento storage class	const DelegateMemento & GetMemento() { return m_Closure; }	void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); }private:	// Invoker for static functions	RetType InvokeStaticFunction() const {	return (*(m_Closure.GetStaticFunction()))(); }};//N=1template<class Param1, class RetType=detail::DefaultVoid>class FastDelegate1 {private:	typedef typename detail::DefaultVoidToVoid<RetType>::type DesiredRetType;	typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1);	typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1);	typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1);	typedef detail::ClosurePtr<GenericMemFn, StaticFunctionPtr, UnvoidStaticFunctionPtr> ClosureType;	ClosureType m_Closure;public:	// Typedefs to aid generic programming	typedef FastDelegate1 type;	// Construction and comparison functions	FastDelegate1() { clear(); }	FastDelegate1(const FastDelegate1 &x) {		m_Closure.CopyFrom(this, x.m_Closure); }	void operator = (const FastDelegate1 &x)  {		m_Closure.CopyFrom(this, x.m_Closure); }	bool operator ==(const FastDelegate1 &x) const {		return m_Closure.IsEqual(x.m_Closure);	}	bool operator !=(const FastDelegate1 &x) const {		return !m_Closure.IsEqual(x.m_Closure); }	bool operator <(const FastDelegate1 &x) const {		return m_Closure.IsLess(x.m_Closure);	}	bool operator >(const FastDelegate1 &x) const {		return x.m_Closure.IsLess(m_Closure);	}	// Binding to non-const member functions	template < class X, class Y >	FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) {		m_Closure.bindmemfunc(detail::implicit_cast<X*>(pthis), function_to_bind); }	template < class X, class Y >	inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) {		m_Closure.bindmemfunc(detail::implicit_cast<X*>(pthis), function_to_bind);	}	// Binding to const member functions.	template < class X, class Y >	FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) {		m_Closure.bindconstmemfunc(detail::implicit_cast<const X*>(pthis), function_to_bind);	}	template < class X, class Y >	inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) {		m_Closure.bindconstmemfunc(detail::implicit_cast<const X *>(pthis), function_to_bind);	}	// Static functions. We convert them into a member function call.	// This constructor also provides implicit conversion	FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) {		bind(function_to_bind);	}	// for efficiency, prevent creation of a temporary	void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) {		bind(function_to_bind);	}	inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) {		m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, 			function_to_bind); }	// Invoke the delegate	RetType operator() (Param1 p1) const {	return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); }	// Implicit conversion to "bool" using the safe_bool idiomprivate:	typedef struct SafeBoolStruct {		int a_data_pointer_to_this_is_0_on_buggy_compilers;		StaticFunctionPtr m_nonzero;	} UselessTypedef;    typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type;public:	operator unspecified_bool_type() const {        return empty()? 0: &SafeBoolStruct::m_nonzero;    }	// necessary to allow ==0 to work despite the safe_bool idiom	inline bool operator==(StaticFunctionPtr funcptr) {		return m_Closure.IsEqualToStaticFuncPtr(funcptr);	}	inline bool operator!=(StaticFunctionPtr funcptr) { 		return !m_Closure.IsEqualToStaticFuncPtr(funcptr);    }	inline bool operator ! () const	{	// Is it bound to anything?			return !m_Closure; }	inline bool empty() const	{			return !m_Closure; }	void clear() { m_Closure.clear();}	// Conversion to and from the DelegateMemento storage class	const DelegateMemento & GetMemento() { return m_Closure; }	void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); }private:	// Invoker for static functions	RetType InvokeStaticFunction(Param1 p1) const {	return (*(m_Closure.GetStaticFunction()))(p1); }};//N=2template<class Param1, class Param2, class RetType=detail::DefaultVoid>class FastDelegate2 {private:	typedef typename detail::DefaultVoidToVoid<RetType>::type DesiredRetType;	typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2);	typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2);	typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2);	typedef detail::ClosurePtr<GenericMemFn, StaticFunctionPtr, UnvoidStaticFunctionPtr> ClosureType;	ClosureType m_Closure;public:	// Typedefs to aid generic programming	typedef FastDelegate2 type;	// Construction and comparison functions	FastDelegate2() { clear(); }	FastDelegate2(const FastDelegate2 &x) {		m_Closure.CopyFrom(this, x.m_Closure); }	void operator = (const FastDelegate2 &x)  {		m_Closure.CopyFrom(this, x.m_Closure); }	bool operator ==(const FastDelegate2 &x) const {		return m_Closure.IsEqual(x.m_Closure);	}	bool operator !=(const FastDelegate2 &x) const {		return !m_Closure.IsEqual(x.m_Closure); }	bool operator <(const FastDelegate2 &x) const {		return m_Closure.IsLess(x.m_Closure);	}	bool operator >(const FastDelegate2 &x) const {		return x.m_Closure.IsLess(m_Closure);	}	// Binding to non-const member functions	template < class X, class Y >	FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) {		m_Closure.bindmemfunc(detail::implicit_cast<X*>(pthis), function_to_bind); }	template < class X, class Y >	inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) {		m_Closure.bindmemfunc(detail::implicit_cast<X*>(pthis), function_to_bind);	}	// Binding to const member functions.	template < class X, class Y >	FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) {		m_Closure.bindconstmemfunc(detail::implicit_cast<const X*>(pthis), function_to_bind);	}	template < class X, class Y >	inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) {		m_Closure.bindconstmemfunc(detail::implicit_cast<const X *>(pthis), function_to_bind);	}	// Static functions. We convert them into a member function call.	// This constructor also provides implicit conversion	FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) {		bind(function_to_bind);	}	// for efficiency, prevent creation of a temporary	void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) {		bind(function_to_bind);	}	inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) {		m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, 			function_to_bind); }	// Invoke the delegate	RetType operator() (Param1 p1, Param2 p2) const {	return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); }	// Implicit conversion to "bool" using the safe_bool idiomprivate:	typedef struct SafeBoolStruct {		int a_data_pointer_to_this_is_0_on_buggy_compilers;		StaticFunctionPtr m_nonzero;	} UselessTypedef;    typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type;public:	operator unspecified_bool_type() const {        return empty()? 0: &SafeBoolStruct::m_nonzero;    }	// necessary to allow ==0 to work despite the safe_bool idiom	inline bool operator==(StaticFunctionPtr funcptr) {		return m_Closure.IsEqualToStaticFuncPtr(funcptr);	}	inline bool operator!=(StaticFunctionPtr funcptr) { 		return !m_Closure.IsEqualToStaticFuncPtr(funcptr);    }	inline bool operator ! () const	{	// Is it bound to anything?			return !m_Closure; }	inline bool empty() const	{			return !m_Closure; }	void clear() { m_Closure.clear();}	// Conversion to and from the DelegateMemento storage class	const DelegateMemento & GetMemento() { return m_Closure; }	void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); }private:	// Invoker for static functions	RetType InvokeStaticFunction(Param1 p1, Param2 p2) const {	return (*(m_Closure.GetStaticFunction()))(p1, p2); }};//N=3template<class Param1, class Param2, class Param3, class RetType=detail::DefaultVoid>class FastDelegate3 {private:	typedef typename detail::DefaultVoidToVoid<RetType>::type DesiredRetType;	typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3);	typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3);	typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3);	typedef detail::ClosurePtr<GenericMemFn, StaticFunctionPtr, UnvoidStaticFunctionPtr> ClosureType;	ClosureType m_Closure;public:	// Typedefs to aid generic programming	typedef FastDelegate3 type;	// Construction and comparison functions	FastDelegate3() { clear(); }	FastDelegate3(const FastDelegate3 &x) {		m_Closure.CopyFrom(this, x.m_Closure); }	void operator = (const FastDelegate3 &x)  {		m_Closure.CopyFrom(this, x.m_Closure); }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?