Skip to content

Commit 987e075

Browse files
committed
function/method_lambda, using function ptr (for voids).
1 parent 19b0359 commit 987e075

File tree

10 files changed

+78
-122
lines changed

10 files changed

+78
-122
lines changed

ReflectionTemplateLib/rtl/detail/inc/FunctionCaller.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ namespace rtl::detail
137137
{
138138
using fn_cast = dispatch::functor_cast<dispatch::fn_void::yes, traits::normal_sign_t<args_t>...>;
139139
auto fn = fn_cast(ty_meta.get_functor()).template to_function<dispatch::erase::t_return>();
140-
pHopper.get_vhop().push_back(fn.get_hop());
140+
pHopper.get_vhop().push_back(fn.f_ptr());
141141
}
142142
else
143143
{

ReflectionTemplateLib/rtl/detail/inc/MethodInvoker.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ namespace rtl::detail
282282

283283
if (isReturnTvoid = ty_meta.is_void()){
284284
auto fn = lambda.template operator() < dispatch::fn_void::yes > ();
285-
pHopper.get_vhop().push_back(fn.get_hop());
285+
pHopper.get_vhop().push_back(fn.f_ptr());
286286
}
287287
else {
288288
auto fn = lambda.template operator() < dispatch::fn_void::no > ();

ReflectionTemplateLib/rtl/dispatch/aware_return_n_target.h

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,49 +21,40 @@ namespace rtl::dispatch
2121
struct aware_return_n_target
2222
{
2323
// erased-return-aware-target-function-void
24-
constexpr static auto e_return_a_target_fnv() noexcept
24+
static void e_return_a_target_fnv(const functor& fn, const record_t& p_target, traits::normal_sign_t<signature_t>&&... params) noexcept
2525
{
26-
return [](const functor& fn, const record_t& p_target, traits::normal_sign_t<signature_t>&&... params)-> auto
26+
if constexpr (std::is_void_v<return_t>)
2727
{
28-
if constexpr (std::is_void_v<return_t>)
29-
{
30-
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
28+
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
3129

32-
(const_cast<record_t&>(p_target).*mptr)(std::forward<signature_t>(params)...);
33-
}
34-
};
30+
(const_cast<record_t&>(p_target).*mptr)(std::forward<signature_t>(params)...);
31+
}
3532
}
3633

3734
// erased-target-aware-return-function-void
38-
constexpr static auto e_target_a_return_fnv() noexcept
35+
static void e_target_a_return_fnv(const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params) noexcept
3936
{
40-
return [](const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params)-> auto
37+
if constexpr (std::is_void_v<return_t>)
4138
{
42-
if constexpr (std::is_void_v<return_t>)
43-
{
44-
const auto& target = p_target.view<record_t>()->get();
39+
const auto& target = p_target.view<record_t>()->get();
4540

46-
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
41+
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
4742

48-
(const_cast<record_t&>(target).*mptr)(std::forward<signature_t>(params)...);
49-
}
50-
};
43+
(const_cast<record_t&>(target).*mptr)(std::forward<signature_t>(params)...);
44+
}
5145
}
5246

5347
// erased-return-erased-target-function-void
54-
constexpr static auto e_return_e_target_fnv() noexcept
48+
static void e_return_e_target_fnv(const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params) noexcept
5549
{
56-
return [](const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params)-> auto
50+
if constexpr (std::is_void_v<return_t>)
5751
{
58-
if constexpr (std::is_void_v<return_t>)
59-
{
60-
const auto& target = p_target.view<record_t>()->get();
52+
const auto& target = p_target.view<record_t>()->get();
6153

62-
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
54+
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
6355

64-
(const_cast<record_t&>(target).*mptr)(std::forward<signature_t>(params)...);
65-
}
66-
};
56+
(const_cast<record_t&>(target).*mptr)(std::forward<signature_t>(params)...);
57+
}
6758
}
6859

6960
// erased-target-aware-return-function-returns(return_t)

