Skip to content

Commit f64effc

Browse files
committed
Making utf_view completely proper view
1 parent 7b04e8e commit f64effc

File tree

4 files changed

+266
-181
lines changed

4 files changed

+266
-181
lines changed

lib/inc/sys_string/sys_string.h

Lines changed: 78 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -91,60 +91,38 @@ namespace sysstr
9191
static_assert(std::ranges::random_access_range<char_access>);
9292

9393
template<utf_encoding Enc>
94-
class utf_access
94+
class utf_access : private util::utf_view<Enc, char_access, util::byval>
9595
{
9696
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>;
10398
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;
108103

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;
114109

115110
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)
118113
{}
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;
145123

146-
private:
147-
char_access m_access;
124+
using super::reverse;
125+
using super::each;
148126
};
149127
using utf8_access = utf_access<utf8>;
150128
using utf16_access = utf_access<utf16>;
@@ -442,28 +420,72 @@ namespace sysstr
442420
#endif
443421
};
444422

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+
{
447475

448476
template<class Storage>
449477
class sys_string_builder_t
450478
{
451479
private:
452480
using impl_type = typename Storage::builder_impl;
481+
static_assert(std::ranges::random_access_range<impl_type>);
453482

454483
public:
455484
using size_type = typename impl_type::size_type;
456485
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-
};
464486

465487
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>;
467489

468490
using utf8_view = utf_view<utf8>;
469491
using utf16_view = utf_view<utf16>;

0 commit comments

Comments
 (0)