@@ -165,9 +165,12 @@ namespace sysstr
165
165
sys_string_t & operator =(const sys_string_t &) noexcept = default ;
166
166
sys_string_t & operator =(sys_string_t &&) noexcept = default ;
167
167
~sys_string_t () noexcept = default ;
168
+
169
+ // Inherit any storage specific constructors
168
170
169
171
using storage::storage;
170
172
173
+ // Constructors from raw strings and character ranges
171
174
172
175
template <has_utf_encoding Char>
173
176
sys_string_t (const Char * str, size_t len) :
@@ -190,13 +193,41 @@ namespace sysstr
190
193
sys_string_t(std::ranges::data(val), std::ranges::size(val))
191
194
{}
192
195
196
+ // Slice constructors from utf32_access::iterators
197
+
193
198
sys_string_t (const typename utf32_access::iterator & first, const typename utf32_access::iterator & last):
194
199
sys_string_t(first.storage_current(), last.storage_current())
195
200
{}
196
201
202
+ sys_string_t (const typename utf32_access::reverse_iterator & first, const typename utf32_access::reverse_iterator & last):
203
+ sys_string_t(first.storage_current(), last.storage_current())
204
+ {}
205
+
197
206
sys_string_t (const typename utf32_access::iterator & first, std::default_sentinel_t ):
198
207
sys_string_t(first.storage_current(), first.storage_last())
199
208
{}
209
+
210
+ sys_string_t (const typename utf32_access::reverse_iterator & first, std::default_sentinel_t ):
211
+ sys_string_t(first.storage_current(), first.storage_last())
212
+ {}
213
+
214
+ template <std::ranges::range Range>
215
+ requires (std::is_same_v<std::ranges::iterator_t <Range>, typename utf32_access::iterator> &&
216
+ (std::is_same_v<std::ranges::sentinel_t <Range>, typename utf32_access::iterator> ||
217
+ std::is_same_v<std::ranges::sentinel_t <Range>, std::default_sentinel_t >))
218
+ sys_string_t(const Range & range):
219
+ sys_string_t(std::begin(range), std::end(range))
220
+ {}
221
+
222
+ template <std::ranges::range Range>
223
+ requires (std::is_same_v<std::ranges::iterator_t <Range>, typename utf32_access::reverse_iterator> &&
224
+ (std::is_same_v<std::ranges::sentinel_t <Range>, typename utf32_access::reverse_iterator> ||
225
+ std::is_same_v<std::ranges::sentinel_t <Range>, std::default_sentinel_t >))
226
+ sys_string_t(const Range & range):
227
+ sys_string_t(std::begin(range), std::end(range))
228
+ {}
229
+
230
+ // Slice constructors from char_access::iterators
200
231
201
232
template <std::sized_sentinel_for<typename char_access::iterator> EndIt>
202
233
sys_string_t (const typename char_access::iterator & first, const EndIt & last):
@@ -208,6 +239,23 @@ namespace sysstr
208
239
sys_string_t(first.base() - (last - first), first.base())
209
240
{}
210
241
242
+ template <std::ranges::range Range>
243
+ requires (std::is_same_v<std::ranges::iterator_t <Range>, typename char_access::iterator> &&
244
+ std::sized_sentinel_for<std::ranges::sentinel_t <Range>, typename char_access::iterator> &&
245
+ (!std::ranges::contiguous_range<Range> || !has_utf_encoding<std::ranges::range_value_t <Range>>))
246
+ sys_string_t(const Range & range):
247
+ sys_string_t(std::begin(range), std::end(range))
248
+ {}
249
+
250
+ template <std::ranges::range Range>
251
+ requires (std::is_same_v<std::ranges::iterator_t <Range>, typename char_access::reverse_iterator> &&
252
+ std::sized_sentinel_for<std::ranges::sentinel_t <Range>, typename char_access::reverse_iterator>)
253
+ sys_string_t(const Range & range):
254
+ sys_string_t(std::begin(range), std::end(range))
255
+ {}
256
+
257
+ // Construct moving from underlying storage
258
+
211
259
explicit sys_string_t (storage && st) noexcept : storage(std::move(st))
212
260
{}
213
261
0 commit comments