Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarStringView.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-28 20:07:22 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-28 20:07:22 +1000
commit4b91eb717554aeaab8f366a1608276acb5f88479 (patch)
tree342c9814d098afe68382846666a03b06203a4751 /source/core/StarStringView.cpp
parent1fc295b97975d20ed0f8011c1ece6fcd687c97cd (diff)
Fix StringView::substr
Diffstat (limited to 'source/core/StarStringView.cpp')
-rw-r--r--source/core/StarStringView.cpp29
1 files changed, 12 insertions, 17 deletions
diff --git a/source/core/StarStringView.cpp b/source/core/StarStringView.cpp
index 36ad9b2..8090515 100644
--- a/source/core/StarStringView.cpp
+++ b/source/core/StarStringView.cpp
@@ -338,27 +338,22 @@ bool StringView::equalsIgnoreCase(StringView s) const {
}
StringView StringView::substr(size_t position, size_t n) const {
- auto len = size();
- if (position > len)
- throw OutOfRangeException(strf("out of range in StringView::substr({}, {})", position, n));
-
- if (position == 0 && n >= len)
- return *this;
-
- String ret;
- ret.reserve(std::min(n, len - position));
-
+ StringView ret;
+ auto it_end = end();
auto it = begin();
- std::advance(it, position);
+ for (size_t i = 0; i != position; ++i) {
+ if (++it == it_end)
+ throw OutOfRangeException(strf("out of range in StringView::substr({}, {})", position, n));
+ }
- for (size_t i = 0; i < n; ++i) {
- if (it == end())
- break;
- ret.append(*it);
- ++it;
+ const char* start = &*it.base();
+
+ for (size_t i = 0; i != n; ++i) {
+ if (it++ == it_end)
+ return StringView(start, &*it.base() - start - 1);
}
- return ret;
+ return StringView(start, &*it.base() - start);
}
int StringView::compare(size_t selfOffset, size_t selfLen, StringView other,