Skip to content

Commit bcde3bb

Browse files
committed
organizing metadata: method_ptr.h, wip.
1 parent 25e8a86 commit bcde3bb

File tree

5 files changed

+177
-139
lines changed

5 files changed

+177
-139
lines changed

ReflectionTemplateLib/rtl/dispatch/fn_signature_rec.h

Lines changed: 80 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,69 +16,103 @@
1616

1717
namespace rtl::dispatch
1818
{
19-
template<class place_t, class...args_t>
20-
struct method_lambda<erase::t_return, place_t, args_t...> : lambda
21-
{
22-
using record_t = place_t;
23-
using lambda_vt = std::function<void(const lambda_base&, const record_t&, traits::normal_sign_t<args_t>...)>;
24-
using lambda_rt = std::function<std::any(const lambda_base&, const record_t&, traits::normal_sign_t<args_t>...)>;
19+
template<class place_t, class...args_t>
20+
struct method_lambda<fn_void::yes, erase::t_return, place_t, args_t...> : lambda
21+
{
22+
using record_t = place_t;
23+
using lambda_t = std::function<void(const lambda_base&, const record_t&, traits::normal_sign_t<args_t>...)>;
24+
25+
const lambda_t& get_hop() const {
26+
return m_lambda;
27+
}
28+
29+
private:
30+
31+
void set_hop(const lambda_t& lambda) {
32+
m_lambda = lambda;
33+
}
34+
35+
lambda_t m_lambda;
36+
37+
template<class, class , class...>
38+
friend struct method_ptr;
39+
};
40+
}
2541

26-
const lambda_vt& get_vhop() const {
27-
return std::get<lambda_vt>(m_lambda);
28-
}
2942

30-
const lambda_rt& get_rhop() const {
31-
return std::get<lambda_rt>(m_lambda);
32-
}
43+
namespace rtl::dispatch
44+
{
45+
template<class place_t, class...args_t>
46+
struct method_lambda<fn_void::no, erase::t_return, place_t, args_t...> : lambda
47+
{
48+
using record_t = place_t;
49+
using lambda_t = std::function<std::any(const lambda_base&, const record_t&, traits::normal_sign_t<args_t>...)>;
3350

34-
private:
51+
const lambda_t& get_hop() const {
52+
return m_lambda;
53+
}
3554

36-
std::variant<lambda_vt, lambda_rt> m_lambda;
55+
private:
3756

38-
void set_vhop(const lambda_vt& lambda) {
39-
m_lambda = lambda;
40-
}
57+
void set_hop(const lambda_t& lambda) {
58+
m_lambda = lambda;
59+
}
4160

42-
void set_rhop(const lambda_rt& lambda) {
43-
m_lambda = lambda;
44-
}
61+
lambda_t m_lambda;
4562

46-
template<class, class , class...>
47-
friend struct method_ptr;
48-
};
63+
template<class, class, class...>
64+
friend struct method_ptr;
65+
};
4966
}
5067

5168

5269
namespace rtl::dispatch
5370
{
54-
template<class place_t, class...args_t>
55-
struct method_lambda<erase::t_target, place_t, args_t...> : lambda
56-
{
57-
using return_t = place_t;
58-
using lambda_vt = std::function<void(const lambda_base&, const rtl::RObject&, traits::normal_sign_t<args_t>...)>;
59-
using lambda_rt = std::function<return_t(const lambda_base&, const rtl::RObject&, traits::normal_sign_t<args_t>...)>;
71+
template<class place_t, class...args_t>
72+
struct method_lambda<fn_void::yes, erase::t_target, place_t, args_t...> : lambda
73+
{
74+
using return_t = place_t;
75+
using lambda_t = std::function<void(const lambda_base&, const rtl::RObject&, traits::normal_sign_t<args_t>...)>;
76+
77+
const lambda_t& get_hop() const {
78+
return m_lambda;
79+
}
80+
81+
private:
82+
83+
void set_hop(const lambda_t& lambda) {
84+
m_lambda = lambda;
85+
}
6086

61-
const lambda_vt& get_vhop() const {
62-
return std::get<lambda_vt>(m_lambda);
63-
}
87+
lambda_t m_lambda;
6488

65-
const lambda_rt& get_rhop() const {
66-
return std::get<lambda_rt>(m_lambda);
67-
}
89+
template<class, class, class...>
90+
friend struct method_ptr;
91+
};
92+
}
93+
94+
95+
namespace rtl::dispatch
96+
{
97+
template<class place_t, class...args_t>
98+
struct method_lambda<fn_void::no, erase::t_target, place_t, args_t...> : lambda
99+
{
100+
using return_t = place_t;
101+
using lambda_t = std::function<return_t(const lambda_base&, const rtl::RObject&, traits::normal_sign_t<args_t>...)>;
68102

69-
private:
103+
const lambda_t& get_hop() const {
104+
return m_lambda;
105+
}
70106

71-
std::variant<lambda_vt, lambda_rt> m_lambda;
107+
private:
72108

73-
void set_vhop(const lambda_vt& lambda) {
74-
m_lambda = lambda;
75-
}
109+
void set_hop(const lambda_t& lambda) {
110+
m_lambda = lambda;
111+
}
76112

77-
void set_rhop(const lambda_rt& lambda) {
78-
m_lambda = lambda;
79-
}
113+
lambda_t m_lambda;
80114

81-
template<class, class, class...>
82-
friend struct method_ptr;
83-
};
115+
template<class, class, class...>
116+
friend struct method_ptr;
117+
};
84118
}

