Iros
 
Loading...
Searching...
No Matches
constant_string_interface.h
Go to the documentation of this file.
1#pragma once
2
30
32template<typename Self, concepts::Encoding Enc>
34private:
35 using CodeUnit = meta::EncodingCodeUnit<Enc>;
36 using CodePoint = meta::EncodingCodePoint<Enc>;
37 using Iterator = meta::EncodingIterator<Enc>;
38
39 constexpr auto self() const -> Self const& { return static_cast<Self const&>(*this); }
40
41public:
42 constexpr auto size() const -> usize
43 requires(encoding::Contiguous<Enc>)
44 {
45 return string::size(self());
46 }
47
48 constexpr auto operator[](usize index) const -> CodePoint
50 {
51 return begin()[index];
52 }
53
54 constexpr auto at(usize index) const -> Optional<CodePoint>
56 {
57 if (index >= size()) {
58 return {};
59 }
60 return begin()[index];
61 }
62
63 constexpr auto size_bytes() const -> usize { return size_code_units() * sizeof(CodeUnit); }
64 constexpr auto size_code_units() const -> usize { return string::size_code_units(self()); }
65 constexpr auto empty() const -> bool { return string::empty(self()); }
66
67 constexpr auto data() const { return string::data(self()); }
68
69 constexpr auto begin() const { return string::begin(self()); }
70 constexpr auto end() const { return string::end(self()); }
71
72 constexpr auto front() const { return string::front(self()); }
73 constexpr auto back() const { return string::back(self()); }
74
75 constexpr auto starts_with(CodePoint code_point) const -> bool { return string::starts_with(self(), code_point); }
76
77 template<concepts::ContainerCompatible<CodePoint> Con>
79 constexpr auto starts_with(Con&& container) const -> bool {
80 return string::starts_with(self(), util::forward<Con>(container));
81 }
82
83 constexpr auto ends_with(CodePoint code_point) const -> bool { return string::ends_with(self(), code_point); }
84
85 template<concepts::ContainerCompatible<CodePoint> Con>
87 constexpr auto ends_with(Con&& container) const -> bool {
88 return string::ends_with(self(), util::forward<Con>(container));
89 }
90
91 constexpr auto contains(CodePoint code_point) const -> bool { return string::contains(self(), code_point); }
92
93 template<concepts::ContainerCompatible<CodePoint> Con>
95 constexpr auto contains(Con&& container) const -> bool {
96 return string::contains(self(), util::forward<Con>(container));
97 }
98
99 constexpr auto substr(Iterator first, Optional<Iterator> last = {}) const {
100 return string::substr(self(), first, last);
101 }
102 constexpr auto substr(usize offset, Optional<usize> count = {}) const
104 {
105 auto first = iterator_at_offset(offset);
106 auto last = [&] -> Iterator {
107 if (count) {
108 return iterator_at_offset(offset + *count).value_or(end());
109 }
110 return end();
111 }();
112 if (!first.has_value()) {
113 return StringViewImpl<Enc> {};
114 }
115 return substr(*first, last);
116 }
117
118 constexpr auto find(CodePoint code_point) const { return string::find(self(), code_point); }
119
120 template<concepts::ContainerCompatible<CodePoint> Con>
122 constexpr auto find(Con&& container) const {
123 return string::find(self(), util::forward<Con>(container));
124 }
125
126 constexpr auto rfind(CodePoint code_point) const { return string::rfind(self(), code_point); }
127
128 template<concepts::ContainerCompatible<CodePoint> Con>
130 constexpr auto rfind(Con&& container) const {
131 return string::rfind(self(), util::forward<Con>(container));
132 }
133
134 constexpr auto find_first_of(CodePoint code_point) const { return string::find_first_of(self(), code_point); }
135
136 template<concepts::ContainerCompatible<CodePoint> Con>
138 constexpr auto find_first_of(Con&& container) const {
139 return string::find_first_of(self(), util::forward<Con>(container));
140 }
141
142 constexpr auto find_first_not_of(CodePoint code_point) const {
143 return string::find_first_not_of(self(), code_point);
144 }
145
146 template<concepts::ContainerCompatible<CodePoint> Con>
148 constexpr auto find_first_not_of(Con&& container) const {
149 return string::find_first_not_of(self(), util::forward<Con>(container));
150 }
151
152 constexpr auto find_last_of(CodePoint code_point) const { return string::find_last_of(self(), code_point); }
153
154 template<concepts::ContainerCompatible<CodePoint> Con>
156 constexpr auto find_last_of(Con&& container) const {
157 return string::find_last_of(self(), util::forward<Con>(container));
158 }
159
160 constexpr auto find_last_not_of(CodePoint code_point) const { return string::find_last_not_of(self(), code_point); }
161
162 template<concepts::ContainerCompatible<CodePoint> Con>
164 constexpr auto find_last_not_of(Con&& container) const {
165 return string::find_last_not_of(self(), util::forward<Con>(container));
166 }
167
168 constexpr auto view() const { return StringViewImpl<Enc>(self()); }
169
170 constexpr auto iterator_at_offset(usize index) const { return string::iterator_at_offset(self(), index); }
171
172 constexpr auto unicode_code_points() const { return string::unicode_code_points(self()); }
173
174private:
175 template<concepts::detail::ConstantString Other>
177 constexpr friend auto operator==(Self const& a, Other const& b) -> bool {
178 return string::equal(a, b);
179 }
180
181 template<concepts::detail::ConstantString Other>
183 constexpr friend auto operator<=>(Self const& a, Other const& b) {
184 return string::compare(a, b);
185 }
186
188 Iterator last) -> StringViewImpl<Enc> {
189 return StringViewImpl<Enc>(util::move(first), util::move(last));
190 }
191};
192}
Definition constant_string_interface.h:33
constexpr auto front() const
Definition constant_string_interface.h:72
constexpr auto find_first_not_of(CodePoint code_point) const
Definition constant_string_interface.h:142
constexpr friend auto operator<=>(Self const &a, Other const &b)
Definition constant_string_interface.h:183
constexpr auto operator[](usize index) const -> CodePoint requires(encoding::Contiguous< Enc >)
Definition constant_string_interface.h:48
constexpr auto find_first_not_of(Con &&container) const
Definition constant_string_interface.h:148
constexpr auto size() const -> usize requires(encoding::Contiguous< Enc >)
Definition constant_string_interface.h:42
constexpr auto rfind(CodePoint code_point) const
Definition constant_string_interface.h:126
constexpr auto size_code_units() const -> usize
Definition constant_string_interface.h:64
constexpr auto find_last_of(CodePoint code_point) const
Definition constant_string_interface.h:152
constexpr auto data() const
Definition constant_string_interface.h:67
constexpr auto starts_with(Con &&container) const -> bool
Definition constant_string_interface.h:79
constexpr auto iterator_at_offset(usize index) const
Definition constant_string_interface.h:170
constexpr auto substr(usize offset, Optional< usize > count={}) const
Definition constant_string_interface.h:102
constexpr auto unicode_code_points() const
Definition constant_string_interface.h:172
constexpr auto starts_with(CodePoint code_point) const -> bool
Definition constant_string_interface.h:75
constexpr auto find_last_not_of(Con &&container) const
Definition constant_string_interface.h:164
constexpr auto find_last_not_of(CodePoint code_point) const
Definition constant_string_interface.h:160
constexpr auto find_first_of(Con &&container) const
Definition constant_string_interface.h:138
constexpr auto find_first_of(CodePoint code_point) const
Definition constant_string_interface.h:134
constexpr auto back() const
Definition constant_string_interface.h:73
constexpr auto begin() const
Definition constant_string_interface.h:69
constexpr auto find(Con &&container) const
Definition constant_string_interface.h:122
constexpr auto at(usize index) const -> Optional< CodePoint > requires(encoding::Contiguous< Enc >)
Definition constant_string_interface.h:54
constexpr auto ends_with(Con &&container) const -> bool
Definition constant_string_interface.h:87
constexpr auto substr(Iterator first, Optional< Iterator > last={}) const
Definition constant_string_interface.h:99
constexpr auto find(CodePoint code_point) const
Definition constant_string_interface.h:118
constexpr friend auto tag_invoke(types::Tag< container::reconstruct >, InPlaceType< Self >, Iterator first, Iterator last) -> StringViewImpl< Enc >
Definition constant_string_interface.h:187
constexpr auto size_bytes() const -> usize
Definition constant_string_interface.h:63
constexpr auto view() const
Definition constant_string_interface.h:168
constexpr auto end() const
Definition constant_string_interface.h:70
constexpr auto contains(Con &&container) const -> bool
Definition constant_string_interface.h:95
constexpr auto contains(CodePoint code_point) const -> bool
Definition constant_string_interface.h:91
constexpr auto ends_with(CodePoint code_point) const -> bool
Definition constant_string_interface.h:83
constexpr auto find_last_of(Con &&container) const
Definition constant_string_interface.h:156
constexpr auto empty() const -> bool
Definition constant_string_interface.h:65
constexpr auto rfind(Con &&container) const
Definition constant_string_interface.h:130
Definition string_view_impl_forward_declaration.h:7
Definition optional_forward_declaration.h:5
Definition forward_container.h:8
Definition core.h:114
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 contains(Str const &string, meta::EncodingCodePoint< Str > code_point) -> bool
Definition string_contains.h:12
constexpr auto find_last_not_of(Str const &string, meta::EncodingCodePoint< Str > code_point)
Definition string_find_last_not_of.h:11
constexpr auto substr(Str const &string, meta::EncodingIterator< Enc > first, Optional< meta::EncodingIterator< Enc > > last={})
Definition string_substr.h:9
constexpr auto begin(concepts::detail::ConstantString auto const &string)
Definition string_begin.h:6
constexpr auto find_last_of(Str const &string, meta::EncodingCodePoint< Str > code_point)
Definition string_find_last_of.h:11
constexpr auto find(Str const &string, meta::EncodingCodePoint< Str > code_point)
Definition string_find.h:11
constexpr auto ends_with(Str const &string, meta::EncodingCodePoint< Str > code_point) -> bool
Definition string_ends_with.h:11
constexpr auto unicode_code_points(concepts::detail::ConstantString auto const &string)
Definition string_unicode_code_points.h:6
constexpr auto find_first_of(Str const &string, meta::EncodingCodePoint< Str > code_point)
Definition string_find_first_of.h:11
constexpr auto starts_with(Str const &string, meta::EncodingCodePoint< Str > code_point) -> bool
Definition string_starts_with.h:11
constexpr auto size_code_units(concepts::detail::ConstantString auto const &string) -> size_t
Definition string_size_code_units.h:6
constexpr auto end(concepts::detail::ConstantString auto const &string)
Definition string_end.h:6
constexpr auto back(concepts::detail::ConstantString auto const &string)
Definition string_back.h:8
constexpr auto size(Str const &string) -> size_t
Definition string_size.h:9
constexpr auto front(concepts::detail::ConstantString auto const &string)
Definition string_front.h:8
constexpr auto rfind(Str const &string, meta::EncodingCodePoint< Str > code_point)
Definition string_rfind.h:11
constexpr auto find_first_not_of(Str const &string, meta::EncodingCodePoint< Str > code_point)
Definition string_find_first_not_of.h:11
constexpr auto compare(S const &s, T const &t)
Definition string_compare.h:11
constexpr auto empty(concepts::detail::ConstantString auto const &string) -> size_t
Definition string_empty.h:6
constexpr auto equal(S const &s, T const &t)
Definition string_equal.h:11
constexpr auto iterator_at_offset(concepts::detail::ConstantString auto const &string, size_t index)
Definition string_iterator_at_offset.h:6
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
size_t usize
Definition integers.h:33
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition in_place_type.h:5