Skip to content

Commit a0c05f6

Browse files
committed
organizing metadata: functor_cast in use for function.
1 parent a8049ce commit a0c05f6

File tree

4 files changed

+34
-35
lines changed

4 files changed

+34
-35
lines changed

RTLTestRunApp/src/FunctionalityTests/TypeErasedReflectiveCalls/BasicTypeErasedDispatch_Function.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
using namespace test_utils;
1111
using namespace test_mirror;
1212

13+
// TODO: test cases for functions with return type 'void'.
14+
1315
namespace rtl_tests
1416
{
1517
TEST(ReturnTypeErased_rtl_function, invalid_erased_return_rtl_function)

ReflectionTemplateLib/rtl/detail/inc/FunctionCaller.hpp

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "FunctionCaller.h"
1717
#include "FunctorContainer.h"
1818

19+
#include "functor_cast.h"
1920

2021
#include "lambda_method.h"
2122
#include "lambda_function.h"
@@ -109,49 +110,52 @@ namespace rtl::detail
109110

110111

111112
template<member member_kind, class ...args_t>
112-
inline void HopFunction<member_kind, args_t...>::initHopper(function<rtl::Return(args_t...)>& pHopFn) const
113+
inline void HopFunction<member_kind, args_t...>::initHopper(function<rtl::Return(args_t...)>& pHopper) const
113114
{
114115
bool isReturnTvoid = false;
115-
for (auto& fnMeta : m_overloadsFnMeta)
116+
for (auto& ty_meta : m_overloadsFnMeta)
116117
{
117-
if (fnMeta.is_empty())
118-
{
119-
pHopFn.get_vhop().push_back(nullptr);
120-
pHopFn.get_rhop().push_back(nullptr);
121-
pHopFn.get_overloads().push_back(nullptr);
118+
if (ty_meta.is_empty()) {
119+
pHopper.get_vhop().push_back(nullptr);
120+
pHopper.get_rhop().push_back(nullptr);
121+
pHopper.get_overloads().push_back(nullptr);
122122
continue;
123123
}
124124

125125
if constexpr (member_kind == member::Static) {
126-
if (fnMeta.get_member_kind() != member::Static) {
127-
pHopFn.set_init_error(error::InvalidNonStaticMethodCaller);
126+
if (ty_meta.get_member_kind() != member::Static) {
127+
pHopper.set_init_error(error::InvalidNonStaticMethodCaller);
128128
return;
129129
}
130130
}
131131
else if constexpr (member_kind == member::None) {
132-
if (fnMeta.get_member_kind() == member::Static) {
133-
pHopFn.set_init_error(error::InvalidStaticMethodCaller);
132+
if (ty_meta.get_member_kind() == member::Static) {
133+
pHopper.set_init_error(error::InvalidStaticMethodCaller);
134134
return;
135135
}
136136
}
137137

138-
auto& erasedRetFn = fnMeta.get_erasure_base()
139-
.template to_erased_return<traits::normal_sign_t<args_t>...>();
140-
if (fnMeta.is_void()) {
141-
isReturnTvoid = true;
142-
pHopFn.get_vhop().push_back(erasedRetFn.get_void_hopper());
138+
if (isReturnTvoid = ty_meta.is_void())
139+
{
140+
using fn_cast = dispatch::functor_cast<dispatch::fn_void::yes, traits::normal_sign_t<args_t>...>;
141+
auto fn = fn_cast(ty_meta.get_functor()).template to_function<dispatch::erase::t_return>();
142+
pHopper.get_vhop().push_back(fn.get_hop());
143143
}
144-
else {
145-
pHopFn.get_rhop().push_back(erasedRetFn.get_return_hopper());
144+
else
145+
{
146+
using fn_cast = dispatch::functor_cast<dispatch::fn_void::no, traits::normal_sign_t<args_t>...>;
147+
auto fn = fn_cast(ty_meta.get_functor()).template to_function<dispatch::erase::t_return>();
148+
pHopper.get_rhop().push_back(fn.get_hop());
146149
}
147-
pHopFn.get_overloads().push_back(&fnMeta.get_lambda());
148-
pHopFn.set_init_error(error::None);
150+
151+
pHopper.get_overloads().push_back(&ty_meta.get_lambda());
152+
pHopper.set_init_error(error::None);
149153
}
150154
if (isReturnTvoid) {
151-
pHopFn.get_rhop().clear();
155+
pHopper.get_rhop().clear();
152156
}
153157
else {
154-
pHopFn.get_vhop().clear();
158+
pHopper.get_vhop().clear();
155159
}
156160
}
157161

ReflectionTemplateLib/rtl/dispatch/functor_cast.h

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,45 +19,37 @@ namespace rtl::dispatch
1919
struct functor_cast
2020
{
2121
const functor& m_functor;
22-
23-
template<erase erase_v>
22+
2423
constexpr auto to_method()
2524
{
26-
if constexpr (erase_v == erase::t_method)
27-
{
28-
using lambda_t = function_lambda<fn_void_v, erase::t_method, signature_t...>;
29-
return static_cast<lambda_t&>(*m_functor.m_lambdas[functor::index::erased_method]);
30-
}
25+
using lambda_t = function_lambda<fn_void_v, erase::t_method, signature_t...>;
26+
return static_cast<lambda_t&>(*m_functor.m_lambdas[functor::index::erased_method]);
3127
}
3228

3329
template<erase erase_v, class known_t>
3430
constexpr auto to_method()
3531
{
32+
using lambda_t = method_lambda<fn_void_v, erase_v, known_t, signature_t...>;
3633
if constexpr (erase_v == erase::t_return)
3734
{
38-
using target_t = known_t;
39-
using lambda_t = method_lambda<fn_void_v, erase::t_ctor, target_t, signature_t...>;
4035
return static_cast<lambda_t&>(*m_functor.m_lambdas[functor::index::erased_return]);
4136
}
4237
else if constexpr (erase_v == erase::t_target)
4338
{
44-
using return_t = known_t;
45-
using lambda_t = method_lambda<fn_void_v, erase::t_return, return_t, signature_t...>;
4639
return static_cast<lambda_t&>(*m_functor.m_lambdas[functor::index::erased_target]);
4740
}
4841
}
4942

5043
template<erase erase_v>
5144
constexpr auto to_function()
5245
{
46+
using lambda_t = function_lambda<fn_void_v, erase_v, signature_t...>;
5347
if constexpr (erase_v == erase::t_ctor)
5448
{
55-
using lambda_t = function_lambda<fn_void_v, erase::t_ctor, signature_t...>;
5649
return static_cast<lambda_t&>(*m_functor.m_lambdas[functor::index::erased_ctor]);
5750
}
5851
else if constexpr (erase_v == erase::t_return)
5952
{
60-
using lambda_t = function_lambda<fn_void_v, erase::t_return, signature_t...>;
6153
return static_cast<lambda_t&>(*m_functor.m_lambdas[functor::index::erased_return]);
6254
}
6355
}

ReflectionTemplateLib/rtl/inc/type_meta.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ namespace rtl
4545

4646
GETTER(detail::member, _member_kind, m_functor->get().m_member_kind)
4747

48+
GETTER_CREF(dispatch::functor, _functor, m_functor->get())
4849
GETTER_CREF(dispatch::lambda_base, _lambda, *(m_functor->get().m_lambda))
4950
GETTER_CREF(dispatch::erasure_base, _erasure_base, *(m_functor->get().m_erasure))
5051

0 commit comments

Comments
 (0)