ReflectionTemplateLib/rtl/dispatch/method_ptr.h

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,46 +18,48 @@
1818

1919
namespace rtl::dispatch
2020
{
21-
template<class record_t, class return_t, class ...signature_t>
22-
struct method_ptr : functor
23-
{
24-
using functor_t = return_t(record_t::*)(signature_t...);
25-
26-
constexpr auto f_ptr() const {
27-
return m_functor;
28-
}
29-
30-
constexpr bool is_same(functor_t fptr) const {
31-
return (fptr == m_functor);
32-
}
33-
34-
method_ptr(functor_t fptr): m_functor(fptr)
35-
{
36-
m_member_kind = detail::member::NonConst;
21+
template<class record_t, class return_t, class ...signature_t>
22+
struct method_ptr : functor
23+
{
24+
using functor_t = return_t(record_t::*)(signature_t...);
25+
26+
constexpr auto f_ptr() const {
27+
return m_functor;
28+
}
29+
30+
constexpr bool is_same(functor_t fptr) const {
31+
return (fptr == m_functor);
32+
}
33+
34+
method_ptr(functor_t fptr): m_functor(fptr)
35+
{
36+
m_member_kind = detail::member::NonConst;
3737

38-
m_is_void = std::is_void_v<return_t>;
39-
m_return_id = traits::uid<return_t>::value;
40-
m_record_id = traits::uid<record_t>::value;
38+
m_is_void = std::is_void_v<return_t>;
39+
m_return_id = traits::uid<return_t>::value;
40+
m_record_id = traits::uid<record_t>::value;
4141

42-
m_is_any_arg_ncref = (traits::is_nonconst_ref_v<signature_t> || ...);
43-
m_normal_args_id = traits::uid<traits::normal_sign_id_t<signature_t...>>::value;
44-
m_strict_args_id = traits::uid<traits::strict_sign_id_t<signature_t...>>::value;
42+
m_is_any_arg_ncref = (traits::is_nonconst_ref_v<signature_t> || ...);
43+
m_normal_args_id = traits::uid<traits::normal_sign_id_t<signature_t...>>::value;
44+
m_strict_args_id = traits::uid<traits::strict_sign_id_t<signature_t...>>::value;
4545

46-
m_return_str = detail::TypeId<return_t>::toString();
47-
m_record_str = detail::TypeId<record_t>::toString();
48-
m_signature_str = detail::TypeId<signature_t...>::toString();
49-
}
46+
m_return_str = detail::TypeId<return_t>::toString();
47+
m_record_str = detail::TypeId<record_t>::toString();
48+
m_signature_str = detail::TypeId<signature_t...>::toString();
49+
}
5050

51-
private:
51+
private:
52+
53+
const functor_t m_functor;
5254

53-
const functor_t m_functor;
55+
static constexpr auto fn_void_v = (std::is_void_v<return_t> ? fn_void::yes : fn_void::no);
5456

55-
method_lambda<erase::t_return, record_t, signature_t...> m_erased_return;
56-
method_lambda<erase::t_target, return_t, signature_t...> m_erased_target;
57+
method_lambda<fn_void_v, erase::t_return, record_t, signature_t...> m_erased_return;
58+
method_lambda<fn_void_v, erase::t_target, return_t, signature_t...> m_erased_target;
5759

58-
void init_lambda();
60+
void init_lambda();
5961

60-
template<class, class, class ...>
61-
friend struct cache::method_ptr;
62-
};
62+
template<class, class, class ...>
63+
friend struct cache::method_ptr;
64+
};
6365
}

ReflectionTemplateLib/rtl/dispatch/method_ptr.hpp

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,32 @@
1717

