@@ -9,7 +9,6 @@ template <typename T>
99class Vector ;
1010// this class is not necessarily null-terminated
1111class StringView {
12- char * m_start_mut = nullptr ;
1312 const char * m_start = nullptr ;
1413 size_t m_size = 0 ;
1514 [[noreturn]] static void cxpr_error () {
@@ -26,13 +25,13 @@ class StringView {
2625 constexpr StringView (const char * begin, const char * end) :
2726 m_start(begin), m_size(static_cast <size_t >(end - begin)) {}
2827 constexpr StringView (char * begin, const char * end) :
29- m_start_mut(begin), m_start(begin), m_size(static_cast <size_t >(end - begin)) {}
28+ m_start(begin), m_size(static_cast <size_t >(end - begin)) {}
3029 template <typename T>
3130 requires IsSameV<T, const char *>
3231 constexpr StringView (T buf, size_t size) : m_start(buf), m_size(size) {}
3332 template <typename T>
3433 requires IsSameV<T, char *>
35- constexpr StringView (T buf, size_t size) : m_start_mut(buf), m_start(buf), m_size(size) {}
34+ constexpr StringView (T buf, size_t size) : m_start(buf), m_size(size) {}
3635 template <size_t N>
3736 constexpr StringView (const char (&buf)[N]) : m_start(buf), m_size(strlen(buf)) {}
3837 template <typename T>
@@ -42,35 +41,30 @@ class StringView {
4241 }
4342 template <typename T>
4443 requires IsSameV<T, char *>
45- constexpr StringView (T buf) : m_start_mut(buf), m_start(buf) {
44+ constexpr StringView (T buf) : m_start(buf) {
4645 m_size = strlen (buf);
4746 }
4847 constexpr StringView (Iterator<char > begin, Iterator<char > end) :
4948 m_start(begin.ptr()), m_size(static_cast <size_t >(end.ptr() - begin.ptr())) {}
5049 constexpr StringView (ConstIterator<char > begin, ConstIterator<char > end) :
5150 m_start(begin.ptr()), m_size(static_cast <size_t >(end.ptr() - begin.ptr())) {}
5251 explicit StringView (const String& ref) : m_start(ref.data()) { m_size = ref.length (); }
53- explicit StringView (String& ref) : m_start_mut(ref.rawptr()), m_start(ref.data()) { m_size = ref.length (); }
5452 constexpr StringView (const StringView& view) = default;
5553 constexpr StringView (StringView&& view) noexcept {
56- m_start_mut = view.m_start_mut ;
5754 m_start = view.m_start ;
5855 m_size = view.m_size ;
5956 view.m_start = nullptr ;
6057 view.m_size = 0 ;
6158 }
6259 constexpr StringView& operator =(const StringView& view) noexcept {
6360 if (this == &view) return *this ;
64- m_start_mut = view.m_start_mut ;
6561 m_start = view.m_start ;
6662 m_size = view.m_size ;
6763 return *this ;
6864 }
6965 constexpr StringView& operator =(StringView&& view) noexcept {
70- m_start_mut = view.m_start_mut ;
7166 m_start = view.m_start ;
7267 m_size = view.m_size ;
73- view.m_start_mut = nullptr ;
7468 view.m_start = nullptr ;
7569 view.m_size = 0 ;
7670 return *this ;
@@ -101,18 +95,12 @@ class StringView {
10195 }
10296 constexpr bool empty () const { return size () == 0 ; }
10397 [[nodiscard]] Ordering operator <=>(const StringView& other) const ;
98+ constexpr char first () const { return m_start[0 ]; }
99+ constexpr char last () const { return m_start[m_size - 1 ]; }
104100 constexpr char operator [](size_t index) const noexcept { return m_start[index]; }
105101 constexpr const char & index (size_t index) const noexcept { return m_start[index]; }
106- constexpr char & index (size_t index) noexcept {
107- HARD_ASSERT (m_start_mut, " This stringview is not mutable" )
108- return m_start_mut[index];
109- }
110102 [[nodiscard]] constexpr StringView substring (size_t size) {
111- if (m_start_mut) {
112- return StringView{ m_start_mut, size };
113- } else {
114- return StringView{ m_start, size };
115- }
103+ return StringView{ m_start, size };
116104 }
117105 [[nodiscard]] constexpr size_t index_of (const char * c, size_t start = 0 ) const {
118106 if (m_size == 0 || start >= m_size) return npos;
@@ -133,10 +121,6 @@ class StringView {
133121 [[nodiscard]] constexpr size_t size () const { return m_size; }
134122 [[nodiscard]] constexpr size_t length () const { return m_size; }
135123 [[nodiscard]] constexpr const char * data () const { return m_start; }
136- [[nodiscard]] constexpr char * rawptr () {
137- HARD_ASSERT (m_start_mut, " This stringview is not mutable" )
138- return m_start_mut;
139- }
140124 [[nodiscard]] constexpr ConstIterator<char > begin () const { return ConstIterator<char >{ m_start }; }
141125 [[nodiscard]] constexpr ConstIterator<char > end () const { return ConstIterator<char >{ m_start + m_size }; }
142126 [[nodiscard]] String str () const { return { m_start, length () }; }
@@ -145,11 +129,7 @@ class StringView {
145129 size_t ssize = size ();
146130 if (first > ssize) return {};
147131 if (last > ssize) return StringView{ m_start + first, m_size - first };
148- if (m_start_mut) {
149- return StringView{ m_start_mut + first, m_start + last };
150- } else {
151- return StringView{ m_start + first, m_start + last };
152- }
132+ return StringView{ m_start + first, m_start + last };
153133 }
154134 constexpr StringView substringview_fromlen (size_t first = 0 , size_t len = npos) const {
155135 if (is_constant_evaluated ()) { check_offset (first); }
0 commit comments