@@ -35,113 +35,81 @@ namespace hx
3535 };
3636 }
3737
38- // for some reason gcc gives us a "expected a type got std::remove_pointer<T>::type" error if I try and std::remove_pointer<T>::type as a template parameter.
39- // but std::remove_pointer_t<T> from C++ 14 works? so just implement that ourselves...
40- template < class T >
41- using remove_pointer_t = typename std::remove_pointer<T>::type;
38+ template <class T >
39+ struct ConversionTrait
40+ {
41+ inline static Dynamic toDynamic (T v) { return Dynamic{ v }; }
42+ inline static T fromDynamic (Dynamic d) { return T{ d }; }
43+ };
4244
43- template < class T >
44- using remove_const_t = typename std::remove_const<T>::type;
45+ template <class T >
46+ struct ConversionTrait <T*>
47+ {
48+ inline static Dynamic toDynamic (T* v) { return Dynamic{ ::cpp::Pointer<T>(v)}; }
49+ inline static T* fromDynamic (Dynamic d) { return ::cpp::Pointer<T>(d).ptr ; }
50+ };
4551
46- namespace unwrap
52+ template <class T >
53+ struct ConversionTrait <::cpp::Pointer<T>>
4754 {
48- template <typename T>
49- T __hx_struct (Dynamic value, std::true_type)
50- {
51- return value;
52- }
55+ inline static Dynamic toDynamic (::cpp::Pointer<T> v) { return Dynamic{ v }; }
56+ inline static ::cpp::Pointer<T> fromDynamic (Dynamic d) { return cpp::Pointer<T>(d); }
57+ };
5358
54- template <typename T>
55- T __hx_struct (Dynamic value, std::false_type)
56- {
57- return ::cpp::Struct<T>(value);
58- }
59+ template <class T >
60+ struct ConversionTrait <::cpp::Struct<T>>
61+ {
62+ inline static Dynamic toDynamic (::cpp::Struct<T> v) { return Dynamic{ v }; }
63+ inline static ::cpp::Struct<T> fromDynamic (Dynamic d) { return cpp::Struct<T>(d); }
64+ };
5965
60- template <typename T>
61- T __hx_object_pointer (Dynamic value, std::true_type)
62- {
63- return value;
64- }
66+ template <class T >
67+ struct ConversionTrait <::cpp::marshal::ValueReference<T>>
68+ {
69+ inline static Dynamic toDynamic (::cpp::marshal::ValueReference<T> v) { return Dynamic{ v }; }
70+ inline static ::cpp::marshal::ValueReference<T> fromDynamic (Dynamic d) { return ::cpp::marshal::ValueReference<T>{ ::cpp::marshal::ValueType<T>{ d } }; }
71+ };
6572
66- template <typename T>
67- T __hx_object_pointer (Dynamic value, std::false_type)
68- {
69- return ::cpp::Pointer<remove_pointer_t <T>>(value);
70- }
73+ template <class T >
74+ struct ConversionTrait <::cpp::marshal::ValueType<T>>
75+ {
76+ inline static Dynamic toDynamic (::cpp::marshal::ValueType<T> v) { return Dynamic{ v }; }
77+ inline static ::cpp::marshal::ValueType<T> fromDynamic (Dynamic d) { return ::cpp::marshal::ValueType<T>{ d }; }
78+ };
7179
72- template <typename T>
73- T __hx_pointer (Dynamic value, std::true_type)
74- {
75- return __hx_object_pointer<T>(value, std::is_base_of<remove_pointer_t <T>, ::hx::Object>{});
76- }
80+ template <class T >
81+ struct ConversionTrait <::cpp::marshal::PointerReference<T>>
82+ {
83+ inline static Dynamic toDynamic (::cpp::marshal::PointerReference<T> v) { return Dynamic{ v }; }
84+ inline static ::cpp::marshal::PointerReference<T> fromDynamic (Dynamic d) { return ::cpp::marshal::PointerReference<T>{ ::cpp::marshal::PointerType<T>{ d } }; }
85+ };
7786
78- template <typename T>
79- T __hx_pointer (Dynamic value, std::false_type)
80- {
81- return __hx_struct<T>(value, std::is_constructible<Dynamic, T>{});
82- }
87+ template <class T >
88+ struct ConversionTrait <::cpp::marshal::PointerType<T>>
89+ {
90+ inline static Dynamic toDynamic (::cpp::marshal::PointerType<T> v) { return Dynamic{ v }; }
91+ inline static ::cpp::marshal::PointerType<T> fromDynamic (Dynamic d) { return ::cpp::marshal::PointerType<T>{ d }; }
92+ };
8393
94+ namespace unwrap
95+ {
8496 template <typename T>
8597 T fromDynamic (Dynamic value)
8698 {
87- return __hx_pointer<T>(value, std::is_pointer<T>{});
99+ using traits = ConversionTrait<T>;
100+
101+ return traits::fromDynamic (value);
88102 }
89103 }
90104
91105 namespace wrap
92106 {
93- template <typename T>
94- Dynamic __hx_struct (T value, std::true_type)
95- {
96- return value;
97- }
98-
99- template <typename T>
100- Dynamic __hx_struct (T value, std::false_type)
101- {
102- return cpp::Struct<T>(value);
103- }
104-
105- template <typename T>
106- Dynamic __hx_object_pointer (T value, std::true_type)
107- {
108- return Dynamic (value);
109- }
110-
111- template <typename T>
112- Dynamic __hx_object_pointer_strip_const (T value, std::false_type)
113- {
114- return Dynamic (cpp::Pointer<remove_pointer_t <T>>(value));
115- }
116-
117- template <typename T>
118- Dynamic __hx_object_pointer_strip_const (T value, std::true_type)
119- {
120- return Dynamic (cpp::Pointer<remove_const_t <remove_pointer_t <T>>>(value));
121- }
122-
123- template <typename T>
124- Dynamic __hx_object_pointer (T value, std::false_type)
125- {
126- return __hx_object_pointer_strip_const (value, std::is_const<remove_pointer_t <T>>{});
127- }
128-
129- template <typename T>
130- Dynamic __hx_pointer (T value, std::true_type)
131- {
132- return __hx_object_pointer (value, std::is_base_of<remove_pointer_t <T>, ::hx::Object>{});
133- }
134-
135- template <typename T>
136- Dynamic __hx_pointer (T value, std::false_type)
137- {
138- return __hx_struct (value, std::is_constructible<Dynamic, T>{});
139- }
140-
141107 template <typename T>
142108 Dynamic toDynamic (T value)
143109 {
144- return __hx_pointer (value, std::is_pointer<T>{});
110+ using traits = ConversionTrait<T>;
111+
112+ return traits::toDynamic (value);
145113 }
146114 }
147115
0 commit comments