ReflectionTemplateLib/rtl/dispatch/aware_return_n_target_const.h

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,49 +21,40 @@ namespace rtl::dispatch
2121
struct aware_return_n_target<const record_t, return_t, signature_t...>
2222
{
2323
// erased-return-aware-target-function-void
24-
constexpr static auto e_return_a_target_fnv() noexcept
24+
static void e_return_a_target_fnv(const functor& fn, const record_t& p_target, traits::normal_sign_t<signature_t>&&... params) noexcept
2525
{
26-
return [](const functor& fn, const record_t& p_target, traits::normal_sign_t<signature_t>&&... params)-> auto
26+
if constexpr (std::is_void_v<return_t>)
2727
{
28-
if constexpr (std::is_void_v<return_t>)
29-
{
30-
auto mptr = static_cast<const method_ptr<const record_t, return_t, signature_t...>&>(fn).f_ptr();
28+
auto mptr = static_cast<const method_ptr<const record_t, return_t, signature_t...>&>(fn).f_ptr();
3129

32-
(p_target.*mptr)(std::forward<signature_t>(params)...);
33-
}
34-
};
30+
(p_target.*mptr)(std::forward<signature_t>(params)...);
31+
}
3532
}
3633

3734
// erased-target-aware-return-function-void
38-
constexpr static auto e_target_a_return_fnv() noexcept
35+
static void e_target_a_return_fnv(const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params) noexcept
3936
{
40-
return [](const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params)-> auto
37+
if constexpr (std::is_void_v<return_t>)
4138
{
42-
if constexpr (std::is_void_v<return_t>)
43-
{
44-
const auto& target = p_target.view<record_t>()->get();
39+
const auto& target = p_target.view<record_t>()->get();
4540

46-
auto mptr = static_cast<const method_ptr<const record_t, return_t, signature_t...>&>(fn).f_ptr();
41+
auto mptr = static_cast<const method_ptr<const record_t, return_t, signature_t...>&>(fn).f_ptr();
4742

48-
(target.*mptr)(std::forward<signature_t>(params)...);
49-
}
50-
};
43+
(target.*mptr)(std::forward<signature_t>(params)...);
44+
}
5145
}
5246

5347
// erased-return-erased-target-function-void
54-
constexpr static auto e_return_e_target_fnv() noexcept
48+
static void e_return_e_target_fnv(const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params) noexcept
5549
{
56-
return [](const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params)-> auto
50+
if constexpr (std::is_void_v<return_t>)
5751
{
58-
if constexpr (std::is_void_v<return_t>)
59-
{
60-
auto mptr = static_cast<const method_ptr<const record_t, return_t, signature_t...>&>(fn).f_ptr();
52+
auto mptr = static_cast<const method_ptr<const record_t, return_t, signature_t...>&>(fn).f_ptr();
6153

62-
const auto& target = p_target.view<record_t>()->get();
54+
const auto& target = p_target.view<record_t>()->get();
6355

64-
(target.*mptr)(std::forward<signature_t>(params)...);
65-
}
66-
};
56+
(target.*mptr)(std::forward<signature_t>(params)...);
57+
}
6758
}
6859

6960
// erased-target-aware-return-function-returns(return_t)

