Skip to content

Commit 19b0359

Browse files
committed
function_ptr.h: using function pointer istead of lambda now.
1 parent 89adc92 commit 19b0359

File tree

3 files changed

+32
-37
lines changed

3 files changed

+32
-37
lines changed

ReflectionTemplateLib/rtl/detail/inc/MethodInvoker.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ namespace rtl::detail
215215
if (argsTfnMeta.is_empty() && strictArgsId == ty_meta.get_strict_args_id()) {
216216
argsTfnMeta = ty_meta;
217217
}
218+
218219
if (normalArgsId == ty_meta.get_normal_args_id())
219220
{
220221
if (normalArgsId == ty_meta.get_strict_args_id()) {
@@ -279,8 +280,7 @@ namespace rtl::detail
279280
}
280281
};
281282

282-
if (isReturnTvoid = ty_meta.is_void())
283-
{
283+
if (isReturnTvoid = ty_meta.is_void()){
284284
auto fn = lambda.template operator() < dispatch::fn_void::yes > ();
285285
pHopper.get_vhop().push_back(fn.get_hop());
286286
}
@@ -292,6 +292,7 @@ namespace rtl::detail
292292
pHopper.get_overloads().push_back(&ty_meta.get_functor());
293293
pHopper.set_init_error(error::None);
294294
}
295+
295296
if (isReturnTvoid) {
296297
pHopper.get_rhop().clear();
297298
}

ReflectionTemplateLib/rtl/dispatch/aware_return.h

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,47 +20,41 @@ namespace rtl::dispatch
2020
template<class return_t, class ...signature_t>
2121
struct aware_return
2222
{
23-
constexpr static auto get_lambda_void() noexcept
23+
constexpr static void get_lambda_void(const functor& fn, traits::normal_sign_t<signature_t>&&... params) noexcept
2424
{
25-
return [](const functor& fn, traits::normal_sign_t<signature_t>&&... params)-> auto
25+
if constexpr (std::is_void_v<return_t>)
2626
{
27-
if constexpr (std::is_void_v<return_t>)
28-
{
29-
auto fptr = static_cast<const function_ptr<return_t, signature_t...>&>(fn).f_ptr();
30-
(*fptr)(std::forward<signature_t>(params)...);
31-
}
32-
};
27+
auto fptr = static_cast<const function_ptr<return_t, signature_t...>&>(fn).f_ptr();
28+
(*fptr)(std::forward<signature_t>(params)...);
29+
}
3330
}
3431

35-
constexpr static auto get_lambda_any_return() noexcept
32+
constexpr static std::any get_lambda_any_return(const functor& fn, traits::normal_sign_t<signature_t>&&... params) noexcept
3633
{
37-
return [](const functor& fn, traits::normal_sign_t<signature_t>&&... params)-> auto
34+
if constexpr (!std::is_void_v<return_t>)
3835
{
39-
if constexpr (!std::is_void_v<return_t>)
40-
{
41-
auto fptr = static_cast<const function_ptr<return_t, signature_t...>&>(fn).f_ptr();
42-
auto&& ret_v = (*fptr)(std::forward<signature_t>(params)...);
36+
auto fptr = static_cast<const function_ptr<return_t, signature_t...>&>(fn).f_ptr();
37+
auto&& ret_v = (*fptr)(std::forward<signature_t>(params)...);
4338

44-
if constexpr (std::is_pointer_v<return_t>)
45-
{
46-
using raw_t = std::remove_pointer_t<return_t>;
47-
return std::any(static_cast<const raw_t*>(ret_v));
48-
}
49-
else if constexpr (std::is_reference_v<return_t>)
50-
{
51-
using raw_t = std::remove_cv_t<std::remove_reference_t<return_t>>;
52-
return std::any(static_cast<const raw_t*>(&ret_v));
53-
}
54-
else
55-
{
56-
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
57-
// TODO: enable it for move-constructible objects.
58-
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
59-
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
60-
}
39+
if constexpr (std::is_pointer_v<return_t>)
40+
{
41+
using raw_t = std::remove_pointer_t<return_t>;
42+
return std::any(static_cast<const raw_t*>(ret_v));
43+
}
44+
else if constexpr (std::is_reference_v<return_t>)
45+
{
46+
using raw_t = std::remove_cv_t<std::remove_reference_t<return_t>>;
47+
return std::any(static_cast<const raw_t*>(&ret_v));
48+
}
49+
else
50+
{
51+
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
52+
// TODO: enable it for move-constructible objects.
53+
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
54+
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
6155
}
62-
else return std::any();
63-
};
56+
}
57+
else return std::any();
6458
}
6559
};
6660
}

ReflectionTemplateLib/rtl/dispatch/function_ptr.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ namespace rtl::dispatch
4343
func_t& fn = m_lambda.template emplace<func_t>();
4444

4545
if constexpr (fn_void_v == fn_void::yes) {
46-
fn.set_hop(aware_return<return_t, signature_t...>::get_lambda_void());
46+
fn.set_hop(&aware_return<return_t, signature_t...>::get_lambda_void);
4747
}
4848
else {
49-
fn.set_hop(aware_return<return_t, signature_t...>::get_lambda_any_return());
49+
fn.set_hop(&aware_return<return_t, signature_t...>::get_lambda_any_return);
5050
}
5151

5252
functor::m_lambdas = std::vector<lambda*>(1);

0 commit comments

Comments
 (0)