di 0.1.0
Loading...
Searching...
No Matches
string_impl.h
Go to the documentation of this file.
1#pragma once
2
8#include "di/meta/core.h"
10#include "di/util/exchange.h"
12
13namespace di::container::string {
14template<concepts::Encoding Enc, concepts::detail::MutableVector Vec>
15requires(concepts::SameAs<meta::detail::VectorValue<Vec>, meta::EncodingCodeUnit<Enc>>)
16class StringImpl : public MutableStringInterface<StringImpl<Enc, Vec>, Enc> {
17public:
18 using Encoding = Enc;
22 using Value = CodeUnit;
23 using ConstValue = CodeUnit const;
24
25 StringImpl() = default;
26
27 constexpr auto span() { return m_vector.span(); }
28 constexpr auto span() const { return m_vector.span(); }
29
30 constexpr auto encoding() const -> Enc { return m_encoding; }
31
32 constexpr auto capacity() const { return m_vector.capacity(); }
33 constexpr auto max_size() const { return m_vector.max_size(); }
34 constexpr auto reserve_from_nothing(usize n) { return m_vector.reserve_from_nothing(n); }
35 constexpr auto assume_size(usize n) { return m_vector.assume_size(n); }
36 constexpr auto grow_capacity(usize min_capacity) const { return m_vector.grow_capacity(min_capacity); }
37
38 constexpr auto take_underlying_vector() && { return di::move(m_vector); }
39
40private:
41 constexpr explicit StringImpl(Vec&& storage) : m_vector(util::move(storage)) {}
42
45 return StringImpl { util::move(storage) };
46 } else {
47 DI_ASSERT(encoding::validate(Enc(), util::as_const(storage).span()));
48 return StringImpl { util::move(storage) };
49 }
50 }
51
52 template<concepts::SameAs<types::Tag<into_erased_string>> T, concepts::SameAs<StringImpl> S>
54 constexpr friend auto tag_invoke(T, S self) -> ErasedString {
55 auto result = ErasedString(
56 { self.data(), self.size_code_units() + 1 }, (void*) self.data(), (void*) self.m_vector.capacity(), nullptr,
58 switch (op) {
59 case ErasedString::ThunkOp::Move:
60 src->m_state[0] = src->m_state[1] = nullptr;
61 src->m_data = {};
62 break;
63 case ErasedString::ThunkOp::Destroy:
64 if (dest->m_state[0] != nullptr) {
65 auto alloc = typename Vec::Allocator {};
66 di::deallocate_many<c8>(alloc, (c8*) dest->m_state[0], (size_t) dest->m_state[1]);
67 }
68 break;
69 }
70 });
71 unsafe_forget(di::move(self.m_vector));
72 return result;
73 }
74
75 [[no_unique_address]] Vec m_vector;
76 [[no_unique_address]] Enc m_encoding {};
77};
78}
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition erased_string.h:21
ThunkOp
Definition erased_string.h:28
Definition mutable_string_interface.h:42
Definition string_impl.h:16
constexpr auto span()
Definition string_impl.h:27
constexpr auto max_size() const
Definition string_impl.h:33
constexpr auto encoding() const -> Enc
Definition string_impl.h:30
constexpr auto capacity() const
Definition string_impl.h:32
constexpr auto assume_size(usize n)
Definition string_impl.h:35
constexpr friend auto tag_invoke(T, S self) -> ErasedString
Definition string_impl.h:54
meta::EncodingIterator< Enc > Iterator
Definition string_impl.h:21
constexpr auto grow_capacity(usize min_capacity) const
Definition string_impl.h:36
constexpr auto span() const
Definition string_impl.h:28
constexpr auto reserve_from_nothing(usize n)
Definition string_impl.h:34
meta::EncodingCodePoint< Enc > CodePoint
Definition string_impl.h:20
meta::EncodingCodeUnit< Enc > CodeUnit
Definition string_impl.h:19
constexpr auto take_underlying_vector() &&
Definition string_impl.h:38
CodeUnit const ConstValue
Definition string_impl.h:23
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< StringImpl >, Vec &&storage)
Definition string_impl.h:43
Definition core.h:114
constexpr auto validate
Definition encoding.h:135
constexpr auto universal
Definition encoding.h:61
Definition constant_string_interface.h:31
constexpr auto move
Definition move.h:38
RemoveCVRef< T >::CodeUnit EncodingCodeUnit
Definition encoding.h:16
RemoveCVRef< T >::CodePoint EncodingCodePoint
Definition encoding.h:19
RemoveCVRef< T >::Iterator EncodingIterator
Definition encoding.h:22
size_t usize
Definition integers.h:33
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
constexpr auto in_place_type
Definition in_place_type.h:12
constexpr auto unsafe_forget
Steal ownership of an object and do not its destructor.
Definition unsafe_forget.h:32
Definition in_place_type.h:5