Skip to content

Commit 0dd9111

Browse files
committed
organizing fptr metadata, wip..
1 parent 22d7c2e commit 0dd9111

File tree

7 files changed

+86
-79
lines changed

7 files changed

+86
-79
lines changed

ReflectionTemplateLib/rtl/dispatch/fn_meta.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
#pragma once
1313

14+
#include <vector>
15+
1416
#include "rtl_traits.h"
1517

1618
namespace rtl::dispatch
@@ -38,5 +40,14 @@ namespace rtl::dispatch
3840
std::vector<std::size_t> m_args_type_ids = {};
3941

4042
detail::member m_member_kind = detail::member::None;
43+
44+
enum index {
45+
ctor = 0, // constructor
46+
fn_eret = 0, // function-erased-return
47+
mth_eret = 0, // method-erased-return
48+
mth_etar = 1 // method-erased-target
49+
};
50+
51+
std::vector<fn_lambda*> m_lambda;
4152
};
4253
}

ReflectionTemplateLib/rtl/dispatch/fn_signature.h

Lines changed: 30 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -11,73 +11,58 @@
1111

1212
#pragma once
1313

14+
#include <variant>
15+
1416
#include "fn_meta.h"
1517

1618
namespace rtl::dispatch
1719
{
1820
template<class...args_t>
19-
struct fn_signature : fn_meta
21+
struct function_er_ctor : fn_lambda
2022
{
21-
using lambda_vt = std::function<void(const fn_meta&, traits::normal_sign_t<args_t>...)>;
22-
23-
using lambda_rt = std::function<std::any(const fn_meta&, traits::normal_sign_t<args_t>...)>;
24-
25-
using lambda_ctor_t = std::function<Return(alloc, traits::normal_sign_t<args_t>...)>;
26-
27-
using lambda_mth_vt = std::function<void(const lambda_base&, const RObject&, traits::normal_sign_t<args_t>...)>;
23+
using lambda_t = std::function<Return(alloc, traits::normal_sign_t<args_t>...)>;
2824

29-
using lambda_mth_rt = std::function<std::any(const lambda_base&, const RObject&, traits::normal_sign_t<args_t>...)>;
30-
31-
constexpr lambda_vt get_function_vhop() const {
32-
return fn_vhop;
25+
const lambda_t& get_ctor_hop() const {
26+
return m_lambda;
3327
}
3428

35-
constexpr lambda_rt get_function_rhop() const {
36-
return fn_rhop;
37-
}
38-
39-
constexpr lambda_ctor_t get_ctor_hop() const {
40-
return ctor_hop;
41-
}
29+
private:
4230

43-
constexpr lambda_mth_vt get_method_vhop() const {
44-
return mth_vhop;
45-
}
31+
lambda_t m_lambda;
4632

47-
constexpr lambda_mth_rt get_method_rhop() const {
48-
return mth_rhop;
33+
void set_ctor_hop(const lambda_t& lambda) {
34+
m_lambda = lambda;
4935
}
36+
};
37+
}
5038

51-
private:
52-
53-
lambda_vt fn_vhop = nullptr;
54-
lambda_rt fn_rhop = nullptr;
55-
56-
lambda_mth_vt mth_vhop = nullptr;
57-
lambda_mth_rt mth_rhop = nullptr;
58-
lambda_ctor_t ctor_hop = nullptr;
5939

60-
fn_lambda* erased_return = nullptr;
61-
fn_lambda* erased_target = nullptr;
40+
namespace rtl::dispatch
41+
{
42+
template<class...args_t>
43+
struct function_er_return : fn_lambda
44+
{
45+
using lambda_vt = std::function<void(const fn_meta&, traits::normal_sign_t<args_t>...)>;
46+
using lambda_rt = std::function<std::any(const fn_meta&, traits::normal_sign_t<args_t>...)>;
6247

63-
constexpr void set_function_vhop(const lambda_vt& lambda) const {
64-
fn_vhop = lambda;
48+
const lambda_vt& get_method_vhop() const {
49+
return std::get<lambda_vt>(m_lambda);
6550
}
6651

67-
constexpr void set_function_rhop(const lambda_rt& lambda) const {
68-
fn_rhop = lambda;
52+
const lambda_rt& get_method_rhop() const {
53+
return std::get<lambda_rt>(m_lambda);
6954
}
7055

71-
constexpr void set_ctor_hop(const lambda_ctor_t& lambda) const {
72-
ctor_hop = lambda;
73-
}
56+
private:
57+
58+
std::variant<lambda_vt, lambda_rt> m_lambda;
7459

75-
constexpr void set_method_vhop(const lambda_mth_vt& lambda) const {
76-
mth_vhop = lambda;
60+
void set_method_vhop(const lambda_vt& lambda) {
61+
m_lambda = lambda;
7762
}
7863

79-
constexpr void set_method_rhop(const lambda_mth_rt& lambda) const {
80-
mth_rhop = lambda;
64+
void set_method_rhop(const lambda_rt& lambda) {
65+
m_lambda = lambda;
8166
}
8267
};
8368
}

ReflectionTemplateLib/rtl/dispatch/fn_signature_rec.h

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,36 @@
1111

1212
#pragma once
1313

14+
#include <variant>
15+
1416
#include "fn_meta.h"
1517

1618
namespace rtl::dispatch
1719
{
1820
template<class record_t, class...args_t>
19-
struct fn_signature_target : fn_lambda
21+
struct method_er_return : fn_lambda
2022
{
2123
using lambda_vt = std::function<void(const fn_meta&, const record_t&, traits::normal_sign_t<args_t>...)>;
2224
using lambda_rt = std::function<std::any(const fn_meta&, const record_t&, traits::normal_sign_t<args_t>...)>;
2325

24-
constexpr lambda_vt get_method_vhop() const {
25-
return vhop;
26+
const lambda_vt& get_method_vhop() const {
27+
return std::get<lambda_vt>(m_lambda);
2628
}
2729

28-
constexpr lambda_rt get_method_rhop() const {
29-
return rhop;
30+
const lambda_rt& get_method_rhop() const {
31+
return std::get<lambda_rt>(m_lambda);
3032
}
3133

3234
private:
3335

34-
lambda_vt vhop = nullptr;
35-
lambda_rt rhop = nullptr;
36+
std::variant<lambda_vt, lambda_rt> m_lambda;
3637

37-
constexpr void set_method_vhop(const lambda_vt& lambda) const {
38-
vhop = lambda;
38+
void set_method_vhop(const lambda_vt& lambda) {
39+
m_lambda = lambda;
3940
}
4041

41-
constexpr void set_method_rhop(const lambda_rt& lambda) const {
42-
rhop = lambda;
42+
void set_method_rhop(const lambda_rt& lambda) {
43+
m_lambda = lambda;
4344
}
4445
};
4546
}
@@ -48,30 +49,29 @@ namespace rtl::dispatch
4849
namespace rtl::dispatch
4950
{
5051
template<class return_t, class...args_t>
51-
struct fn_signature_return : fn_lambda
52+
struct method_er_target : fn_lambda
5253
{
5354
using lambda_vt = std::function<void(const fn_meta&, const rtl::RObject&, traits::normal_sign_t<args_t>...)>;
5455
using lambda_rt = std::function<return_t(const fn_meta&, const rtl::RObject&, traits::normal_sign_t<args_t>...)>;
5556

56-
constexpr lambda_vt get_method_vhop() const {
57-
return vhop;
57+
const lambda_vt& get_method_vhop() const {
58+
return std::get<lambda_vt>(m_lambda);
5859
}
5960

60-
constexpr lambda_rt get_method_rhop() const {
61-
return rhop;
61+
const lambda_rt& get_method_rhop() const {
62+
return std::get<lambda_rt>(m_lambda);
6263
}
6364

6465
private:
6566

66-
lambda_vt vhop = nullptr;
67-
lambda_rt rhop = nullptr;
67+
std::variant<lambda_vt, lambda_rt> m_lambda;
6868

69-
constexpr void set_method_vhop(const lambda_vt& lambda) const {
70-
vhop = lambda;
69+
void set_method_vhop(const lambda_vt& lambda) {
70+
m_lambda = lambda;
7171
}
7272

73-
constexpr void set_method_rhop(const lambda_rt& lambda) const {
74-
rhop = lambda;
73+
void set_method_rhop(const lambda_rt& lambda) {
74+
m_lambda = lambda;
7575
}
7676
};
7777
}

ReflectionTemplateLib/rtl/dispatch/function_ptr.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@
1212
#pragma once
1313

1414
#include "functor.h"
15+
#include "fn_signature.h"
1516

1617
namespace rtl::dispatch
1718
{
1819
template<class return_t, class ...signature_t>
19-
struct function_ptr: public functor
20+
struct function_ptr: functor//, fn_meta
2021
{
2122
using functor_t = return_t(*)(signature_t...);
2223

@@ -47,5 +48,10 @@ namespace rtl::dispatch
4748
private:
4849

4950
const functor_t m_functor;
51+
52+
using ctor_et = function_er_ctor<signature_t...>;
53+
using func_et = function_er_return<signature_t...>;
54+
55+
std::variant<func_et, ctor_et> erased_return;
5056
};
5157
}

ReflectionTemplateLib/rtl/dispatch/method_ptr.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,12 @@
1414
#include <tuple>
1515

1616
#include "functor.h"
17-
1817
#include "fn_signature_rec.h"
1918

2019
namespace rtl::dispatch
2120
{
2221
template<class record_t, class return_t, class ...signature_t>
23-
struct method_ptr : public functor
22+
struct method_ptr : functor//, fn_meta
2423
{
2524
using functor_t = return_t(record_t::*)(signature_t...);
2625

@@ -53,8 +52,7 @@ namespace rtl::dispatch
5352

5453
const functor_t m_functor;
5554

56-
fn_signature_target<record_t, signature_t...> m_erased_target;
57-
58-
fn_signature_return<return_t, signature_t...> m_erased_return;
55+
method_er_return<record_t, signature_t...> m_erased_target;
56+
method_er_target<return_t, signature_t...> m_erased_return;
5957
};
6058
}

ReflectionTemplateLib/rtl/dispatch/method_ptr_const.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@
1414
#include <tuple>
1515

1616
#include "functor.h"
17+
#include "fn_signature_rec.h"
1718

1819
namespace rtl::dispatch
1920
{
2021
template<class record_t, class return_t, class ...signature_t>
21-
struct method_ptr<const record_t, return_t, signature_t...> : public functor
22+
struct method_ptr<const record_t, return_t, signature_t...> : functor//, fn_meta
2223
{
2324
using functor_t = return_t(record_t::*)(signature_t...) const;
2425

@@ -50,5 +51,8 @@ namespace rtl::dispatch
5051
private:
5152

5253
const functor_t m_functor;
54+
55+
method_er_return<record_t, signature_t...> m_erased_target;
56+
method_er_target<return_t, signature_t...> m_erased_return;
5357
};
5458
}

ReflectionTemplateLib/rtl/rtl_forward_decls.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,17 @@ namespace rtl
106106

107107
struct fn_lambda {};
108108

109-
template<class...args_t>
110-
struct fn_signature;
111-
112109
template<class record_t, class...args_t>
113-
struct fn_signature_target;
110+
struct method_er_return;
114111

115112
template<class return_t, class...args_t>
116-
struct fn_signature_return;
113+
struct method_er_target;
114+
115+
template<class...args_t>
116+
struct function_er_return;
117+
118+
template<class...args_t>
119+
struct function_er_ctor;
117120

118121
template<class return_t, class ...signature_t>
119122
struct function_ptr;

0 commit comments

Comments
 (0)