aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/PositionCache.cxx
diff options
context:
space:
mode:
authorZufu Liu <unknown>2021-10-21 22:15:57 +1100
committerZufu Liu <unknown>2021-10-21 22:15:57 +1100
commit9975609bf3b39f0e1cd121995ac49aea30a6c48f (patch)
tree339887d2052a909480b4e3b4df12f318bbec2be8 /src/PositionCache.cxx
parenta989b1ed63c7cf81c693da8f2f66ab5e29ee341a (diff)
downloadscintilla-mirror-9975609bf3b39f0e1cd121995ac49aea30a6c48f.tar.gz
Feature [feature-requests:#1417] Use backward iteration to find space / control
character and text / punctuation boundaries in SafeSegment as will be simpler and faster in almost all cases. Simplify BreakFinder::Next calling SafeSegment.
Diffstat (limited to 'src/PositionCache.cxx')
-rw-r--r--src/PositionCache.cxx21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx
index 6370edb33..c9f4e8793 100644
--- a/src/PositionCache.cxx
+++ b/src/PositionCache.cxx
@@ -755,21 +755,20 @@ TextSegment BreakFinder::Next() {
}
subBreak = prev;
}
+
// Splitting up a long run from prev to nextBreak in lots of approximately lengthEachSubdivision.
- // For very long runs add extra breaks after spaces or if no spaces before low punctuation.
const int startSegment = subBreak;
- if ((nextBreak - subBreak) <= lengthEachSubdivision) {
- subBreak = -1;
- return TextSegment(startSegment, nextBreak - startSegment);
+ const int remaining = nextBreak - startSegment;
+ int lengthSegment = remaining;
+ if (lengthSegment > lengthEachSubdivision) {
+ lengthSegment = static_cast<int>(pdoc->SafeSegment(std::string_view(&ll->chars[startSegment], lengthEachSubdivision)));
+ }
+ if (lengthSegment < remaining) {
+ subBreak += lengthSegment;
} else {
- subBreak += pdoc->SafeSegment(&ll->chars[subBreak], lengthEachSubdivision);
- if (subBreak >= nextBreak) {
- subBreak = -1;
- return TextSegment(startSegment, nextBreak - startSegment);
- } else {
- return TextSegment(startSegment, subBreak - startSegment);
- }
+ subBreak = -1;
}
+ return TextSegment(startSegment, lengthSegment);
}
bool BreakFinder::More() const noexcept {