Skip to content

Commit 87233b5

Browse files
committed
organizing metadata: ctor-init improvements.
1 parent 9c33ffa commit 87233b5

File tree

8 files changed

+68
-75
lines changed

8 files changed

+68
-75
lines changed

ReflectionTemplateLib/rtl/cache/cache_function_ptr.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,12 @@ namespace rtl::cache
2828
return instance_;
2929
}
3030

31-
const dispatch::functor& push_ctor(return_t(*fptr)(signature_t...), traits::uid_t p_record_uid, std::size_t lambda_index) const
32-
{
33-
m_cache.emplace_back(std::make_pair(function_t(fptr, p_record_uid, detail::member::DefaultCtor), lambda_index));
34-
return m_cache.back().first;
35-
}
36-
37-
template<class record_t>
31+
template<detail::member mem_kind, class record_t>
3832
const dispatch::functor& push_ctor(traits::uid_t p_record_uid, std::size_t lambda_index) const
3933
{
40-
m_cache.emplace_back(std::make_pair(function_t(nullptr, p_record_uid, detail::member::UserCtor), lambda_index));
34+
m_cache.emplace_back(std::make_pair(function_t(nullptr, p_record_uid, mem_kind), lambda_index));
4135
function_t& fn = m_cache.back().first;
42-
fn.template init_lambda_ctor<record_t>();
36+
fn.template init_lambda<mem_kind, record_t>();
4337
return fn;
4438
}
4539

