Skip to content

Commit 243702b

Browse files
committed
erased-return: removed unnecessary lambdas.
1 parent 5e14c03 commit 243702b

File tree

2 files changed

+49
-55
lines changed

2 files changed

+49
-55
lines changed

ReflectionTemplateLib/rtl/dispatch/aware_return_n_target.h

Lines changed: 47 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -74,71 +74,65 @@ namespace rtl::dispatch
7474
}
7575

7676
// erased-return-aware-target-function-returns(std::any)
77-
constexpr static auto e_return_a_target_fnr() noexcept
77+
constexpr static auto e_return_a_target_fnr(const functor& fn, const record_t& p_target, traits::normal_sign_t<signature_t>&&...params) noexcept
7878
{
79-
return [](const functor& fn, const record_t& p_target, traits::normal_sign_t<signature_t>&&...params)-> auto
79+
if constexpr (!std::is_void_v<return_t>)
8080
{
81-
if constexpr (!std::is_void_v<return_t>)
82-
{
83-
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
81+
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
8482

85-
auto&& ret_v = (const_cast<record_t&>(p_target).*mptr)(std::forward<signature_t>(params)...);
86-
87-
if constexpr (std::is_pointer_v<return_t>)
88-
{
89-
using raw_t = std::remove_pointer_t<return_t>;
90-
return std::any(static_cast<const raw_t*>(ret_v));
91-
}
92-
else if constexpr (std::is_reference_v<return_t>)
93-
{
94-
using raw_t = std::remove_cv_t<std::remove_reference_t<return_t>>;
95-
return std::any(static_cast<const raw_t*>(&ret_v));
96-
}
97-
else
98-
{
99-
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
100-
// TODO: enable it for move-constructible objects.
101-
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
102-
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
103-
}
83+
auto&& ret_v = (const_cast<record_t&>(p_target).*mptr)(std::forward<signature_t>(params)...);
84+
85+
if constexpr (std::is_pointer_v<return_t>)
86+
{
87+
using raw_t = std::remove_pointer_t<return_t>;
88+
return std::any(static_cast<const raw_t*>(ret_v));
10489
}
105-
else return std::any();
106-
};
90+
else if constexpr (std::is_reference_v<return_t>)
91+
{
92+
using raw_t = std::remove_cv_t<std::remove_reference_t<return_t>>;
93+
return std::any(static_cast<const raw_t*>(&ret_v));
94+
}
95+
else
96+
{
97+
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
98+
// TODO: enable it for move-constructible objects.
99+
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
100+
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
101+
}
102+
}
103+
else return std::any();
107104
}
108105

109106
// erased-return-erased-target-function-returns(std::any)
110-
constexpr static auto e_return_e_target_fnr() noexcept
107+
constexpr static auto e_return_e_target_fnr(const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params) noexcept
111108
{
112-
return [](const functor& fn, const RObject& p_target, traits::normal_sign_t<signature_t>&&... params)-> auto
109+
if constexpr (!std::is_void_v<return_t>)
113110
{
114-
if constexpr (!std::is_void_v<return_t>)
115-
{
116-
const auto& target = p_target.view<record_t>()->get();
111+
const auto& target = p_target.view<record_t>()->get();
117112

118-
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
113+
auto mptr = static_cast<const method_ptr<record_t, return_t, signature_t...>&>(fn).f_ptr();
114+
115+
auto&& ret_v = (const_cast<record_t&>(target).*mptr)(std::forward<signature_t>(params)...);
119116

120-
auto&& ret_v = (const_cast<record_t&>(target).*mptr)(std::forward<signature_t>(params)...);
121-
122-
if constexpr (std::is_pointer_v<return_t>)
123-
{
124-
using raw_t = std::remove_pointer_t<return_t>;
125-
return std::any(static_cast<const raw_t*>(ret_v));
126-
}
127-
else if constexpr (std::is_reference_v<return_t>)
128-
{
129-
using raw_t = std::remove_cv_t<std::remove_reference_t<return_t>>;
130-
return std::any(static_cast<const raw_t*>(&ret_v));
131-
}
132-
else
133-
{
134-
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
135-
// TODO: enable it for move-constructible objects.
136-
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
137-
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
138-
}
117+
if constexpr (std::is_pointer_v<return_t>)
118+
{
119+
using raw_t = std::remove_pointer_t<return_t>;
120+
return std::any(static_cast<const raw_t*>(ret_v));
139121
}
140-
else return std::any();
141-
};
122+
else if constexpr (std::is_reference_v<return_t>)
123+
{
124+
using raw_t = std::remove_cv_t<std::remove_reference_t<return_t>>;
125+
return std::any(static_cast<const raw_t*>(&ret_v));
126+
}
127+
else
128+
{
129+
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
130+
// TODO: enable it for move-constructible objects.
131+
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
132+
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
133+
}
134+
}
135+
else return std::any();
142136
}
143137
};
144138
}

ReflectionTemplateLib/rtl/dispatch/method_ptr.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ namespace rtl::dispatch
2828
}
2929
else
3030
{
31-
m_erased_return.set_hop(lambda_t::e_return_a_target_fnr()); // erased-return-aware-target
31+
m_erased_return.set_hop(&lambda_t::e_return_a_target_fnr); // erased-return-aware-target
3232
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
33+
m_erased_method.set_hop(&lambda_t::e_return_e_target_fnr); // erased-return-erased-target
3434
}
3535

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

0 commit comments

Comments
 (0)