Skip to content

Commit 4673089

Browse files
author
Aidan Lee
committed
Move to a traits based dynamic conversions for the invoker
1 parent d73181e commit 4673089

File tree

2 files changed

+57
-89
lines changed

2 files changed

+57
-89
lines changed

include/hx/Functions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ namespace hx
4747
return sizeof...(TArgs);
4848
}
4949

50-
Dynamic __Run(const Array<Dynamic>& inArgs) = 0;
50+
Dynamic __Run(const Array<Dynamic>& inArgs) override = 0;
5151

52-
virtual TReturn _hx_run(TArgs... args) = 0;
52+
virtual TReturn HX_LOCAL_RUN(TArgs... args) = 0;
5353
};
5454

5555
template<class TReturn, class... TArgs>

include/hx/Invoker.h

Lines changed: 55 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)