diff options
author | nyamatongwe <nyamatongwe@gmail.com> | 2011-09-23 23:43:39 +1000 |
---|---|---|
committer | nyamatongwe <nyamatongwe@gmail.com> | 2011-09-23 23:43:39 +1000 |
commit | c69dc9be33d9913f57d259469e0f1d17253ef063 (patch) | |
tree | ed397d7cae93b4cb9dcfe18475f79e4a9fe02bc8 /src | |
parent | f4a284bff6d43ab551bd4b3c4f2b71f9b93191c1 (diff) | |
download | scintilla-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/Document.cxx | 4 | ||||
-rw-r--r-- | src/Document.h | 1 | ||||
-rw-r--r-- | src/Editor.cxx | 10 | ||||
-rw-r--r-- | src/PerLine.cxx | 11 | ||||
-rw-r--r-- | src/PerLine.h | 1 |
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); |