Skip to content

Commit 33e48cc

Browse files
committed
erase_return function cache improvement.
1 parent 666afbd commit 33e48cc

File tree

7 files changed

+46
-32
lines changed

7 files changed

+46
-32
lines changed

ReflectionTemplateLib/rtl/cache/cache_lambda_function.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "lambda_function.h"
1717
#include "aware_return.h"
18+
#include "erase_return.h"
1819

1920
namespace rtl::cache
2021
{
@@ -29,12 +30,21 @@ namespace rtl::cache
2930

3031
std::pair<const dispatch::lambda_base*, const dispatch::erasure_base*> push(const dispatch::functor& p_functor) const
3132
{
32-
m_erasure_cache.emplace_back(dispatch::aware_return<return_t, signature_t...>());
33+
using aware_ret_t = dispatch::aware_return<return_t, signature_t...>;
34+
using erase_ret_t = dispatch::erase_return<traits::normal_sign_t<signature_t>...>;
3335

34-
const dispatch::erasure_base& eb = m_erasure_cache.back();
36+
m_erasure_cache.emplace_back(erase_ret_t());
37+
erase_ret_t& eb = m_erasure_cache.back();
3538

36-
m_cache.push_back(dispatch::lambda_function<signature_t...>(p_functor, eb));
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.init_base<return_t>();
3746

47+
m_cache.push_back(dispatch::lambda_function<signature_t...>(p_functor, eb));
3848
return { &m_cache.back(), &eb };
3949
}
4050

@@ -47,7 +57,7 @@ namespace rtl::cache
4757

4858
// No reallocation occurs; original objects stay intact
4959
mutable std::list<dispatch::lambda_function<signature_t...>> m_cache;
50-
mutable std::list<dispatch::aware_return<return_t, signature_t...>> m_erasure_cache;
60+
mutable std::list<dispatch::erase_return<traits::normal_sign_t<signature_t>...>> m_erasure_cache;
5161

5262
lambda_function() = default;
5363
};

ReflectionTemplateLib/rtl/erasure/aware_return.h

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,18 @@
1212
#pragma once
1313

1414
#include <any>
15-
#include "erase_return.h"
15+
#include "rtl_forward_decls.h"
1616

