Iros
 
Loading...
Searching...
No Matches
erased_string.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/util.h"
7
8namespace di::container {
9namespace detail {
11 template<typename T>
13 constexpr auto operator()(T&& value) const {
14 return function::tag_invoke(*this, util::forward<T>(value));
15 }
16 };
17}
18
20
21class ErasedString : public string::ConstantStringInterface<ErasedString, string::Utf8Encoding> {
22public:
24
25 constexpr auto encoding() const { return Encoding {}; }
26 constexpr auto span() const { return m_data; }
27
28protected:
29 enum class ThunkOp { Move, Destroy };
30
31 using ThunkFunction = void (*)(ErasedString* dest, ErasedString const* src, ThunkOp op);
32
34 void* m_state[3] {};
35 ThunkFunction const m_thunk { nullptr };
36
37 constexpr explicit ErasedString(ThunkFunction thunk) : m_thunk(thunk) {}
38
39public:
40 constexpr explicit ErasedString(Span<c8 const> data = {}, void* state0 = nullptr, void* state1 = nullptr,
41 void* state2 = nullptr, ThunkFunction thunk = nullptr)
42 : m_data({ data.data(), data.size() - 1 }), m_state(state0, state1, state2), m_thunk(thunk) {}
43
44 constexpr ErasedString(ErasedString&& other)
45 : m_data(other.m_data), m_state(other.m_state[0], other.m_state[1], other.m_state[2]), m_thunk(other.m_thunk) {
46 if (this->m_thunk) {
47 m_thunk(this, &other, ThunkOp::Move);
48 }
49 }
50
51 template<typename T>
53 constexpr ErasedString(T&& value) : ErasedString(into_erased_string(util::forward<T>(value))) {}
54
55 constexpr auto operator=(ErasedString&& other) -> ErasedString& {
56 if (this != &other) {
57 util::destroy_at(this);
58 util::construct_at(this, util::move(other));
59 }
60 return *this;
61 }
62
63 constexpr ~ErasedString() {
64 if (m_thunk) {
65 m_thunk(this, this, ThunkOp::Destroy);
66 }
67 m_data = {};
68 }
69};
70}
71
72namespace di {
73using container::ErasedString;
74}
constexpr auto encoding() const
Definition erased_string.h:25
constexpr ErasedString(ThunkFunction thunk)
Definition erased_string.h:37
ThunkOp
Definition erased_string.h:29
@ Destroy
Definition erased_string.h:29
@ Move
Definition erased_string.h:29
void * m_state[3]
Definition erased_string.h:34
constexpr ErasedString(ErasedString &&other)
Definition erased_string.h:44
constexpr auto operator=(ErasedString &&other) -> ErasedString &
Definition erased_string.h:55
Span< c8 const > m_data
Definition erased_string.h:33
constexpr auto span() const
Definition erased_string.h:26
ThunkFunction const m_thunk
Definition erased_string.h:35
constexpr ErasedString(Span< c8 const > data={}, void *state0=nullptr, void *state1=nullptr, void *state2=nullptr, ThunkFunction thunk=nullptr)
Definition erased_string.h:40
string::Utf8Encoding Encoding
Definition erased_string.h:23
constexpr ~ErasedString()
Definition erased_string.h:63
constexpr ErasedString(T &&value)
Definition erased_string.h:53
void(*)(ErasedString *dest, ErasedString const *src, ThunkOp op) ThunkFunction
Definition erased_string.h:31
Definition constant_string_interface.h:33
constexpr auto data() const
Definition constant_string_interface.h:67
Definition utf8_encoding.h:107
Definition span_forward_declaration.h:10
Definition tag_invoke.h:33
Definition sequence.h:13
Definition sequence.h:12
constexpr auto into_erased_string
Definition erased_string.h:19
constexpr auto data
Definition data.h:51
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition vocab.h:96
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto destroy_at
Definition destroy_at.h:24
constexpr auto construct_at
Definition construct_at.h:27
Definition zstring_parser.h:9