Skip to content

Commit e08ab47

Browse files
committed
parametrized-ctor dispatch in place now.
1 parent 6e49b7d commit e08ab47

11 files changed

+65
-127
lines changed

ReflectionTemplateLib/rtl/cache/cache_lambda_function.h

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include <list>
1515

1616
#include "lambda_function.h"
17-
#include "aware_return.h"
1817
#include "erase_return.h"
1918

2019
namespace rtl::cache
@@ -30,19 +29,11 @@ namespace rtl::cache
3029

3130
std::pair<const dispatch::lambda_base*, const dispatch::erasure_base*> push(const dispatch::functor& p_functor) const
3231
{
33-
using aware_ret_t = dispatch::aware_return<return_t, signature_t...>;
3432
using erase_ret_t = dispatch::erase_return<traits::normal_sign_t<signature_t>...>;
35-
3633
m_erasure_cache.emplace_back(erase_ret_t());
37-
erase_ret_t& eb = m_erasure_cache.back();
3834

39-
if constexpr (std::is_void_v<return_t>) {
40-
eb.m_vhopper = aware_ret_t::get_lambda_void();
41-
}
42-
else {
43-
eb.m_rhopper = aware_ret_t::get_lambda_any_return();
44-
}
45-
eb.template init_base<return_t>();
35+
erase_ret_t& eb = m_erasure_cache.back();
36+
eb.template init_base<false, return_t, signature_t...>();
4637

4738
m_cache.push_back(dispatch::lambda_function<signature_t...>(p_functor, eb));
4839
return { &m_cache.back(), &eb };

ReflectionTemplateLib/rtl/erasure/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ set(LOCAL_HEADERS
66
"${CMAKE_CURRENT_SOURCE_DIR}/erasure_base.h"
77
"${CMAKE_CURRENT_SOURCE_DIR}/erasure_base.hpp"
88
"${CMAKE_CURRENT_SOURCE_DIR}/erase_return.h"
9-
"${CMAKE_CURRENT_SOURCE_DIR}/erase_constructor.h"
109
"${CMAKE_CURRENT_SOURCE_DIR}/erase_return_n_target.h"
1110
"${CMAKE_CURRENT_SOURCE_DIR}/erase_return_aware_target.h"
1211
"${CMAKE_CURRENT_SOURCE_DIR}/erase_target_aware_return.h"

ReflectionTemplateLib/rtl/erasure/aware_constructor.h

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,17 @@
1111

1212
#pragma once
1313

14-
#include "RObject.h"
1514
#include "rtl_errors.h"
16-
#include "erase_constructor.h"
17-
1815
#include "RObjectBuilder.hpp"
1916

2017
namespace rtl::dispatch
2118
{
2219
template<class record_t, class ...signature_t>
23-
struct aware_constructor : public erase_constructor<traits::normal_sign_t<signature_t>...>
20+
struct aware_constructor
2421
{
25-
using this_t = aware_constructor;
26-
using base_t = erase_constructor<traits::normal_sign_t<signature_t>...>;
27-
28-
aware_constructor(): base_t(this_t::get_allocator())
29-
{ }
30-
31-
template<class ...args_t>
3222
static Return get_allocator()
3323
{
34-
return [](alloc p_alloc_on, args_t...params)-> Return
24+
return [](alloc p_alloc_on, traits::normal_sign_t<signature_t>&&...params)-> Return
3525
{
3626
if (p_alloc_on == alloc::Stack)
3727
{
@@ -40,7 +30,7 @@ namespace rtl::dispatch
4030
return {
4131
error::None,
4232
detail::RObjectBuilder<record_t>::template build<alloc::Stack>(
43-
record_t(std::forward<args_t>(params)...), &aware_constructor<record_t>::cloner, true
33+
record_t(std::forward<signature_t>(params)...), &aware_constructor<record_t>::cloner, true
4434
)
4535
};
4636
}
@@ -50,7 +40,7 @@ namespace rtl::dispatch
5040
return {
5141
error::None,
5242
detail::RObjectBuilder<record_t*>::template build<alloc::Heap>(
53-
new record_t(std::forward<args_t>(params)...), &aware_constructor<record_t>::cloner, true
43+
new record_t(std::forward<signature_t>(params)...), &aware_constructor<record_t>::cloner, true
5444
)
5545
};
5646
}

ReflectionTemplateLib/rtl/erasure/aware_return.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ namespace rtl::dispatch
5757
else
5858
{
5959
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
60-
// TODO: enable it for move-constructible objects, NRVO.
60+
// TODO: enable it for move-constructible objects.
6161
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
6262
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
6363
}

ReflectionTemplateLib/rtl/erasure/aware_return_n_target.h

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,27 @@ namespace rtl::dispatch
2929
using e_return_t = erase_return_aware_target<record_t, traits::normal_sign_t<signature_t>...>;
3030
using e_target_t = erase_target_aware_return<return_t, traits::normal_sign_t<signature_t>...>;
3131

32-
constexpr static bool is_void = (std::is_void_v<return_t>);
33-
3432
e_return_t e_return;
3533
e_target_t e_target;
3634

37-
aware_return_n_target()
38-
: base_t( is_void ? this_t::e_return_e_target_fnv() : decltype(this_t::e_return_e_target_fnv()) {},
39-
!is_void ? this_t::e_return_e_target_fnr() : decltype(this_t::e_return_e_target_fnr()) {})
40-
41-
, e_return( is_void ? this_t::e_return_a_target_fnv() : decltype(this_t::e_return_a_target_fnv()) {},
42-
!is_void ? this_t::e_return_a_target_fnr() : decltype(this_t::e_return_a_target_fnr()) {})
35+
constexpr static bool is_void = (std::is_void_v<return_t>);
4336

44-
, e_target( is_void ? this_t::e_target_a_return_fnv() : decltype(this_t::e_target_a_return_fnv()) {},
45-
!is_void ? this_t::e_target_a_return_fnr() : decltype(this_t::e_target_a_return_fnr()) {})
37+
void init_base()
4638
{
4739
constexpr static bool is_const_cast_safe = (!traits::is_const_v<return_t>);
4840
base_t::m_return_id = detail::RObjectId::create<return_t, alloc::Stack>(is_const_cast_safe);
49-
}
5041

51-
void init_base()
52-
{
42+
if constexpr (is_void) {
43+
base_t::m_vhopper = e_return_e_target_fnv();
44+
e_return.m_vhopper = e_return_a_target_fnv();
45+
e_target.m_vhopper = e_target_a_return_fnv();
46+
}
47+
else {
48+
base_t::m_rhopper = e_return_e_target_fnr();
49+
e_return.m_rhopper = e_return_a_target_fnr();
50+
e_target.m_rhopper = e_target_a_return_fnr();
51+
}
52+
5353
e_return.m_return_id = base_t::m_return_id;
5454
e_target.m_return_id = base_t::m_return_id;
5555

@@ -148,7 +148,7 @@ namespace rtl::dispatch
148148
else
149149
{
150150
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
151-
// TODO: enable it for move-constructible objects, NRVO.
151+
// TODO: enable it for move-constructible objects.
152152
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
153153
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
154154
}
@@ -184,7 +184,7 @@ namespace rtl::dispatch
184184
else
185185
{
186186
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
187-
// TODO: enable it for move-constructible objects, NRVO.
187+
// TODO: enable it for move-constructible objects.
188188
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
189189
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
190190
}

ReflectionTemplateLib/rtl/erasure/aware_return_n_target_const.h

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,32 +29,30 @@ namespace rtl::dispatch
2929
using e_return_t = erase_return_aware_target<record_t, traits::normal_sign_t<signature_t>...>;
3030
using e_target_t = erase_target_aware_return<return_t, traits::normal_sign_t<signature_t>...>;
3131

32-
constexpr static bool is_void = (std::is_void_v<return_t>);
33-
3432
e_return_t e_return;
3533
e_target_t e_target;
3634

37-
aware_return_n_target(const aware_return_n_target&) = delete;
38-
39-
aware_return_n_target()
40-
: base_t( is_void ? this_t::e_return_e_target_fnv() : decltype(this_t::e_return_e_target_fnv()) {},
41-
!is_void ? this_t::e_return_e_target_fnr() : decltype(this_t::e_return_e_target_fnr()) {})
42-
43-
, e_return( is_void ? this_t::e_return_a_target_fnv() : decltype(this_t::e_return_a_target_fnv()) {},
44-
!is_void ? this_t::e_return_a_target_fnr() : decltype(this_t::e_return_a_target_fnr()) {})
35+
constexpr static bool is_void = (std::is_void_v<return_t>);
4536

46-
, e_target( is_void ? this_t::e_target_a_return_fnv() : decltype(this_t::e_target_a_return_fnv()) {},
47-
!is_void ? this_t::e_target_a_return_fnr() : decltype(this_t::e_target_a_return_fnr()) {})
37+
void init_base()
4838
{
4939
constexpr static bool is_const_cast_safe = (!traits::is_const_v<return_t>);
5040
base_t::m_return_id = detail::RObjectId::create<return_t, alloc::Stack>(is_const_cast_safe);
51-
}
5241

53-
void init_base()
54-
{
5542
e_return.m_return_id = base_t::m_return_id;
5643
e_target.m_return_id = base_t::m_return_id;
5744

45+
if constexpr (is_void) {
46+
base_t::m_vhopper = e_return_e_target_fnv();
47+
e_return.m_vhopper = e_return_a_target_fnv();
48+
e_target.m_vhopper = e_target_a_return_fnv();
49+
}
50+
else {
51+
base_t::m_rhopper = e_return_e_target_fnr();
52+
e_return.m_rhopper = e_return_a_target_fnr();
53+
e_target.m_rhopper = e_target_a_return_fnr();
54+
}
55+
5856
base_t::m_erased_return = &e_return;
5957
base_t::m_erased_target = &e_target;
6058
}
@@ -150,7 +148,7 @@ namespace rtl::dispatch
150148
else
151149
{
152150
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
153-
// TODO: enable it for move-constructible objects, NRVO.
151+
// TODO: enable it for move-constructible objects.
154152
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
155153
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
156154
}
@@ -186,7 +184,7 @@ namespace rtl::dispatch
186184
else
187185
{
188186
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
189-
// TODO: enable it for move-constructible objects, NRVO.
187+
// TODO: enable it for move-constructible objects.
190188
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
191189
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
192190
}

ReflectionTemplateLib/rtl/erasure/erase_constructor.h

Lines changed: 0 additions & 35 deletions
This file was deleted.

ReflectionTemplateLib/rtl/erasure/erase_return.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#include <functional>
1515

1616
#include "erasure_base.h"
17+
#include "aware_return.h"
18+
#include "aware_constructor.h"
1719

1820
namespace rtl::dispatch
1921
{
@@ -37,11 +39,25 @@ namespace rtl::dispatch
3739

3840
lambda_ctor_t m_ctor_hopper = nullptr;
3941

40-
template<class return_t>
42+
template<bool is_ctor, class return_t, class...signature_t>
4143
void init_base()
4244
{
43-
constexpr static bool is_const_cast_safe = (!traits::is_const_v<return_t>);
44-
m_return_id = detail::RObjectId::create<return_t, alloc::Stack>(is_const_cast_safe);
45+
if constexpr (is_ctor)
46+
{
47+
using record_t = return_t;
48+
m_ctor_hopper = aware_constructor<record_t, signature_t...>::get_allocator();
49+
}
50+
else
51+
{
52+
if constexpr (std::is_void_v<return_t>) {
53+
m_vhopper = aware_return<return_t, signature_t...>::get_lambda_void();
54+
}
55+
else {
56+
m_rhopper = aware_return<return_t, signature_t...>::get_lambda_any_return();
57+
}
58+
constexpr static bool is_const_cast_safe = (!traits::is_const_v<return_t>);
59+
m_return_id = detail::RObjectId::create<return_t, alloc::Stack>(is_const_cast_safe);
60+
}
4561
}
4662

4763
template<class, class...>

ReflectionTemplateLib/rtl/erasure/erase_return_aware_target.h

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,9 @@ namespace rtl::dispatch
3131

3232
private:
3333

34-
lambda_vt m_vhopper;
34+
lambda_vt m_vhopper = nullptr;
3535

36-
lambda_rt m_rhopper;
37-
38-
erase_return_aware_target( const lambda_vt& p_void_hop,
39-
const lambda_rt& p_any_ret_hop ) noexcept
40-
41-
: m_vhopper(p_void_hop)
42-
, m_rhopper(p_any_ret_hop)
43-
{ }
36+
lambda_rt m_rhopper = nullptr;
4437

4538
template<class, class, class ...>
4639
friend struct aware_return_n_target;

ReflectionTemplateLib/rtl/erasure/erase_return_n_target.h

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,10 @@ namespace rtl::dispatch
4141

4242
protected:
4343

44-
lambda_vt m_vhopper;
45-
lambda_rt m_rhopper;
44+
lambda_vt m_vhopper = nullptr;
45+
lambda_rt m_rhopper = nullptr;
4646

47-
const erasure_base* m_erased_return;
48-
const erasure_base* m_erased_target;
49-
50-
erase_return_n_target( const lambda_vt& p_void_hop,
51-
const lambda_rt& p_any_ret_hop ) noexcept
52-
53-
: m_vhopper(p_void_hop)
54-
, m_rhopper(p_any_ret_hop)
55-
{ }
47+
const erasure_base* m_erased_return = nullptr;
48+
const erasure_base* m_erased_target = nullptr;
5649
};
5750
}

0 commit comments

Comments
 (0)