ReflectionTemplateLib/rtl/dispatch/function_lambda.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ namespace rtl::dispatch
1818
template<class...args_t>
1919
struct function_lambda<fn_void::no, erase::t_ctor, args_t...> : lambda
2020
{
21-
using lambda_t = std::function<Return(alloc, traits::normal_sign_t<args_t>...)>;
21+
// ditch all std::functions and use fn-pointer directly - what??? Yes!
22+
using lambda_t = Return(*)(alloc, traits::normal_sign_t<args_t>&&...);
2223

2324
const lambda_t& get_hop() const {
2425
return m_lambda;

ReflectionTemplateLib/rtl/dispatch/function_ptr.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ namespace rtl::dispatch
4949

5050
private:
5151

52-
const functor_t m_functor;
52+
functor_t m_functor = nullptr;
5353

5454
static constexpr auto fn_void_v = (std::is_void_v<return_t> ? fn_void::yes : fn_void::no);
5555

@@ -60,8 +60,8 @@ namespace rtl::dispatch
6060

6161
void init_lambda();
6262

63-
template<class record_t>
64-
void init_lambda_ctor();
63+
template<detail::member, class record_t>
64+
void init_lambda();
6565

6666
template<class, class ...>
6767
friend struct cache::function_ptr;

ReflectionTemplateLib/rtl/dispatch/function_ptr.hpp

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,38 @@
1717

1818
namespace rtl::dispatch
1919
{
20-
template<class return_t, class ...signature_t>
21-
template<class record_t>
22-
void function_ptr<return_t, signature_t...>::init_lambda_ctor()
23-
{
24-
m_lambda = ctor_t();
25-
ctor_t& fn = m_lambda.template emplace<ctor_t>();
26-
27-
fn.set_hop(aware_constructor<record_t, signature_t...>::get_allocator());
20+
template<class return_t, class ...signature_t>
21+
template<detail::member mem_kind, class record_t>
22+
void function_ptr<return_t, signature_t...>::init_lambda()
23+
{
24+
m_lambda = ctor_t();
25+
ctor_t& fn = m_lambda.template emplace<ctor_t>();
26+
if constexpr (mem_kind == detail::member::DefaultCtor) {
27+
m_functor = &aware_constructor<record_t>::default_ctor;
28+
}
29+
else {
30+
fn.set_hop(&aware_constructor<record_t, signature_t...>::overloaded_ctor);
31+
}
2832

29-
functor::m_lambdas = std::vector<lambda*>(1);
30-
functor::m_lambdas[index::erased_ctor] = (&fn);
31-
}
33+
functor::m_lambdas = std::vector<lambda*>(1);
34+
functor::m_lambdas[index::erased_ctor] = (&fn);
35+
}
3236

3337

34-
template<class return_t, class ...signature_t>
35-
void rtl::dispatch::function_ptr<return_t, signature_t...>::init_lambda()
36-
{
37-
m_lambda = func_t();
38-
func_t& fn = m_lambda.template emplace<func_t>();
38+
template<class return_t, class ...signature_t>
39+
void rtl::dispatch::function_ptr<return_t, signature_t...>::init_lambda()
40+
{
41+
m_lambda = func_t();
42+
func_t& fn = m_lambda.template emplace<func_t>();
3943

40-
if constexpr (fn_void_v == fn_void::yes) {
41-
fn.set_hop(aware_return<return_t, signature_t...>::get_lambda_void());
42-
}
43-
else {
44-
fn.set_hop(aware_return<return_t, signature_t...>::get_lambda_any_return());
45-
}
44+
if constexpr (fn_void_v == fn_void::yes) {
45+
fn.set_hop(aware_return<return_t, signature_t...>::get_lambda_void());
46+
}
47+
else {
48+
fn.set_hop(aware_return<return_t, signature_t...>::get_lambda_any_return());
49+
}
4650

47-
functor::m_lambdas = std::vector<lambda*>(1);
48-
functor::m_lambdas[index::erased_return] = (&fn);
49-
}
51+
functor::m_lambdas = std::vector<lambda*>(1);
52+
functor::m_lambdas[index::erased_return] = (&fn);
53+
}
5054
}

ReflectionTemplateLib/rtl/dispatch/method_ptr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ namespace rtl::dispatch
4949

5050
private:
5151

52-
const functor_t m_functor;
52+
const functor_t m_functor = nullptr;
5353

5454
static constexpr auto fn_void_v = (std::is_void_v<return_t> ? fn_void::yes : fn_void::no);
5555

ReflectionTemplateLib/rtl/erasure/aware_constructor.h

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,37 @@
1616

1717
namespace rtl::dispatch
1818
{
19-
template<class record_t, class ...signature_t>
20-
struct aware_constructor
21-
{
22-
static auto get_allocator()
23-
{
24-
return [](alloc p_alloc_on, traits::normal_sign_t<signature_t>&&...params)-> Return
19+
template<class record_t, class ...signature_t>
20+
struct aware_constructor
21+
{
22+
static Return overloaded_ctor(alloc p_alloc_on, traits::normal_sign_t<signature_t>&&...params)
23+
{
24+
if (p_alloc_on == alloc::Stack)
2525
{
26-
if (p_alloc_on == alloc::Stack)
27-
{
28-
if constexpr (std::is_copy_constructible_v<record_t>)
29-
{
30-
return {
31-
error::None,
32-
detail::RObjectBuilder<record_t>::template build<alloc::Stack>(
33-
record_t(std::forward<signature_t>(params)...), &aware_constructor<record_t>::cloner, true
34-
)
35-
};
36-
}
37-
}
38-
else if (p_alloc_on == alloc::Heap)
26+
if constexpr (std::is_copy_constructible_v<record_t>)
3927
{
4028
return {
4129
error::None,
42-
detail::RObjectBuilder<record_t*>::template build<alloc::Heap>(
43-
new record_t(std::forward<signature_t>(params)...), &aware_constructor<record_t>::cloner, true
30+
detail::RObjectBuilder<record_t>::template build<alloc::Stack>(
31+
record_t(std::forward<signature_t>(params)...), &aware_constructor<record_t>::copy_ctor, true
4432
)
4533
};
4634
}
47-
return { error::EmptyRObject, RObject{} }; //dead code. compiler warning omitted.
48-
};
49-
}
35+
}
36+
else if (p_alloc_on == alloc::Heap)
37+
{
38+
return {
39+
error::None,
40+
detail::RObjectBuilder<record_t*>::template build<alloc::Heap>(
41+
new record_t(std::forward<signature_t>(params)...), &aware_constructor<record_t>::copy_ctor, true
42+
)
43+
};
44+
}
45+
return { error::EmptyRObject, RObject{} }; //dead code. compiler warning omitted.
46+
}
5047

5148

52-
static Return allocator(alloc p_alloc_on)
49+
static Return default_ctor(alloc p_alloc_on)
5350
{
5451
if constexpr (std::is_default_constructible_v<record_t>)
5552
{
@@ -61,7 +58,7 @@ namespace rtl::dispatch
6158
return {
6259
error::None,
6360
detail::RObjectBuilder<record_t>::template build<alloc::Stack>(
64-
record_t(), &aware_constructor<record_t>::cloner, true
61+
record_t(), &aware_constructor<record_t>::copy_ctor, true
6562
)
6663
};
6764
}
@@ -70,7 +67,7 @@ namespace rtl::dispatch
7067
return {
7168
error::None,
7269
detail::RObjectBuilder<record_t*>::template build<alloc::Heap>(
73-
new record_t(), &aware_constructor<record_t>::cloner, true
70+
new record_t(), &aware_constructor<record_t>::copy_ctor, true
7471
)
7572
};
7673
default:
@@ -84,7 +81,7 @@ namespace rtl::dispatch
8481
}
8582

8683

87-
static Return cloner(alloc p_alloc_on, const RObject& p_other)
84+
static Return copy_ctor(alloc p_alloc_on, const RObject& p_other)
8885
{
8986
if constexpr (std::is_copy_constructible_v<record_t>)
9087
{
@@ -95,14 +92,14 @@ namespace rtl::dispatch
9592
return {
9693
error::None,
9794
detail::RObjectBuilder<record_t>::template build<alloc::Stack>(
98-
record_t(srcObj), &aware_constructor<record_t>::cloner, true
95+
record_t(srcObj), &aware_constructor<record_t>::copy_ctor, true
9996
)
10097
};
10198
case alloc::Heap:
10299
return {
103100
error::None,
104101
detail::RObjectBuilder<record_t*>::template build<alloc::Heap>(
105-
new record_t(srcObj), &aware_constructor<record_t>::cloner, true
102+
new record_t(srcObj), &aware_constructor<record_t>::copy_ctor, true
106103
)
107104
};
108105
default:

ReflectionTemplateLib/rtl/erasure/erase_return.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ namespace rtl::dispatch
4545
if constexpr (mem_kind == detail::member::UserCtor)
4646
{
4747
using record_t = return_t;
48-
m_ctor_hopper = aware_constructor<record_t, signature_t...>::get_allocator();
48+
m_ctor_hopper = &aware_constructor<record_t, signature_t...>::overloaded_ctor;
4949
}
5050
else
5151
{

ReflectionTemplateLib/rtl/inc/type_meta.hpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
#include "cache_lambda_method.h"
2424
#include "cache_lambda_function.h"
2525

26-
#include "aware_constructor.h"
27-
2826
namespace rtl
2927
{
3028
template<class ...args_t>
@@ -92,13 +90,12 @@ namespace rtl
9290
{
9391
if constexpr (sizeof...(signature_t) == 0) {
9492
auto& fc = cache::function_ptr<Return, alloc>::instance();
95-
auto fptr = &dispatch::aware_constructor<record_t>::allocator;
96-
auto& functor = fc.push_ctor(fptr, traits::uid<record_t>::value, p_index);
93+
auto& functor = fc.template push_ctor<detail::member::DefaultCtor, record_t>(traits::uid<record_t>::value, p_index);
9794
return type_meta(functor);
9895
}
9996
else {
10097
auto& fc = cache::function_ptr<Return, signature_t...>::instance();
101-
auto& functor = fc.template push_ctor<record_t>(traits::uid<record_t>::value, p_index);
98+
auto& functor = fc.template push_ctor<detail::member::UserCtor, record_t>(traits::uid<record_t>::value, p_index);
10299
return type_meta(functor);
103100
}
104101
}

0 commit comments

Comments
 (0)