1818
namespace rtl::dispatch
1919
{
20-
template<class record_t, class return_t, class ...signature_t>
21-
void method_ptr<record_t, return_t, signature_t...>::init_lambda()
22-
{
23-
if constexpr (std::is_void_v<return_t>)
24-
{
25-
{
26-
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_return_a_target_fnv();
27-
m_erased_return.set_vhop(fn);
28-
} {
29-
//const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_target_a_return_fnv();
30-
//m_erased_target.set_vhop(fn);
31-
}
32-
}
33-
else
34-
{
35-
{
36-
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_return_a_target_fnr();
37-
m_erased_return.set_rhop(fn);
38-
} {
39-
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_target_a_return_fnr();
40-
m_erased_target.set_rhop(fn);
41-
}
42-
}
20+
template<class record_t, class return_t, class ...signature_t>
21+
void method_ptr<record_t, return_t, signature_t...>::init_lambda()
22+
{
23+
if constexpr (std::is_void_v<return_t>)
24+
{
25+
{
26+
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_return_a_target_fnv();
27+
m_erased_return.set_hop(fn);
28+
} {
29+
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_target_a_return_fnv();
30+
m_erased_target.set_hop(fn);
31+
}
32+
}
33+
else
34+
{
35+
{
36+
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_return_a_target_fnr();
37+
m_erased_return.set_hop(fn);
38+
} {
39+
const auto& fn = aware_return_n_target<record_t, return_t, signature_t...>::e_target_a_return_fnr();
40+
m_erased_target.set_hop(fn);
41+
}
42+
}
4343

44-
functor::m_lambdas = std::vector<lambda*>(2);
45-
functor::m_lambdas[index::erased_return] = (&m_erased_return);
46-
functor::m_lambdas[index::erased_target] = (&m_erased_target);
47-
}
44+
functor::m_lambdas = std::vector<lambda*>(2);
45+
functor::m_lambdas[index::erased_return] = (&m_erased_return);
46+
functor::m_lambdas[index::erased_target] = (&m_erased_target);
47+
}
4848
}

ReflectionTemplateLib/rtl/dispatch/method_ptr_const.h

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,46 +18,48 @@
1818

1919
namespace rtl::dispatch
2020
{
21-
template<class record_t, class return_t, class ...signature_t>
22-
struct method_ptr<const record_t, return_t, signature_t...> : functor
23-
{
24-
using functor_t = return_t(record_t::*)(signature_t...) const;
21+
template<class record_t, class return_t, class ...signature_t>
22+
struct method_ptr<const record_t, return_t, signature_t...> : functor
23+
{
24+
using functor_t = return_t(record_t::*)(signature_t...) const;
2525

26-
constexpr auto f_ptr() const {
27-
return m_functor;
28-
}
26+
constexpr auto f_ptr() const {
27+
return m_functor;
28+
}
2929

30-
constexpr bool is_same(functor_t fptr) const {
31-
return (fptr == m_functor);
32-
}
30+
constexpr bool is_same(functor_t fptr) const {
31+
return (fptr == m_functor);
32+
}
3333

34-
method_ptr(functor_t fptr): m_functor(fptr)
35-
{
36-
m_member_kind = detail::member::Const;
34+
method_ptr(functor_t fptr) : m_functor(fptr)
35+
{
36+
m_member_kind = detail::member::Const;
3737

38-
m_return_id = traits::uid<return_t>::value;
39-
m_is_void = (m_return_id == traits::uid<void>::value);
40-
m_record_id = traits::uid<const record_t>::value;
38+
m_return_id = traits::uid<return_t>::value;
39+
m_is_void = (m_return_id == traits::uid<void>::value);
40+
m_record_id = traits::uid<const record_t>::value;
4141

42-
m_is_any_arg_ncref = (traits::is_nonconst_ref_v<signature_t> || ...);
43-
m_normal_args_id = traits::uid<traits::normal_sign_id_t<signature_t...>>::value;
44-
m_strict_args_id = traits::uid<traits::strict_sign_id_t<signature_t...>>::value;
42+
m_is_any_arg_ncref = (traits::is_nonconst_ref_v<signature_t> || ...);
43+
m_normal_args_id = traits::uid<traits::normal_sign_id_t<signature_t...>>::value;
44+
m_strict_args_id = traits::uid<traits::strict_sign_id_t<signature_t...>>::value;
4545

46-
m_return_str = detail::TypeId<return_t>::toString();
47-
m_record_str = detail::TypeId<record_t>::toString();
48-
m_signature_str = detail::TypeId<signature_t...>::toString();
49-
}
46+
m_return_str = detail::TypeId<return_t>::toString();
47+
m_record_str = detail::TypeId<record_t>::toString();
48+
m_signature_str = detail::TypeId<signature_t...>::toString();
49+
}
5050

51-
private:
51+
private:
5252

53-
const functor_t m_functor;
53+
const functor_t m_functor;
5454

55-
method_lambda<erase::t_return, record_t, signature_t...> m_erased_return;
56-
method_lambda<erase::t_target, return_t, signature_t...> m_erased_target;
55+
static constexpr auto fn_void_v = (std::is_void_v<return_t> ? fn_void::yes : fn_void::no);
5756

58-
void init_lambda();
57+
method_lambda<fn_void_v, erase::t_return, record_t, signature_t...> m_erased_return;
58+
method_lambda<fn_void_v, erase::t_target, return_t, signature_t...> m_erased_target;
5959

60-
template<class, class, class ...>
61-
friend struct cache::method_ptr;
62-
};
60+
void init_lambda();
61+
62+
template<class, class, class ...>
63+
friend struct cache::method_ptr;
64+
};
6365
}

ReflectionTemplateLib/rtl/rtl_forward_decls.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ namespace rtl
125125
template<fn_void, erase, class...args_t>
126126
struct function_lambda;
127127

128-
template<erase, class known_t, class...args_t>
128+
template<fn_void, erase, class known_t, class...args_t>
129129
struct method_lambda;
130130

131131
template<class return_t, class ...signature_t>

0 commit comments

Comments
 (0)