aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornyamatongwe <nyamatongwe@gmail.com>2011-09-23 23:43:39 +1000
committernyamatongwe <nyamatongwe@gmail.com>2011-09-23 23:43:39 +1000
commitc69dc9be33d9913f57d259469e0f1d17253ef063 (patch)
treeed397d7cae93b4cb9dcfe18475f79e4a9fe02bc8
parentf4a284bff6d43ab551bd4b3c4f2b71f9b93191c1 (diff)
downloadscintilla-mirror-c69dc9be33d9913f57d259469e0f1d17253ef063.tar.gz
Optimized MarkerNext so it can be much faster when no marker ever set
and a little faster when markers have been used.
-rw-r--r--src/Document.cxx4
-rw-r--r--src/Document.h1
-rw-r--r--src/Editor.cxx10
-rw-r--r--src/PerLine.cxx11
-rw-r--r--src/PerLine.h1
5 files changed, 19 insertions, 8 deletions
diff --git a/src/Document.cxx b/src/Document.cxx
index 5c05aa5e0..4a7546cf1 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -185,6 +185,10 @@ int Document::GetMark(int line) {
return static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkValue(line);
}
+int Document::MarkerNext(int lineStart, int mask) const {
+ return static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkerNext(lineStart, mask);
+}
+
int Document::AddMark(int line, int markerNum) {
if (line >= 0 && line <= LinesTotal()) {
int prev = static_cast<LineMarkers *>(perLineData[ldMarkers])->
diff --git a/src/Document.h b/src/Document.h
index 00d23a45d..15aecbfe4 100644
--- a/src/Document.h
+++ b/src/Document.h
@@ -323,6 +323,7 @@ public:
cb.GetStyleRange(buffer, position, lengthRetrieve);
}
int GetMark(int line);
+ int MarkerNext(int lineStart, int mask) const;
int AddMark(int line, int markerNum);
void AddMarkSet(int line, int valueSet);
void DeleteMark(int line, int markerNum);
diff --git a/src/Editor.cxx b/src/Editor.cxx
index de0afdf49..2e4d724e5 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -8037,14 +8037,8 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_MARKERGET:
return pdoc->GetMark(wParam);
- case SCI_MARKERNEXT: {
- int lt = pdoc->LinesTotal();
- for (int iLine = wParam; iLine < lt; iLine++) {
- if ((pdoc->GetMark(iLine) & lParam) != 0)
- return iLine;
- }
- }
- return -1;
+ case SCI_MARKERNEXT:
+ return pdoc->MarkerNext(wParam, lParam);
case SCI_MARKERPREVIOUS: {
for (int iLine = wParam; iLine >= 0; iLine--) {
diff --git a/src/PerLine.cxx b/src/PerLine.cxx
index 7d961a886..c31d4ea9b 100644
--- a/src/PerLine.cxx
+++ b/src/PerLine.cxx
@@ -182,6 +182,17 @@ int LineMarkers::MarkValue(int line) {
return 0;
}
+int LineMarkers::MarkerNext(int lineStart, int mask) const {
+ int length = markers.Length();
+ for (int iLine = lineStart; iLine < length; iLine++) {
+ MarkerHandleSet *onLine = markers[iLine];
+ if (onLine && ((onLine->MarkValue() & mask) != 0))
+ //if ((pdoc->GetMark(iLine) & lParam) != 0)
+ return iLine;
+ }
+ return -1;
+}
+
int LineMarkers::AddMark(int line, int markerNum, int lines) {
handleCurrent++;
if (!markers.Length()) {
diff --git a/src/PerLine.h b/src/PerLine.h
index df4728632..b43c52bb8 100644
--- a/src/PerLine.h
+++ b/src/PerLine.h
@@ -54,6 +54,7 @@ public:
virtual void RemoveLine(int line);
int MarkValue(int line);
+ int MarkerNext(int lineStart, int mask) const;
int AddMark(int line, int marker, int lines);
void MergeMarkers(int pos);
bool DeleteMark(int line, int markerNum, bool all);