Iros
 
Loading...
Searching...
No Matches
string_impl.h
Go to the documentation of this file.
1#pragma once
2
7
8namespace di::container::string {
9template<concepts::Encoding Enc, concepts::detail::MutableVector Vec>
10requires(concepts::SameAs<meta::detail::VectorValue<Vec>, meta::EncodingCodeUnit<Enc>>)
11class StringImpl : public MutableStringInterface<StringImpl<Enc, Vec>, Enc> {
12public:
13 using Encoding = Enc;
17 using Value = CodeUnit;
18 using ConstValue = CodeUnit const;
19
20 StringImpl() = default;
21
22 constexpr auto span() { return m_vector.span(); }
23 constexpr auto span() const { return m_vector.span(); }
24
25 constexpr auto encoding() const -> Enc { return m_encoding; }
26
27 constexpr auto capacity() const { return m_vector.capacity(); }
28 constexpr auto max_size() const { return m_vector.max_size(); }
29 constexpr auto reserve_from_nothing(usize n) { return m_vector.reserve_from_nothing(n); }
30 constexpr auto assume_size(usize n) { return m_vector.assume_size(n); }
31 constexpr auto grow_capacity(usize min_capacity) const { return m_vector.grow_capacity(min_capacity); }
32
33 constexpr auto take_underlying_vector() && { return di::move(m_vector); }
34
35private:
36 constexpr explicit StringImpl(Vec&& storage) : m_vector(util::move(storage)) {}
37
40 return StringImpl { util::move(storage) };
41 } else {
42 DI_ASSERT(encoding::validate(Enc(), util::as_const(storage).span()));
43 return StringImpl { util::move(storage) };
44 }
45 }
46
47 [[no_unique_address]] Vec m_vector;
48 [[no_unique_address]] Enc m_encoding {};
49};
50}
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition mutable_string_interface.h:42
Definition string_impl_forward_declaration.h:9
Enc Encoding
Definition string_impl.h:13
constexpr auto span()
Definition string_impl.h:22
constexpr auto max_size() const
Definition string_impl.h:28
constexpr auto encoding() const -> Enc
Definition string_impl.h:25
constexpr auto capacity() const
Definition string_impl.h:27
constexpr auto assume_size(usize n)
Definition string_impl.h:30
meta::EncodingIterator< Enc > Iterator
Definition string_impl.h:16
constexpr auto grow_capacity(usize min_capacity) const
Definition string_impl.h:31
constexpr auto span() const
Definition string_impl.h:23
constexpr auto reserve_from_nothing(usize n)
Definition string_impl.h:29
meta::EncodingCodePoint< Enc > CodePoint
Definition string_impl.h:15
meta::EncodingCodeUnit< Enc > CodeUnit
Definition string_impl.h:14
CodeUnit Value
Definition string_impl.h:17
constexpr auto take_underlying_vector() &&
Definition string_impl.h:33
CodeUnit const ConstValue
Definition string_impl.h:18
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< StringImpl >, Vec &&storage)
Definition string_impl.h:38
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
Definition in_place_type.h:5