Iros
 
Loading...
Searching...
No Matches
string_view_impl.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/util/to_address.h"
11#include "di/util/to_owned.h"
12
13namespace di::container::string {
14template<concepts::Encoding Enc>
16 : public ConstantStringInterface<StringViewImpl<Enc>, Enc>
17 , public meta::EnableView<StringViewImpl<Enc>>
18 , public meta::EnableBorrowedContainer<StringViewImpl<Enc>>
19 , public util::OwnedType<StringViewImpl<Enc>, StringImpl<Enc>> {
20public:
21 using Encoding = Enc;
25
26 StringViewImpl() = default;
27 StringViewImpl(StringViewImpl const&) = default;
28
30 : m_data(static_cast<CodeUnit const*>(begin))
31 , m_size(static_cast<CodeUnit const*>(end) - m_data)
32 , m_encoding(encoding) {}
33
34 template<concepts::detail::ConstantString Other>
37 constexpr StringViewImpl(Other&& other)
38 : m_data(other.span().data()), m_size(other.span().size()), m_encoding(other.encoding()) {}
39
40 constexpr StringViewImpl(CodeUnit const* data, size_t count, Enc encoding = {})
42 : m_data(data), m_size(count), m_encoding(encoding) {}
43
44 template<concepts::ContiguousIterator It, concepts::SizedSentinelFor<It> Sent>
46 !concepts::ConvertibleTo<Sent, size_t> && encoding::Universal<Enc>)
47 constexpr StringViewImpl(It it, Sent sent, Enc encoding = {})
48 : m_data(util::to_address(it)), m_size(sent - it), m_encoding(encoding) {}
49
50 template<concepts::ContiguousContainer Con>
54 concepts::BorrowedContainer<Con> && encoding::Universal<Enc>)
55 constexpr StringViewImpl(Con&& container, Enc encoding = {})
56 : m_data(container::data(container)), m_size(container::size(container)), m_encoding(encoding) {}
57
58 constexpr StringViewImpl(encoding::AssumeValid, CodeUnit const* data, size_t count, Enc encoding = {})
59 : m_data(data), m_size(count), m_encoding(encoding) {}
60
61 template<concepts::ContiguousIterator It, concepts::SizedSentinelFor<It> Sent>
63 constexpr StringViewImpl(encoding::AssumeValid, It it, Sent sent, Enc encoding = {})
64 : m_data(util::to_address(it)), m_size(sent - it), m_encoding(encoding) {}
65
66 template<concepts::ContiguousContainer Con>
69 : m_data(container::data(container)), m_size(container::size(container)), m_encoding(encoding) {}
70
71 auto operator=(StringViewImpl const&) -> StringViewImpl& = default;
72
73 constexpr auto span() const { return Span { m_data, m_size }; }
74 constexpr auto encoding() const -> Enc { return m_encoding; }
75
76 constexpr void replace_begin(Iterator new_begin) { *this = { new_begin, this->end(), m_encoding }; }
77 constexpr void replace_end(Iterator new_end) { *this = { this->begin(), new_end, m_encoding }; }
78
79private:
80 template<concepts::SameAs<types::Tag<into_erased_string>> T, concepts::SameAs<StringViewImpl> S>
82 constexpr friend auto tag_invoke(T, S self) -> ErasedString {
83 return ErasedString({ self.data(), self.size_code_units() + 1 });
84 }
85
86 CodeUnit const* m_data { nullptr };
87 size_t m_size { 0 };
88 [[no_unique_address]] Enc m_encoding;
89};
90}
Definition erased_string.h:21
Definition constant_string_interface.h:33
constexpr auto size() const -> usize requires(encoding::Contiguous< Enc >)
Definition constant_string_interface.h:42
constexpr auto data() const
Definition constant_string_interface.h:67
constexpr auto begin() const
Definition constant_string_interface.h:69
constexpr auto end() const
Definition constant_string_interface.h:70
Definition string_view_impl_forward_declaration.h:7
constexpr void replace_end(Iterator new_end)
Definition string_view_impl.h:77
constexpr StringViewImpl(encoding::AssumeValid, Con &&container, Enc encoding={})
Definition string_view_impl.h:68
constexpr StringViewImpl(Other &&other)
Definition string_view_impl.h:37
Enc Encoding
Definition string_view_impl.h:21
constexpr auto span() const
Definition string_view_impl.h:73
meta::EncodingCodeUnit< Enc > CodeUnit
Definition string_view_impl.h:22
constexpr StringViewImpl(Iterator begin, Iterator end, Enc encoding={})
Definition string_view_impl.h:29
constexpr friend auto tag_invoke(T, S self) -> ErasedString
Definition string_view_impl.h:82
auto operator=(StringViewImpl const &) -> StringViewImpl &=default
StringViewImpl(StringViewImpl const &)=default
constexpr StringViewImpl(CodeUnit const *data, size_t count, Enc encoding={})
Definition string_view_impl.h:40
meta::EncodingIterator< Enc > Iterator
Definition string_view_impl.h:24
meta::EncodingCodePoint< Enc > CodePoint
Definition string_view_impl.h:23
constexpr StringViewImpl(encoding::AssumeValid, It it, Sent sent, Enc encoding={})
Definition string_view_impl.h:63
constexpr StringViewImpl(encoding::AssumeValid, CodeUnit const *data, size_t count, Enc encoding={})
Definition string_view_impl.h:58
constexpr void replace_begin(Iterator new_begin)
Definition string_view_impl.h:76
constexpr auto encoding() const -> Enc
Definition string_view_impl.h:74
constexpr StringViewImpl(It it, Sent sent, Enc encoding={})
Definition string_view_impl.h:47
constexpr StringViewImpl(Con &&container, Enc encoding={})
Definition string_view_impl.h:55
Definition span_forward_declaration.h:10
Definition borrowed_container.h:8
Definition container_of.h:9
Definition operations.h:99
Definition core.h:114
Definition sized_container.h:8
Definition constant_string.h:8
Definition encoding.h:25
Definition constant_string_interface.h:31
constexpr auto data(concepts::detail::ConstantString auto const &string)
Definition string_data.h:6
constexpr auto begin(concepts::detail::ConstantString auto const &string)
Definition string_begin.h:6
constexpr auto end(concepts::detail::ConstantString auto const &string)
Definition string_end.h:6
constexpr auto size(Str const &string) -> size_t
Definition string_size.h:9
Definition sequence.h:12
constexpr auto count
Definition count.h:37
RemoveCVRef< T >::CodeUnit EncodingCodeUnit
Definition encoding.h:16
RemoveCVRef< T >::CodePoint EncodingCodePoint
Definition encoding.h:19
RemoveCVRef< T >::Iterator EncodingIterator
Definition encoding.h:22
Definition vocab.h:96
constexpr auto to_address
Definition to_address.h:22