1717
namespace rtl::dispatch
1818
{
1919
template<class return_t, class ...signature_t>
20-
struct aware_return : public erase_return<traits::normal_sign_t<signature_t>...>
20+
struct aware_return
2121
{
22-
using this_t = aware_return;
23-
using base_t = erase_return<traits::normal_sign_t<signature_t>...>;
24-
25-
constexpr static bool is_void = (std::is_void_v<return_t>);
26-
27-
aware_return()
28-
: base_t( is_void ? this_t::get_lambda_void() : decltype(this_t::get_lambda_void()) {},
29-
!is_void ? this_t::get_lambda_any_return() : decltype(this_t::get_lambda_any_return()) {})
30-
{
31-
constexpr static bool is_const_cast_safe = (!traits::is_const_v<return_t>);
32-
base_t::m_return_id = detail::RObjectId::create<return_t, alloc::Stack>(is_const_cast_safe);
33-
}
34-
3522
constexpr static auto get_lambda_void() noexcept
3623
{
3724
return [](const lambda_base& lambda, traits::normal_sign_t<signature_t>&&... params)-> auto
3825
{
39-
if constexpr (is_void)
26+
if constexpr (std::is_void_v<return_t>)
4027
{
4128
auto fptr = lambda.template to_function<signature_t...>()
4229
.template get_functor<void>();
@@ -50,7 +37,7 @@ namespace rtl::dispatch
5037
{
5138
return [](const lambda_base& lambda, traits::normal_sign_t<signature_t>&&... params)-> auto
5239
{
53-
if constexpr (!is_void)
40+
if constexpr (!std::is_void_v<return_t>)
5441
{
5542
auto fptr = lambda.template to_function<signature_t...>()
5643
.template get_functor<return_t>();
@@ -70,6 +57,8 @@ namespace rtl::dispatch
7057
else
7158
{
7259
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
60+
// TODO: enable it for move-constructible objects, NRVO.
61+
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
7362
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
7463
}
7564
}

ReflectionTemplateLib/rtl/erasure/aware_return_n_target.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ 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.
152+
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
151153
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
152154
}
153155
}
@@ -182,6 +184,8 @@ namespace rtl::dispatch
182184
else
183185
{
184186
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
187+
// TODO: enable it for move-constructible objects, NRVO.
188+
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
185189
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
186190
}
187191
}

ReflectionTemplateLib/rtl/erasure/aware_return_n_target_const.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ namespace rtl::dispatch
150150
else
151151
{
152152
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
153+
// TODO: enable it for move-constructible objects, NRVO.
154+
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
153155
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
154156
}
155157
}
@@ -184,6 +186,8 @@ namespace rtl::dispatch
184186
else
185187
{
186188
using raw_ct = std::add_const_t<std::remove_reference_t<decltype(ret_v)>>;
189+
// TODO: enable it for move-constructible objects, NRVO.
190+
static_assert(std::is_copy_constructible_v<return_t>, "return-type must be copy-constructible, required by std::any");
187191
return std::any(raw_ct(std::forward<decltype(ret_v)>(ret_v)));
188192
}
189193
}

ReflectionTemplateLib/rtl/erasure/erase_return.h

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,27 @@ namespace rtl::dispatch
2424

2525
using lambda_rt = std::function<std::any(const lambda_base&, normal_sign_t...)>;
2626

27+
using lambda_ctor_t = std::function<Return(alloc, normal_sign_t...)>;
28+
2729
GETTER_CREF(lambda_vt, _void_hopper, m_vhopper)
2830
GETTER_CREF(lambda_rt, _return_hopper, m_rhopper)
2931

30-
protected:
32+
private:
33+
34+
lambda_vt m_vhopper = nullptr;
3135

32-
lambda_vt m_vhopper;
36+
lambda_rt m_rhopper = nullptr;
3337

34-
lambda_rt m_rhopper;
38+
lambda_ctor_t m_ctor_hopper = nullptr;
3539

36-
erase_return( const lambda_vt& p_void_hop,
37-
const lambda_rt& p_any_ret_hop ) noexcept
40+
template<class return_t>
41+
void init_base()
42+
{
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+
}
3846

39-
: m_vhopper(p_void_hop)
40-
, m_rhopper(p_any_ret_hop)
41-
{ }
47+
template<class, class...>
48+
friend struct cache::lambda_function;
4249
};
4350
}

ReflectionTemplateLib/rtl/inc/RObject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ namespace rtl
6363
RObject(RObject&&) noexcept;
6464
RObject& operator=(RObject&&) noexcept;
6565

66-
GETTER_BOOL(Empty, (m_object == std::nullopt))
66+
GETTER_BOOL(Empty, (m_object == std::nullopt || !m_object->has_value()))
6767
GETTER_BOOL(OnHeap, (m_objectId.m_allocatedOn == alloc::Heap))
6868
GETTER_BOOL(AllocatedByRtl, (m_objectId.m_allocatedOn == alloc::Heap))
6969
GETTER(std::size_t, TypeId, m_objectId.m_typeId)

ReflectionTemplateLib/rtl/inc/type_meta.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ namespace rtl
9797

9898
auto fptr = &dispatch::aware_constructor<record_t>::allocator;
9999

100-
auto& functor = fc.push(fptr, traits::uid<record_t>::value, detail::member::Ctor, p_index);
100+
//auto& functor = fc.push(fptr, traits::uid<record_t>::value, detail::member::Ctor, p_index);
101101
//auto [lambda, elambda] = lc.push(functor);
102102

103103
//functor.set_lambda(lambda);
104104
//functor.set_erasure(elambda);
105-
return type_meta(functor);
105+
//return type_meta(functor);
106106
}
107107
return type_meta();
108108
}

0 commit comments

Comments
 (0)