aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/CellBuffer.cxx
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2021-05-24 19:31:06 +1000
committerNeil <nyamatongwe@gmail.com>2021-05-24 19:31:06 +1000
commit92290868cf9753d2df0d494cb44e2ff62a570b58 (patch)
tree001e6cfce84372a03997de3138d630751ee8d38a /src/CellBuffer.cxx
parentee1886079d0a5cd350ee8e3379be347943ba93ae (diff)
downloadscintilla-mirror-92290868cf9753d2df0d494cb44e2ff62a570b58.tar.gz
Define C++ version of the Scintilla API in ScintillaTypes.h, ScintillaMessages.h
and ScintillaStructures.h using scoped enumerations. Use these headers instead of Scintilla.h internally. External definitions go in the Scintilla namespace and internal definitio0ns in Scintilla::Internal.
Diffstat (limited to 'src/CellBuffer.cxx')
-rw-r--r--src/CellBuffer.cxx109
1 files changed, 56 insertions, 53 deletions
diff --git a/src/CellBuffer.cxx b/src/CellBuffer.cxx
index 84c2c27a7..375fe2201 100644
--- a/src/CellBuffer.cxx
+++ b/src/CellBuffer.cxx
@@ -20,16 +20,17 @@
#include <algorithm>
#include <memory>
+#include "ScintillaTypes.h"
+
#include "Debugging.h"
-#include "Scintilla.h"
#include "Position.h"
#include "SplitVector.h"
#include "Partitioning.h"
#include "CellBuffer.h"
#include "UniConversion.h"
-namespace Scintilla {
+namespace Scintilla::Internal {
struct CountWidths {
// Measures the number of characters in a string divided into those
@@ -74,17 +75,18 @@ public:
virtual Sci::Position LineStart(Sci::Line line) const noexcept = 0;
virtual void InsertCharacters(Sci::Line line, CountWidths delta) noexcept = 0;
virtual void SetLineCharactersWidth(Sci::Line line, CountWidths width) noexcept = 0;
- virtual int LineCharacterIndex() const noexcept = 0;
- virtual bool AllocateLineCharacterIndex(int lineCharacterIndex, Sci::Line lines) = 0;
- virtual bool ReleaseLineCharacterIndex(int lineCharacterIndex) = 0;
- virtual Sci::Position IndexLineStart(Sci::Line line, int lineCharacterIndex) const noexcept = 0;
- virtual Sci::Line LineFromPositionIndex(Sci::Position pos, int lineCharacterIndex) const noexcept = 0;
+ virtual Scintilla::LineCharacterIndexType LineCharacterIndex() const noexcept = 0;
+ virtual bool AllocateLineCharacterIndex(Scintilla::LineCharacterIndexType lineCharacterIndex, Sci::Line lines) = 0;
+ virtual bool ReleaseLineCharacterIndex(Scintilla::LineCharacterIndexType lineCharacterIndex) = 0;
+ virtual Sci::Position IndexLineStart(Sci::Line line, Scintilla::LineCharacterIndexType lineCharacterIndex) const noexcept = 0;
+ virtual Sci::Line LineFromPositionIndex(Sci::Position pos, Scintilla::LineCharacterIndexType lineCharacterIndex) const noexcept = 0;
virtual ~ILineVector() {}
};
}
using namespace Scintilla;
+using namespace Scintilla::Internal;
template <typename POS>
class LineStartIndex {
@@ -147,15 +149,16 @@ class LineVector : public ILineVector {
PerLine *perLine;
LineStartIndex<POS> startsUTF16;
LineStartIndex<POS> startsUTF32;
- int activeIndices;
+ LineCharacterIndexType activeIndices;
void SetActiveIndices() noexcept {
- activeIndices = (startsUTF32.Active() ? SC_LINECHARACTERINDEX_UTF32 : 0)
- | (startsUTF16.Active() ? SC_LINECHARACTERINDEX_UTF16 : 0);
+ activeIndices =
+ (startsUTF32.Active() ? LineCharacterIndexType::Utf32 : LineCharacterIndexType::None)
+ | (startsUTF16.Active() ? LineCharacterIndexType::Utf16 : LineCharacterIndexType::None);
}
public:
- LineVector() : starts(256), perLine(nullptr), activeIndices(0) {
+ LineVector() : starts(256), perLine(nullptr), activeIndices(LineCharacterIndexType::None) {
}
// Deleted so LineVector objects can not be copied.
LineVector(const LineVector &) = delete;
@@ -181,11 +184,11 @@ 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 (activeIndices) {
- if (activeIndices & SC_LINECHARACTERINDEX_UTF32) {
+ if (activeIndices != LineCharacterIndexType::None) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf32)) {
startsUTF32.InsertLines(line, 1);
}
- if (activeIndices & SC_LINECHARACTERINDEX_UTF16) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf16)) {
startsUTF16.InsertLines(line, 1);
}
}
@@ -202,11 +205,11 @@ public:
} else {
starts.InsertPartitionsWithCast(lineAsPos, positions, lines);
}
- if (activeIndices) {
- if (activeIndices & SC_LINECHARACTERINDEX_UTF32) {
+ if (activeIndices != LineCharacterIndexType::None) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf32)) {
startsUTF32.InsertLines(line, lines);
}
- if (activeIndices & SC_LINECHARACTERINDEX_UTF16) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf16)) {
startsUTF16.InsertLines(line, lines);
}
}
@@ -221,10 +224,10 @@ public:
}
void RemoveLine(Sci::Line line) override {
starts.RemovePartition(static_cast<POS>(line));
- if (activeIndices & SC_LINECHARACTERINDEX_UTF32) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf32)) {
startsUTF32.starts.RemovePartition(static_cast<POS>(line));
}
- if (activeIndices & SC_LINECHARACTERINDEX_UTF16) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf16)) {
startsUTF16.starts.RemovePartition(static_cast<POS>(line));
}
if (perLine) {
@@ -241,60 +244,60 @@ public:
return starts.PositionFromPartition(static_cast<POS>(line));
}
void InsertCharacters(Sci::Line line, CountWidths delta) noexcept override {
- if (activeIndices & SC_LINECHARACTERINDEX_UTF32) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf32)) {
startsUTF32.starts.InsertText(static_cast<POS>(line), static_cast<POS>(delta.WidthUTF32()));
}
- if (activeIndices & SC_LINECHARACTERINDEX_UTF16) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf16)) {
startsUTF16.starts.InsertText(static_cast<POS>(line), static_cast<POS>(delta.WidthUTF16()));
}
}
void SetLineCharactersWidth(Sci::Line line, CountWidths width) noexcept override {
- if (activeIndices & SC_LINECHARACTERINDEX_UTF32) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf32)) {
assert(startsUTF32.starts.Partitions() == starts.Partitions());
startsUTF32.SetLineWidth(line, width.WidthUTF32());
}
- if (activeIndices & SC_LINECHARACTERINDEX_UTF16) {
+ if (FlagSet(activeIndices, LineCharacterIndexType::Utf16)) {
assert(startsUTF16.starts.Partitions() == starts.Partitions());
startsUTF16.SetLineWidth(line, width.WidthUTF16());
}
}
- int LineCharacterIndex() const noexcept override {
+ LineCharacterIndexType LineCharacterIndex() const noexcept override {
return activeIndices;
}
- bool AllocateLineCharacterIndex(int lineCharacterIndex, Sci::Line lines) override {
- const int activeIndicesStart = activeIndices;
- if ((lineCharacterIndex & SC_LINECHARACTERINDEX_UTF32) != 0) {
+ bool AllocateLineCharacterIndex(LineCharacterIndexType lineCharacterIndex, Sci::Line lines) override {
+ const LineCharacterIndexType activeIndicesStart = activeIndices;
+ if (FlagSet(lineCharacterIndex, LineCharacterIndexType::Utf32)) {
startsUTF32.Allocate(lines);
assert(startsUTF32.starts.Partitions() == starts.Partitions());
}
- if ((lineCharacterIndex & SC_LINECHARACTERINDEX_UTF16) != 0) {
+ if (FlagSet(lineCharacterIndex, LineCharacterIndexType::Utf16)) {
startsUTF16.Allocate(lines);
assert(startsUTF16.starts.Partitions() == starts.Partitions());
}
SetActiveIndices();
return activeIndicesStart != activeIndices;
}
- bool ReleaseLineCharacterIndex(int lineCharacterIndex) override {
- const int activeIndicesStart = activeIndices;
- if ((lineCharacterIndex & SC_LINECHARACTERINDEX_UTF32) != 0) {
+ bool ReleaseLineCharacterIndex(LineCharacterIndexType lineCharacterIndex) override {
+ const LineCharacterIndexType activeIndicesStart = activeIndices;
+ if (FlagSet(lineCharacterIndex, LineCharacterIndexType::Utf32)) {
startsUTF32.Release();
}
- if ((lineCharacterIndex & SC_LINECHARACTERINDEX_UTF16) != 0) {
+ if (FlagSet(lineCharacterIndex, LineCharacterIndexType::Utf16)) {
startsUTF16.Release();
}
SetActiveIndices();
return activeIndicesStart != activeIndices;
}
- Sci::Position IndexLineStart(Sci::Line line, int lineCharacterIndex) const noexcept override {
- if (lineCharacterIndex == SC_LINECHARACTERINDEX_UTF32) {
+ Sci::Position IndexLineStart(Sci::Line line, LineCharacterIndexType lineCharacterIndex) const noexcept override {
+ if (lineCharacterIndex == LineCharacterIndexType::Utf32) {
return startsUTF32.starts.PositionFromPartition(static_cast<POS>(line));
} else {
return startsUTF16.starts.PositionFromPartition(static_cast<POS>(line));
}
}
- Sci::Line LineFromPositionIndex(Sci::Position pos, int lineCharacterIndex) const noexcept override {
- if (lineCharacterIndex == SC_LINECHARACTERINDEX_UTF32) {
+ Sci::Line LineFromPositionIndex(Sci::Position pos, LineCharacterIndexType lineCharacterIndex) const noexcept override {
+ if (lineCharacterIndex == LineCharacterIndexType::Utf32) {
return static_cast<Sci::Line>(startsUTF32.starts.PartitionFromPosition(static_cast<POS>(pos)));
} else {
return static_cast<Sci::Line>(startsUTF16.starts.PartitionFromPosition(static_cast<POS>(pos)));
@@ -570,7 +573,7 @@ CellBuffer::CellBuffer(bool hasStyles_, bool largeDocument_) :
hasStyles(hasStyles_), largeDocument(largeDocument_) {
readOnly = false;
utf8Substance = false;
- utf8LineEnds = 0;
+ utf8LineEnds = LineEndType::Default;
collectingUndo = true;
if (largeDocument)
plv = std::make_unique<LineVector<Sci::Position>>();
@@ -719,9 +722,9 @@ void CellBuffer::SetUTF8Substance(bool utf8Substance_) noexcept {
utf8Substance = utf8Substance_;
}
-void CellBuffer::SetLineEndTypes(int utf8LineEnds_) {
+void CellBuffer::SetLineEndTypes(LineEndType utf8LineEnds_) {
if (utf8LineEnds != utf8LineEnds_) {
- const int indexes = plv->LineCharacterIndex();
+ const LineCharacterIndexType indexes = plv->LineCharacterIndex();
utf8LineEnds = utf8LineEnds_;
ResetLineEnds();
AllocateLineCharacterIndex(indexes);
@@ -735,7 +738,7 @@ bool CellBuffer::ContainsLineEnd(const char *s, Sci::Position length) const noex
const unsigned char ch = s[i];
if ((ch == '\r') || (ch == '\n')) {
return true;
- } else if (utf8LineEnds) {
+ } else if (utf8LineEnds == LineEndType::Unicode) {
if (UTF8IsMultibyteLineEnd(chBeforePrev, chPrev, ch)) {
return true;
}
@@ -750,11 +753,11 @@ void CellBuffer::SetPerLine(PerLine *pl) noexcept {
plv->SetPerLine(pl);
}
-int CellBuffer::LineCharacterIndex() const noexcept {
+LineCharacterIndexType CellBuffer::LineCharacterIndex() const noexcept {
return plv->LineCharacterIndex();
}
-void CellBuffer::AllocateLineCharacterIndex(int lineCharacterIndex) {
+void CellBuffer::AllocateLineCharacterIndex(LineCharacterIndexType lineCharacterIndex) {
if (utf8Substance) {
if (plv->AllocateLineCharacterIndex(lineCharacterIndex, Lines())) {
// Changed so recalculate whole file
@@ -763,7 +766,7 @@ void CellBuffer::AllocateLineCharacterIndex(int lineCharacterIndex) {
}
}
-void CellBuffer::ReleaseLineCharacterIndex(int lineCharacterIndex) {
+void CellBuffer::ReleaseLineCharacterIndex(LineCharacterIndexType lineCharacterIndex) {
plv->ReleaseLineCharacterIndex(lineCharacterIndex);
}
@@ -784,11 +787,11 @@ Sci::Line CellBuffer::LineFromPosition(Sci::Position pos) const noexcept {
return plv->LineFromPosition(pos);
}
-Sci::Position CellBuffer::IndexLineStart(Sci::Line line, int lineCharacterIndex) const noexcept {
+Sci::Position CellBuffer::IndexLineStart(Sci::Line line, LineCharacterIndexType lineCharacterIndex) const noexcept {
return plv->IndexLineStart(line, lineCharacterIndex);
}
-Sci::Line CellBuffer::LineFromPositionIndex(Sci::Position pos, int lineCharacterIndex) const noexcept {
+Sci::Line CellBuffer::LineFromPositionIndex(Sci::Position pos, LineCharacterIndexType lineCharacterIndex) const noexcept {
return plv->LineFromPositionIndex(pos, lineCharacterIndex);
}
@@ -907,7 +910,7 @@ void CellBuffer::ResetLineEnds() {
InsertLine(lineInsert, (position + i) + 1, atLineStart);
lineInsert++;
}
- } else if (utf8LineEnds) {
+ } else if (utf8LineEnds == LineEndType::Unicode) {
if (UTF8IsMultibyteLineEnd(chBeforePrev, chPrev, ch)) {
InsertLine(lineInsert, (position + i) + 1, atLineStart);
lineInsert++;
@@ -936,7 +939,7 @@ CountWidths CountCharacterWidthsUTF8(std::string_view sv) noexcept {
}
bool CellBuffer::MaintainingLineCharacterIndex() const noexcept {
- return plv->LineCharacterIndex() != SC_LINECHARACTERINDEX_NONE;
+ return plv->LineCharacterIndex() != LineCharacterIndexType::None;
}
void CellBuffer::RecalculateIndexLineStarts(Sci::Line lineFirst, Sci::Line lineLast) {
@@ -961,7 +964,7 @@ void CellBuffer::BasicInsertString(Sci::Position position, const char *s, Sci::P
const unsigned char chAfter = substance.ValueAt(position);
bool breakingUTF8LineEnd = false;
- if (utf8LineEnds && UTF8IsTrailByte(chAfter)) {
+ if (utf8LineEnds == LineEndType::Unicode && UTF8IsTrailByte(chAfter)) {
breakingUTF8LineEnd = UTF8LineEndOverlaps(position);
}
@@ -1021,7 +1024,7 @@ void CellBuffer::BasicInsertString(Sci::Position position, const char *s, Sci::P
uint8_t eolTable[256]{};
eolTable[static_cast<uint8_t>('\n')] = 1;
eolTable[static_cast<uint8_t>('\r')] = 2;
- if (utf8LineEnds) {
+ if (utf8LineEnds == LineEndType::Unicode) {
// see UniConversion.h for LS, PS and NEL
eolTable[0x85] = 4;
eolTable[0xa8] = 3;
@@ -1081,7 +1084,7 @@ void CellBuffer::BasicInsertString(Sci::Position position, const char *s, Sci::P
if (ch == '\r' || ch == '\n') {
InsertLine(lineInsert, (position + ptr - s), atLineStart);
lineInsert++;
- } else if (utf8LineEnds && !UTF8IsAscii(ch)) {
+ } else if (utf8LineEnds == LineEndType::Unicode && !UTF8IsAscii(ch)) {
if (UTF8IsMultibyteLineEnd(chBeforePrev, chPrev, ch)) {
InsertLine(lineInsert, (position + ptr - s), atLineStart);
lineInsert++;
@@ -1096,7 +1099,7 @@ void CellBuffer::BasicInsertString(Sci::Position position, const char *s, Sci::P
RemoveLine(lineInsert - 1);
simpleInsertion = false;
}
- } else if (utf8LineEnds && !UTF8IsAscii(chAfter)) {
+ } else if (utf8LineEnds == LineEndType::Unicode && !UTF8IsAscii(chAfter)) {
chBeforePrev = chPrev;
chPrev = ch;
// May have end of UTF-8 line end in buffer and start in insertion
@@ -1177,7 +1180,7 @@ void CellBuffer::BasicDeleteChars(Sci::Position position, Sci::Position deleteLe
lineRemove++;
ignoreNL = true; // First \n is not real deletion
}
- if (utf8LineEnds && UTF8IsTrailByte(chNext)) {
+ if (utf8LineEnds == LineEndType::Unicode && UTF8IsTrailByte(chNext)) {
if (UTF8LineEndOverlaps(position)) {
RemoveLine(lineRemove);
}
@@ -1196,7 +1199,7 @@ void CellBuffer::BasicDeleteChars(Sci::Position position, Sci::Position deleteLe
} else {
RemoveLine(lineRemove);
}
- } else if (utf8LineEnds) {
+ } else if (utf8LineEnds == LineEndType::Unicode) {
if (!UTF8IsAscii(ch)) {
const unsigned char next3[3] = {ch, chNext,
static_cast<unsigned char>(substance.ValueAt(position + i + 2))};