aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Document.cxx
diff options
context:
space:
mode:
authorZufu Liu <unknown>2022-12-21 08:48:45 +1100
committerZufu Liu <unknown>2022-12-21 08:48:45 +1100
commit61508c02e7e2ea4de857a2be604e1d80222083c1 (patch)
treed6cdd35a3f1c9df729430a36ea707600975de041 /src/Document.cxx
parentdb320f1668fceec9c625ac5ccdf9864200386f0e (diff)
downloadscintilla-mirror-61508c02e7e2ea4de857a2be604e1d80222083c1.tar.gz
Bug [#2340]. Avoid repeated call in GetFoldParent for around 10% performance
gain with Visual C++ 64-bit release mode on 300,000 line file. Remove duplicated code and simplify. GetFoldLevel and thus GetFoldParent can't throw so mark as noexcept.
Diffstat (limited to 'src/Document.cxx')
-rw-r--r--src/Document.cxx22
1 files changed, 8 insertions, 14 deletions
diff --git a/src/Document.cxx b/src/Document.cxx
index 00ac8e618..2d1acd7e1 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -558,7 +558,7 @@ int SCI_METHOD Document::GetLevel(Sci_Position line) const {
return Levels()->GetLevel(line);
}
-FoldLevel Document::GetFoldLevel(Sci_Position line) const {
+FoldLevel Document::GetFoldLevel(Sci_Position line) const noexcept {
return static_cast<FoldLevel>(Levels()->GetLevel(line));
}
@@ -597,21 +597,15 @@ Sci::Line Document::GetLastChild(Sci::Line lineParent, std::optional<FoldLevel>
return lineMaxSubord;
}
-Sci::Line Document::GetFoldParent(Sci::Line line) const {
+Sci::Line Document::GetFoldParent(Sci::Line line) const noexcept {
const FoldLevel level = LevelNumberPart(GetFoldLevel(line));
- Sci::Line lineLook = line - 1;
- while ((lineLook > 0) && (
- (!LevelIsHeader(GetFoldLevel(lineLook))) ||
- (LevelNumberPart(GetFoldLevel(lineLook)) >= level))
- ) {
- lineLook--;
- }
- if (LevelIsHeader(GetFoldLevel(lineLook)) &&
- (LevelNumberPart(GetFoldLevel(lineLook)) < level)) {
- return lineLook;
- } else {
- return -1;
+ for (Sci::Line lineLook = line - 1; lineLook >= 0; lineLook--) {
+ const FoldLevel levelTry = GetFoldLevel(lineLook);
+ if (LevelIsHeader(levelTry) && LevelNumberPart(levelTry) < level) {
+ return lineLook;
+ }
}
+ return -1;
}
void Document::GetHighlightDelimiters(HighlightDelimiter &highlightDelimiter, Sci::Line line, Sci::Line lastLine) {