ReflectionTemplateLib/rtl/dispatch/function_lambda.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,19 @@ namespace rtl::dispatch
4444
template<class...args_t>
4545
struct function_lambda<fn_void::yes, erase::t_return, args_t...> : lambda
4646
{
47-
using lambda_t = std::function<void(const functor&, traits::normal_sign_t<args_t>...)>;
47+
using fptr_t = void(*)(const functor&, traits::normal_sign_t<args_t>&&...);
4848

49-
const lambda_t& get_hop() const {
50-
return m_lambda;
49+
fptr_t f_ptr() const {
50+
return m_fptr;
5151
}
5252

5353
private:
5454

55-
void set_hop(const lambda_t& lambda) {
56-
m_lambda = lambda;
55+
void init(fptr_t fptr) {
56+
m_fptr = fptr;
5757
}
5858

59-
lambda_t m_lambda;
59+
fptr_t m_fptr;
6060

6161
template<class, class ...>
6262
friend struct dispatch::function_ptr;
@@ -94,19 +94,19 @@ namespace rtl::dispatch
9494
template<class...args_t>
9595
struct function_lambda<fn_void::yes, erase::t_method, args_t...> : lambda
9696
{
97-
using lambda_t = std::function<void(const functor&, const RObject&, traits::normal_sign_t<args_t>...)>;
97+
using fptr_t = void(*)(const functor&, const RObject&, traits::normal_sign_t<args_t>&&...);
9898

99-
const lambda_t& get_hop() const {
100-
return m_lambda;
99+
fptr_t f_ptr() const {
100+
return m_fptr;
101101
}
102102

103103
private:
104104

105-
void set_hop(const lambda_t& lambda) {
106-
m_lambda = lambda;
105+
void init(fptr_t fptr) {
106+
m_fptr = fptr;
107107
}
108108

109-
lambda_t m_lambda;
109+
fptr_t m_fptr;
110110

111111
template<class, class, class ...>
112112
friend struct dispatch::method_ptr;

ReflectionTemplateLib/rtl/dispatch/function_ptr.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ 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.init(&aware_return<return_t, signature_t...>::get_lambda_void);
4747
}
4848
else {
4949
fn.set_hop(&aware_return<return_t, signature_t...>::get_lambda_any_return);

ReflectionTemplateLib/rtl/dispatch/method_lambda.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ namespace rtl::dispatch
1919
struct method_lambda<fn_void::yes, erase::t_return, known_t, args_t...> : lambda
2020
{
2121
using record_t = known_t;
22-
using lambda_t = std::function<void(const functor&, const record_t&, traits::normal_sign_t<args_t>...)>;
22+
using fptr_t = void(*)(const functor&, const record_t&, traits::normal_sign_t<args_t>&&...);
2323

24-
const lambda_t& get_hop() const {
25-
return m_lambda;
24+
fptr_t f_ptr() const {
25+
return m_fptr;
2626
}
2727

2828
private:
29-
30-
void set_hop(const lambda_t& lambda) {
31-
m_lambda = lambda;
29+
30+
void init(fptr_t fptr) {
31+
m_fptr = fptr;
3232
}
3333

34-
lambda_t m_lambda;
34+
fptr_t m_fptr;
3535

3636
template<class, class , class...>
3737
friend struct method_ptr;
@@ -71,19 +71,19 @@ namespace rtl::dispatch
7171
struct method_lambda<fn_void::yes, erase::t_target, known_t, args_t...> : lambda
7272
{
7373
using return_t = known_t;
74-
using lambda_t = std::function<void(const functor&, const rtl::RObject&, traits::normal_sign_t<args_t>...)>;
74+
using fptr_t = void(*)(const functor&, const rtl::RObject&, traits::normal_sign_t<args_t>&&...);
7575

76-
const lambda_t& get_hop() const {
77-
return m_lambda;
76+
fptr_t f_ptr() const {
77+
return m_fptr;
7878
}
7979

8080
private:
8181

82-
void set_hop(const lambda_t& lambda) {
83-
m_lambda = lambda;
82+
void init(fptr_t fptr) {
83+
m_fptr = fptr;
8484
}
8585

86-
lambda_t m_lambda;
86+
fptr_t m_fptr;
8787

8888
template<class, class, class...>
8989
friend struct method_ptr;

ReflectionTemplateLib/rtl/dispatch/method_ptr.hpp

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,18 @@ namespace rtl::dispatch
1919
template<class record_t, class return_t, class ...signature_t>
2020
void method_ptr<record_t, return_t, signature_t...>::init_lambda()
2121
{
22+
using lambda_t = aware_return_n_target<record_t, return_t, signature_t...>;
2223
if constexpr (fn_void_v == fn_void::yes)
2324
{
24-
{ // erased-return-aware-target
25-
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_return_a_target_fnv();
26-
m_erased_return.set_hop(fn);
27-
} { // erased-target-aware-return
28-
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_target_a_return_fnv();
29-
m_erased_target.set_hop(fn);
30-
} { // erased-return-erased-target
31-
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_return_e_target_fnv();
32-
m_erased_method.set_hop(fn);
33-
}
25+
m_erased_return.init(&lambda_t::e_return_a_target_fnv); // erased-return-aware-target
26+
m_erased_target.init(&lambda_t::e_target_a_return_fnv); // erased-target-aware-return
27+
m_erased_method.init(&lambda_t::e_return_e_target_fnv); // erased-return-erased-target
3428
}
3529
else
3630
{
37-
{ // erased-return-aware-target
38-
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_return_a_target_fnr();
39-
m_erased_return.set_hop(fn);
40-
} { // erased-target-aware-return
41-
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_target_a_return_fnr();
42-
m_erased_target.set_hop(fn);
43-
} { // erased-return-erased-target
44-
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_return_e_target_fnr();
45-
m_erased_method.set_hop(fn);
46-
}
31+
m_erased_return.set_hop(lambda_t::e_return_a_target_fnr()); // erased-return-aware-target
32+
m_erased_target.set_hop(lambda_t::e_target_a_return_fnr()); // erased-target-aware-return
33+
m_erased_method.set_hop(lambda_t::e_return_e_target_fnr()); // erased-return-erased-target
4734
}
4835

4936
functor::m_lambdas = std::vector<lambda*>(3);

ReflectionTemplateLib/rtl/dispatch/method_ptr_const.hpp

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,19 @@ namespace rtl::dispatch
1919
template<class record_t, class return_t, class ...signature_t>
2020
void method_ptr<const record_t, return_t, signature_t...>::init_lambda()
2121
{
22+
using lambda_t = aware_return_n_target<const record_t, return_t, signature_t...>;
23+
2224
if constexpr (fn_void_v == fn_void::yes)
2325
{
24-
{ // erased-return-aware-target
25-
const auto& fn = aware_return_n_target<const record_t, return_t, signature_t...>::e_return_a_target_fnv();
26-
m_erased_return.set_hop(fn);
27-
} { // erased-target-aware-return
28-
const auto& fn = aware_return_n_target<const record_t, return_t, signature_t...>::e_target_a_return_fnv();
29-
m_erased_target.set_hop(fn);
30-
} { // erased-return-erased-target
31-
const auto& fn = aware_return_n_target<const record_t, return_t, signature_t...>::e_return_e_target_fnv();
32-
m_erased_method.set_hop(fn);
33-
}
26+
m_erased_return.init(&lambda_t::e_return_a_target_fnv); // erased-return-aware-target
27+
m_erased_target.init(&lambda_t::e_target_a_return_fnv); // erased-target-aware-return
28+
m_erased_method.init(&lambda_t::e_return_e_target_fnv); // erased-return-erased-target
3429
}
3530
else
3631
{
37-
{ // erased-return-aware-target
38-
const auto& fn = aware_return_n_target<const record_t, return_t, signature_t...>::e_return_a_target_fnr();
39-
m_erased_return.set_hop(fn);
40-
} { // erased-target-aware-return
41-
const auto& fn = aware_return_n_target<const record_t, return_t, signature_t...>::e_target_a_return_fnr();
42-
m_erased_target.set_hop(fn);
43-
} { // erased-return-erased-target
44-
const auto& fn = aware_return_n_target<const record_t, return_t, signature_t...>::e_return_e_target_fnr();
45-
m_erased_method.set_hop(fn);
46-
}
32+
m_erased_return.set_hop(lambda_t::e_return_a_target_fnr()); // erased-return-aware-target
33+
m_erased_target.set_hop(lambda_t::e_target_a_return_fnr()); // erased-target-aware-return
34+
m_erased_method.set_hop(lambda_t::e_return_e_target_fnr()); // erased-return-erased-target
4735
}
4836

4937
functor::m_lambdas = std::vector<lambda*>(3);

ReflectionTemplateLib/rtl/dispatch/rtl_function_erased_return.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ namespace rtl
9494

9595
constexpr operator bool() const noexcept {
9696
return !(m_init_err != error::None || m_functors.empty() ||
97-
(m_functors.size() == 1 && m_functors[0] == nullptr));
98-
97+
(m_functors.size() == 1 && m_functors[0] == nullptr));
9998
}
10099

101100
constexpr bool must_bind_refs() const noexcept {

0 commit comments

Comments
 (0)