1 /*!
2 	@file
3 	@author		Albert Semenov
4 	@date		01/2009
5 	@module
6 */
7 #pragma once
8 
9 #include <MyGUI.h>
10 #include "Utility.h"
11 
12 namespace MyGUI
13 {
14 	namespace Managed
15 	{
16 
17 		class ObjectHolder
18 		{
19 		public:
ObjectHolder()20 			ObjectHolder() : object() { }
object(_obj)21 			ObjectHolder(System::Object ^ _obj) : object(_obj) { }
~ObjectHolder()22 			~ObjectHolder() { }
23 			System::Object ^ toObject()
24 			{
25 				return object;
26 			}
27 		private:
28 			gcroot < System::Object ^ > object;
29 		};
30 
31 
32 		// базовые шаблоны для конвертации переменных и типов
33 		template <typename T> struct Convert
34 		{
35 			typedef T Type;
ToConvert36 			static inline Type To(T _value)
37 			{
38 				return _value;
39 			}
FromConvert40 			static inline T From(Type _value)
41 			{
42 				return _value;
43 			}
44 		};
45 
46 		// перегрузка для базовых типов
47 		template <> struct Convert<size_t>
48 		{
49 			typedef System::UInt32 Type;
50 			inline static System::UInt32 To(size_t _value)
51 			{
52 				return System::UInt32(_value);
53 			}
54 			inline static size_t From(System::UInt32 _value)
55 			{
56 				return size_t(_value);
57 			}
58 		};
59 		template <> struct Convert<bool&>
60 		{
61 			typedef bool % Type;
62 			inline static bool % To(bool& _value)
63 			{
64 				return reinterpret_cast<bool&>(_value);
65 			}
66 		};
67 
68 		// перегрузка для строк
69 		template <> struct Convert<const std::string&>
70 		{
71 			typedef System::String ^ Type;
72 			inline static System::String ^ To(const std::string& _value)
73 			{
74 				return string_utility::utf8_to_managed(_value);
75 			}
76 			inline static std::string From(System::String ^ _value)
77 			{
78 				return string_utility::managed_to_utf8(_value);
79 			}
80 		};
81 		template <> struct Convert<const MyGUI::UString&>
82 		{
83 			typedef System::String ^ Type;
84 			inline static System::String ^ To(const MyGUI::UString& _value)
85 			{
86 				return string_utility::utf16_to_managed(_value);
87 			}
88 			inline static MyGUI::UString From(System::String ^ _value)
89 			{
90 				return string_utility::managed_to_utf16(_value);
91 			}
92 		};
93 		template <> struct Convert<MyGUI::UString>
94 		{
95 			typedef System::String ^ Type;
96 			inline static System::String ^ To(const MyGUI::UString& _value)
97 			{
98 				return string_utility::utf16_to_managed(_value);
99 			}
100 			inline static MyGUI::UString From(System::String ^ _value)
101 			{
102 				return string_utility::managed_to_utf16(_value);
103 			}
104 		};
105 
106 		// прегрузка для Any
107 		template <> struct Convert<MyGUI::Any>
108 		{
109 			typedef System::Object ^ Type;
110 			inline static System::Object ^ To(MyGUI::Any _value)
111 			{
112 				ObjectHolder* data = _value.castType< ObjectHolder >(false);
113 				return data ? data->toObject() : nullptr;
114 			}
115 			inline static MyGUI::Any From(System::Object ^ _value)
116 			{
117 				ObjectHolder data = _value;
118 				return data;
119 			}
120 		};
121 
122 	} // namespace Managed
123 } // namespace MyGUI
124