diff options
Diffstat (limited to 'src/CellBuffer.cxx')
-rw-r--r-- | src/CellBuffer.cxx | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/src/CellBuffer.cxx b/src/CellBuffer.cxx index 74fb74816..2715be13f 100644 --- a/src/CellBuffer.cxx +++ b/src/CellBuffer.cxx @@ -136,8 +136,15 @@ class LineVector : public ILineVector { PerLine *perLine; LineStartIndex<POS> startsUTF16; LineStartIndex<POS> startsUTF32; + int activeIndices; + + void SetActiveIndices() noexcept { + activeIndices = (startsUTF32.Active() ? SC_LINECHARACTERINDEX_UTF32 : 0) + | (startsUTF16.Active() ? SC_LINECHARACTERINDEX_UTF16 : 0); + } + public: - LineVector() : starts(256), perLine(nullptr) { + LineVector() : starts(256), perLine(nullptr), activeIndices(0) { } // Deleted so LineVector objects can not be copied. LineVector(const LineVector &) = delete; @@ -163,13 +170,15 @@ public: void InsertLine(Sci::Line line, Sci::Position position, bool lineStart) override { const POS lineAsPos = static_cast<POS>(line); starts.InsertPartition(lineAsPos, static_cast<POS>(position)); - if (startsUTF32.Active()) { - startsUTF32.starts.InsertPartition(lineAsPos, - static_cast<POS>(startsUTF32.starts.PositionFromPartition(lineAsPos - 1) + 1)); - } - if (startsUTF16.Active()) { - startsUTF16.starts.InsertPartition(lineAsPos, - static_cast<POS>(startsUTF16.starts.PositionFromPartition(lineAsPos - 1) + 1)); + if (activeIndices) { + if (activeIndices & SC_LINECHARACTERINDEX_UTF32) { + startsUTF32.starts.InsertPartition(lineAsPos, + static_cast<POS>(startsUTF32.starts.PositionFromPartition(lineAsPos - 1) + 1)); + } + if (activeIndices & SC_LINECHARACTERINDEX_UTF16) { + startsUTF16.starts.InsertPartition(lineAsPos, + static_cast<POS>(startsUTF16.starts.PositionFromPartition(lineAsPos - 1) + 1)); + } } if (perLine) { if ((line > 0) && lineStart) @@ -182,10 +191,10 @@ public: } void RemoveLine(Sci::Line line) override { starts.RemovePartition(static_cast<POS>(line)); - if (startsUTF32.Active()) { + if (activeIndices & SC_LINECHARACTERINDEX_UTF32) { startsUTF32.starts.RemovePartition(static_cast<POS>(line)); } - if (startsUTF16.Active()) { + if (activeIndices & SC_LINECHARACTERINDEX_UTF16) { startsUTF16.starts.RemovePartition(static_cast<POS>(line)); } if (perLine) { @@ -202,55 +211,50 @@ public: return starts.PositionFromPartition(static_cast<POS>(line)); } void InsertCharacters(Sci::Line line, CountWidths delta) noexcept override { - if (startsUTF32.Active()) { + if (activeIndices & SC_LINECHARACTERINDEX_UTF32) { startsUTF32.starts.InsertText(static_cast<POS>(line), static_cast<POS>(delta.WidthUTF32())); } - if (startsUTF16.Active()) { + if (activeIndices & SC_LINECHARACTERINDEX_UTF16) { startsUTF16.starts.InsertText(static_cast<POS>(line), static_cast<POS>(delta.WidthUTF16())); } } void SetLineCharactersWidth(Sci::Line line, CountWidths width) noexcept override { - if (startsUTF32.Active()) { + if (activeIndices & SC_LINECHARACTERINDEX_UTF32) { assert(startsUTF32.starts.Partitions() == starts.Partitions()); startsUTF32.SetLineWidth(line, width.WidthUTF32()); } - if (startsUTF16.Active()) { + if (activeIndices & SC_LINECHARACTERINDEX_UTF16) { assert(startsUTF16.starts.Partitions() == starts.Partitions()); startsUTF16.SetLineWidth(line, width.WidthUTF16()); } } int LineCharacterIndex() const noexcept override { - int retVal = 0; - if (startsUTF32.Active()) { - retVal |= SC_LINECHARACTERINDEX_UTF32; - } - if (startsUTF16.Active()) { - retVal |= SC_LINECHARACTERINDEX_UTF16; - } - return retVal; + return activeIndices; } bool AllocateLineCharacterIndex(int lineCharacterIndex, Sci::Line lines) override { - bool changed = false; + const int activeIndicesStart = activeIndices; if ((lineCharacterIndex & SC_LINECHARACTERINDEX_UTF32) != 0) { - changed = startsUTF32.Allocate(lines) || changed; + startsUTF32.Allocate(lines); assert(startsUTF32.starts.Partitions() == starts.Partitions()); } if ((lineCharacterIndex & SC_LINECHARACTERINDEX_UTF16) != 0) { - changed = startsUTF16.Allocate(lines) || changed; + startsUTF16.Allocate(lines); assert(startsUTF16.starts.Partitions() == starts.Partitions()); } - return changed; + SetActiveIndices(); + return activeIndicesStart != activeIndices; } bool ReleaseLineCharacterIndex(int lineCharacterIndex) override { - bool changed = false; + const int activeIndicesStart = activeIndices; if ((lineCharacterIndex & SC_LINECHARACTERINDEX_UTF32) != 0) { - changed = startsUTF32.Release() || changed; + startsUTF32.Release(); } if ((lineCharacterIndex & SC_LINECHARACTERINDEX_UTF16) != 0) { - changed = startsUTF16.Release() || changed; + startsUTF16.Release(); } - return changed; + SetActiveIndices(); + return activeIndicesStart != activeIndices; } Sci::Position IndexLineStart(Sci::Line line, int lineCharacterIndex) const noexcept override { if (lineCharacterIndex == SC_LINECHARACTERINDEX_UTF32) { |