@@ -91,60 +91,38 @@ namespace sysstr
91
91
static_assert (std::ranges::random_access_range<char_access>);
92
92
93
93
template <utf_encoding Enc>
94
- class utf_access
94
+ class utf_access : private util ::utf_view<Enc, char_access, util::byval>
95
95
{
96
96
private:
97
- static constexpr auto source_encoding = utf_encoding_of<std::ranges::range_value_t <decltype(std::declval<char_access>())>>;
98
-
99
- using char_iterator = decltype(std::ranges::begin(std::declval<char_access &>()));
100
- using char_sentinel = decltype(std::ranges::end(std::declval<char_access &>()));
101
- using char_reverse_iterator = decltype(std::ranges::rbegin(std::declval<char_access &>()));
102
- using char_reverse_sentinel = decltype(std::ranges::rend(std::declval<char_access &>()));
97
+ using super = util::utf_view<Enc, char_access, util::byval>;
103
98
public:
104
- using iterator = util::utf_iterator<Enc, char_iterator, char_sentinel, util::iter_direction::forward> ;
105
- using const_iterator = iterator ;
106
- using reverse_iterator = util::utf_iterator<Enc, char_reverse_iterator, char_reverse_sentinel, util::iter_direction::backward> ;
107
- using const_reverse_iterator = reverse_iterator ;
99
+ using typename super::iterator ;
100
+ using typename super::const_iterator ;
101
+ using typename super::reverse_iterator ;
102
+ using typename super::const_reverse_iterator ;
108
103
109
- using value_type = typename iterator ::value_type;
110
- using reference = typename iterator ::reference;
111
- using const_reference = reference ;
112
- using pointer = typename iterator ::pointer;
113
- using const_pointer = pointer ;
104
+ using typename super ::value_type;
105
+ using typename super ::reference;
106
+ using typename super::const_reference ;
107
+ using typename super ::pointer;
108
+ using typename super::const_pointer ;
114
109
115
110
public:
116
- utf_access (const sys_string_t & src) noexcept (noexcept (char_access (src))) :
117
- m_access (src)
111
+ utf_access (const sys_string_t & src) noexcept (noexcept (super (src))) :
112
+ super (src)
118
113
{}
119
- SYS_STRING_FORCE_INLINE iterator begin () const
120
- { return iterator (std::ranges::begin (m_access), std::ranges::end (m_access)); }
121
- SYS_STRING_FORCE_INLINE std::default_sentinel_t end () const
122
- { return std::default_sentinel; }
123
- SYS_STRING_FORCE_INLINE const_iterator cbegin () const
124
- { return begin (); }
125
- SYS_STRING_FORCE_INLINE std::default_sentinel_t cend () const
126
- { return end (); }
127
- SYS_STRING_FORCE_INLINE reverse_iterator rbegin () const
128
- { return reverse_iterator (std::ranges::rbegin (m_access), std::ranges::rend (m_access)); }
129
- SYS_STRING_FORCE_INLINE std::default_sentinel_t rend () const
130
- { return std::default_sentinel; }
131
- SYS_STRING_FORCE_INLINE const_reverse_iterator crbegin () const
132
- { return rbegin (); }
133
- SYS_STRING_FORCE_INLINE std::default_sentinel_t crend () const
134
- { return rend (); }
135
-
136
- reverse_iterator reverse (iterator it) const
137
- { return reverse_iterator (it, std::ranges::rend (m_access)); }
138
-
139
- iterator reverse (reverse_iterator it) const
140
- { return iterator (it, std::ranges::end (m_access)); }
141
-
142
- template <class Func >
143
- decltype (auto ) each(Func func) const
144
- { return utf_converter<source_encoding, Enc>::for_each_converted (m_access, func); }
114
+
115
+ using super::begin;
116
+ using super::end;
117
+ using super::cbegin;
118
+ using super::cend;
119
+ using super::rbegin;
120
+ using super::rend;
121
+ using super::crbegin;
122
+ using super::crend;
145
123
146
- private:
147
- char_access m_access ;
124
+ using super::reverse;
125
+ using super::each ;
148
126
};
149
127
using utf8_access = utf_access<utf8>;
150
128
using utf16_access = utf_access<utf16>;
@@ -442,28 +420,72 @@ namespace sysstr
442
420
#endif
443
421
};
444
422
445
- template <class Storage > struct utf_view_adapter_for <sys_string_builder_t <Storage>>
446
- { using type = typename sys_string_builder_t <Storage>::utf_view_adapter; };
423
+ namespace util
424
+ {
425
+
426
+ template <utf_encoding Enc, class Storage >
427
+ class builder_utf_view : private util ::utf_view<Enc, typename Storage::builder_impl, util::byref>
428
+ {
429
+ private:
430
+ using super = util::utf_view<Enc, typename Storage::builder_impl, util::byref>;
431
+ public:
432
+ using typename super::iterator;
433
+ using typename super::const_iterator;
434
+ using typename super::reverse_iterator;
435
+ using typename super::const_reverse_iterator;
436
+
437
+ using typename super::value_type;
438
+ using typename super::reference;
439
+ using typename super::const_reference;
440
+ using typename super::pointer;
441
+ using typename super::const_pointer;
442
+
443
+ public:
444
+ builder_utf_view (const sys_string_builder_t <Storage> & src) noexcept (noexcept (super(src.m_impl))) :
445
+ super (src.m_impl)
446
+ {}
447
+ builder_utf_view (sys_string_builder_t <Storage> && src) = delete ;
448
+
449
+ using super::begin;
450
+ using super::end;
451
+ using super::cbegin;
452
+ using super::cend;
453
+ using super::rbegin;
454
+ using super::rend;
455
+ using super::crbegin;
456
+ using super::crend;
457
+
458
+ using super::reverse;
459
+ using super::each;
460
+ };
461
+ }
462
+ }
463
+
464
+ namespace std ::ranges {
465
+ template <sysstr::utf_encoding Enc, class Storage >
466
+ constexpr bool enable_view<sysstr::util::builder_utf_view<Enc, Storage>> = true ;
467
+
468
+ template <sysstr::utf_encoding Enc, class Storage >
469
+ constexpr bool enable_borrowed_range<sysstr::util::builder_utf_view<Enc, Storage>> = true ;
470
+ }
471
+
472
+
473
+ namespace sysstr
474
+ {
447
475
448
476
template <class Storage >
449
477
class sys_string_builder_t
450
478
{
451
479
private:
452
480
using impl_type = typename Storage::builder_impl;
481
+ static_assert (std::ranges::random_access_range<impl_type>);
453
482
454
483
public:
455
484
using size_type = typename impl_type::size_type;
456
485
using storage_type = typename impl_type::value_type;
457
-
458
-
459
- struct utf_view_adapter
460
- {
461
- static constexpr const impl_type * adapt (const sys_string_builder_t & builder) noexcept
462
- { return &builder.m_impl ; }
463
- };
464
486
465
487
template <utf_encoding Enc>
466
- using utf_view = utf_view <Enc, sys_string_builder_t >;
488
+ using utf_view = util::builder_utf_view <Enc, Storage >;
467
489
468
490
using utf8_view = utf_view<utf8>;
469
491
using utf16_view = utf_view<utf16>;
0 commit comments