1 /*!
2 	@file
3 	@author		Albert Semenov
4 	@date		01/2009
5 	@module
6 */
7 #pragma once
8 
9 #include <MyGUI.h>
10 #include <gcroot.h>
11 
12 #include "Marshaling.h"
13 
14 namespace MyGUI
15 {
16 	namespace Managed
17 	{
18 
19 		template <typename MD, typename T1, typename T2, typename T3, typename T4>
20 		class Delegate4 : public MyGUI::delegates::IDelegate4<T1, T2, T3, T4>
21 		{
22 		public:
Delegate4(MD _delegate)23 			Delegate4 (MD _delegate) : mDelegate(_delegate) { }
24 
isType(const std::type_info & _type)25 			virtual bool isType( const std::type_info& _type)
26 			{
27 				return typeid( Delegate4<MD, T1, T2, T3, T4> ) == _type;
28 			}
29 
invoke(T1 p1,T2 p2,T3 p3,T4 p4)30 			virtual void invoke( T1 p1, T2 p2, T3 p3, T4 p4 )
31 			{
32 				((MD)mDelegate)(Convert<T1>::To(p1), Convert<T2>::To(p2), Convert<T3>::To(p3), Convert<T4>::To(p4));
33 			}
34 
compare(MyGUI::delegates::IDelegate4<T1,T2,T3,T4> * _delegate)35 			virtual bool compare(  MyGUI::delegates::IDelegate4<T1, T2, T3, T4>  * _delegate) const
36 			{
37 				if (nullptr == _delegate || false == _delegate->isType(typeid(Delegate4<MD, T1, T2, T3, T4>)) ) return false;
38 				Delegate4<MD, T1, T2, T3, T4> * cast = static_cast<Delegate4<MD, T1, T2, T3, T4> *>(_delegate);
39 				return ((MD)cast->mDelegate) == ((MD)mDelegate);
40 			}
41 
42 		private:
43 			gcroot<MD> mDelegate;
44 		};
45 
46 	} // namespace Managed
47 } // namespace MyGUI
48