di 0.1.0
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 {
10 struct IntoErasedStringFunction {
11 template<typename T>
12 requires(concepts::TagInvocable<IntoErasedStringFunction, T>)
13 constexpr auto operator()(T&& value) const {
14 return function::tag_invoke(*this, util::forward<T>(value));
15 }
16 };
17}
18
19constexpr inline auto into_erased_string = detail::IntoErasedStringFunction {};
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
28 enum class ThunkOp { Move, Destroy };
29
30 using ThunkFunction = void (*)(ErasedString* dest, ErasedString* src, ThunkOp op);
31
33 void* m_state[3] {};
34 ThunkFunction const m_thunk { nullptr };
35
36 constexpr explicit ErasedString(Span<c8 const> data = {}, void* state0 = nullptr, void* state1 = nullptr,
37 void* state2 = nullptr, ThunkFunction thunk = nullptr)
38 : m_data({ data.data(), data.size() - 1 }), m_state(state0, state1, state2), m_thunk(thunk) {}
39
40 constexpr ErasedString(ErasedString&& other)
41 : m_data(other.m_data), m_state(other.m_state[0], other.m_state[1], other.m_state[2]), m_thunk(other.m_thunk) {
42 if (this->m_thunk) {
43 m_thunk(this, &other, ThunkOp::Move);
44 }
45 }
46
47 template<typename T>
49 constexpr ErasedString(T&& value) : ErasedString(into_erased_string(util::forward<T>(value))) {}
50
51 constexpr auto operator=(ErasedString&& other) -> ErasedString& {
52 if (this != &other) {
53 util::destroy_at(this);
54 util::construct_at(this, util::move(other));
55 }
56 return *this;
57 }
58
59 constexpr ~ErasedString() {
60 if (m_thunk) {
61 m_thunk(this, this, ThunkOp::Destroy);
62 }
63 m_data = {};
64 }
65};
66}
67
68namespace di {
69using container::ErasedString;
70}
constexpr auto encoding() const
Definition erased_string.h:25
ThunkOp
Definition erased_string.h:28
@ Destroy
Definition erased_string.h:28
@ Move
Definition erased_string.h:28
void * m_state[3]
Definition erased_string.h:33
constexpr ErasedString(ErasedString &&other)
Definition erased_string.h:40
constexpr auto operator=(ErasedString &&other) -> ErasedString &
Definition erased_string.h:51
Span< c8 const > m_data
Definition erased_string.h:32
constexpr auto span() const
Definition erased_string.h:26
ThunkFunction const m_thunk
Definition erased_string.h:34
constexpr ErasedString(Span< c8 const > data={}, void *state0=nullptr, void *state1=nullptr, void *state2=nullptr, ThunkFunction thunk=nullptr)
Definition erased_string.h:36
string::Utf8Encoding Encoding
Definition erased_string.h:23
constexpr ~ErasedString()
Definition erased_string.h:59
void(*)(ErasedString *dest, ErasedString *src, ThunkOp op) ThunkFunction
Definition erased_string.h:30
constexpr ErasedString(T &&value)
Definition erased_string.h:49
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 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
constexpr auto value
Definition value.h:34
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:35
Definition any_storable.h:9