aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ContractionState.cxx168
1 files changed, 99 insertions, 69 deletions
diff --git a/src/ContractionState.cxx b/src/ContractionState.cxx
index 83a7ee2ea..2950587cb 100644
--- a/src/ContractionState.cxx
+++ b/src/ContractionState.cxx
@@ -28,14 +28,15 @@ using namespace Scintilla;
namespace {
+template <typename LINE>
class ContractionState final : public IContractionState {
// These contain 1 element for every document line.
- std::unique_ptr<RunStyles<Sci::Line, char>> visible;
- std::unique_ptr<RunStyles<Sci::Line, char>> expanded;
- std::unique_ptr<RunStyles<Sci::Line, int>> heights;
+ std::unique_ptr<RunStyles<LINE, char>> visible;
+ std::unique_ptr<RunStyles<LINE, char>> expanded;
+ std::unique_ptr<RunStyles<LINE, int>> heights;
std::unique_ptr<SparseVector<UniqueString>> foldDisplayTexts;
- std::unique_ptr<Partitioning<Sci::Line>> displayLines;
- Sci::Line linesInDocument;
+ std::unique_ptr<Partitioning<LINE>> displayLines;
+ LINE linesInDocument;
void EnsureData();
@@ -88,58 +89,66 @@ public:
void Check() const;
};
-ContractionState::ContractionState() noexcept : linesInDocument(1) {
+template <typename LINE>
+ContractionState<LINE>::ContractionState() noexcept : linesInDocument(1) {
}
-ContractionState::~ContractionState() {
+template <typename LINE>
+ContractionState<LINE>::~ContractionState() {
Clear();
}
-void ContractionState::EnsureData() {
+template <typename LINE>
+void ContractionState<LINE>::EnsureData() {
if (OneToOne()) {
- visible = std::make_unique<RunStyles<Sci::Line, char>>();
- expanded = std::make_unique<RunStyles<Sci::Line, char>>();
- heights = std::make_unique<RunStyles<Sci::Line, int>>();
+ visible = std::make_unique<RunStyles<LINE, char>>();
+ expanded = std::make_unique<RunStyles<LINE, char>>();
+ heights = std::make_unique<RunStyles<LINE, int>>();
foldDisplayTexts = std::make_unique<SparseVector<UniqueString>>();
- displayLines = std::make_unique<Partitioning<Sci::Line>>(4);
+ displayLines = std::make_unique<Partitioning<LINE>>(4);
InsertLines(0, linesInDocument);
}
}
-void ContractionState::InsertLine(Sci::Line lineDoc) {
+template <typename LINE>
+void ContractionState<LINE>::InsertLine(Sci::Line lineDoc) {
if (OneToOne()) {
linesInDocument++;
} else {
- visible->InsertSpace(lineDoc, 1);
- visible->SetValueAt(lineDoc, 1);
- expanded->InsertSpace(lineDoc, 1);
- expanded->SetValueAt(lineDoc, 1);
- heights->InsertSpace(lineDoc, 1);
- heights->SetValueAt(lineDoc, 1);
- foldDisplayTexts->InsertSpace(lineDoc, 1);
- foldDisplayTexts->SetValueAt(lineDoc, nullptr);
+ const LINE lineDocCast = static_cast<LINE>(lineDoc);
+ visible->InsertSpace(lineDocCast, 1);
+ visible->SetValueAt(lineDocCast, 1);
+ expanded->InsertSpace(lineDocCast, 1);
+ expanded->SetValueAt(lineDocCast, 1);
+ heights->InsertSpace(lineDocCast, 1);
+ heights->SetValueAt(lineDocCast, 1);
+ foldDisplayTexts->InsertSpace(lineDocCast, 1);
+ foldDisplayTexts->SetValueAt(lineDocCast, nullptr);
const Sci::Line lineDisplay = DisplayFromDoc(lineDoc);
- displayLines->InsertPartition(lineDoc, lineDisplay);
- displayLines->InsertText(lineDoc, 1);
+ displayLines->InsertPartition(lineDocCast, static_cast<LINE>(lineDisplay));
+ displayLines->InsertText(lineDocCast, 1);
}
}
-void ContractionState::DeleteLine(Sci::Line lineDoc) {
+template <typename LINE>
+void ContractionState<LINE>::DeleteLine(Sci::Line lineDoc) {
if (OneToOne()) {
linesInDocument--;
} else {
+ const LINE lineDocCast = static_cast<LINE>(lineDoc);
if (GetVisible(lineDoc)) {
- displayLines->InsertText(lineDoc, -heights->ValueAt(lineDoc));
+ displayLines->InsertText(lineDocCast, -heights->ValueAt(lineDocCast));
}
- displayLines->RemovePartition(lineDoc);
- visible->DeleteRange(lineDoc, 1);
- expanded->DeleteRange(lineDoc, 1);
- heights->DeleteRange(lineDoc, 1);
- foldDisplayTexts->DeletePosition(lineDoc);
+ displayLines->RemovePartition(lineDocCast);
+ visible->DeleteRange(lineDocCast, 1);
+ expanded->DeleteRange(lineDocCast, 1);
+ heights->DeleteRange(lineDocCast, 1);
+ foldDisplayTexts->DeletePosition(lineDocCast);
}
}
-void ContractionState::Clear() noexcept {
+template <typename LINE>
+void ContractionState<LINE>::Clear() noexcept {
visible.reset();
expanded.reset();
heights.reset();
@@ -148,7 +157,8 @@ void ContractionState::Clear() noexcept {
linesInDocument = 1;
}
-Sci::Line ContractionState::LinesInDoc() const {
+template <typename LINE>
+Sci::Line ContractionState<LINE>::LinesInDoc() const {
if (OneToOne()) {
return linesInDocument;
} else {
@@ -156,29 +166,33 @@ Sci::Line ContractionState::LinesInDoc() const {
}
}
-Sci::Line ContractionState::LinesDisplayed() const {
+template <typename LINE>
+Sci::Line ContractionState<LINE>::LinesDisplayed() const {
if (OneToOne()) {
return linesInDocument;
} else {
- return displayLines->PositionFromPartition(LinesInDoc());
+ return displayLines->PositionFromPartition(static_cast<LINE>(LinesInDoc()));
}
}
-Sci::Line ContractionState::DisplayFromDoc(Sci::Line lineDoc) const {
+template <typename LINE>
+Sci::Line ContractionState<LINE>::DisplayFromDoc(Sci::Line lineDoc) const {
if (OneToOne()) {
return (lineDoc <= linesInDocument) ? lineDoc : linesInDocument;
} else {
if (lineDoc > displayLines->Partitions())
lineDoc = displayLines->Partitions();
- return displayLines->PositionFromPartition(lineDoc);
+ return displayLines->PositionFromPartition(static_cast<LINE>(lineDoc));
}
}
-Sci::Line ContractionState::DisplayLastFromDoc(Sci::Line lineDoc) const {
+template <typename LINE>
+Sci::Line ContractionState<LINE>::DisplayLastFromDoc(Sci::Line lineDoc) const {
return DisplayFromDoc(lineDoc) + GetHeight(lineDoc) - 1;
}
-Sci::Line ContractionState::DocFromDisplay(Sci::Line lineDisplay) const {
+template <typename LINE>
+Sci::Line ContractionState<LINE>::DocFromDisplay(Sci::Line lineDisplay) const {
if (OneToOne()) {
return lineDisplay;
} else {
@@ -186,39 +200,43 @@ Sci::Line ContractionState::DocFromDisplay(Sci::Line lineDisplay) const {
return 0;
}
if (lineDisplay > LinesDisplayed()) {
- return displayLines->PartitionFromPosition(LinesDisplayed());
+ return displayLines->PartitionFromPosition(static_cast<LINE>(LinesDisplayed()));
}
- const Sci::Line lineDoc = displayLines->PartitionFromPosition(lineDisplay);
+ const Sci::Line lineDoc = displayLines->PartitionFromPosition(static_cast<LINE>(lineDisplay));
PLATFORM_ASSERT(GetVisible(lineDoc));
return lineDoc;
}
}
-void ContractionState::InsertLines(Sci::Line lineDoc, Sci::Line lineCount) {
+template <typename LINE>
+void ContractionState<LINE>::InsertLines(Sci::Line lineDoc, Sci::Line lineCount) {
for (int l = 0; l < lineCount; l++) {
InsertLine(lineDoc + l);
}
Check();
}
-void ContractionState::DeleteLines(Sci::Line lineDoc, Sci::Line lineCount) {
+template <typename LINE>
+void ContractionState<LINE>::DeleteLines(Sci::Line lineDoc, Sci::Line lineCount) {
for (Sci::Line l = 0; l < lineCount; l++) {
DeleteLine(lineDoc);
}
Check();
}
-bool ContractionState::GetVisible(Sci::Line lineDoc) const {
+template <typename LINE>
+bool ContractionState<LINE>::GetVisible(Sci::Line lineDoc) const {
if (OneToOne()) {
return true;
} else {
if (lineDoc >= visible->Length())
return true;
- return visible->ValueAt(lineDoc) == 1;
+ return visible->ValueAt(static_cast<LINE>(lineDoc)) == 1;
}
}
-bool ContractionState::SetVisible(Sci::Line lineDocStart, Sci::Line lineDocEnd, bool isVisible) {
+template <typename LINE>
+bool ContractionState<LINE>::SetVisible(Sci::Line lineDocStart, Sci::Line lineDocEnd, bool isVisible) {
if (OneToOne() && isVisible) {
return false;
} else {
@@ -228,9 +246,10 @@ bool ContractionState::SetVisible(Sci::Line lineDocStart, Sci::Line lineDocEnd,
if ((lineDocStart <= lineDocEnd) && (lineDocStart >= 0) && (lineDocEnd < LinesInDoc())) {
for (Sci::Line line = lineDocStart; line <= lineDocEnd; line++) {
if (GetVisible(line) != isVisible) {
- const int difference = isVisible ? heights->ValueAt(line) : -heights->ValueAt(line);
- visible->SetValueAt(line, isVisible ? 1 : 0);
- displayLines->InsertText(line, difference);
+ const int heightLine = heights->ValueAt(static_cast<LINE>(line));
+ const int difference = isVisible ? heightLine : -heightLine;
+ visible->SetValueAt(static_cast<LINE>(line), isVisible ? 1 : 0);
+ displayLines->InsertText(static_cast<LINE>(line), difference);
delta += difference;
}
}
@@ -242,7 +261,8 @@ bool ContractionState::SetVisible(Sci::Line lineDocStart, Sci::Line lineDocEnd,
}
}
-bool ContractionState::HiddenLines() const {
+template <typename LINE>
+bool ContractionState<LINE>::HiddenLines() const {
if (OneToOne()) {
return false;
} else {
@@ -250,16 +270,19 @@ bool ContractionState::HiddenLines() const {
}
}
-const char *ContractionState::GetFoldDisplayText(Sci::Line lineDoc) const {
+template <typename LINE>
+const char *ContractionState<LINE>::GetFoldDisplayText(Sci::Line lineDoc) const {
Check();
return foldDisplayTexts->ValueAt(lineDoc).get();
}
-bool ContractionState::GetFoldDisplayTextShown(Sci::Line lineDoc) const {
+template <typename LINE>
+bool ContractionState<LINE>::GetFoldDisplayTextShown(Sci::Line lineDoc) const {
return !GetExpanded(lineDoc) && GetFoldDisplayText(lineDoc);
}
-bool ContractionState::SetFoldDisplayText(Sci::Line lineDoc, const char *text) {
+template <typename LINE>
+bool ContractionState<LINE>::SetFoldDisplayText(Sci::Line lineDoc, const char *text) {
EnsureData();
const char *foldText = foldDisplayTexts->ValueAt(lineDoc).get();
if (!foldText || !text || 0 != strcmp(text, foldText)) {
@@ -272,22 +295,24 @@ bool ContractionState::SetFoldDisplayText(Sci::Line lineDoc, const char *text) {
}
}
-bool ContractionState::GetExpanded(Sci::Line lineDoc) const {
+template <typename LINE>
+bool ContractionState<LINE>::GetExpanded(Sci::Line lineDoc) const {
if (OneToOne()) {
return true;
} else {
Check();
- return expanded->ValueAt(lineDoc) == 1;
+ return expanded->ValueAt(static_cast<LINE>(lineDoc)) == 1;
}
}
-bool ContractionState::SetExpanded(Sci::Line lineDoc, bool isExpanded) {
+template <typename LINE>
+bool ContractionState<LINE>::SetExpanded(Sci::Line lineDoc, bool isExpanded) {
if (OneToOne() && isExpanded) {
return false;
} else {
EnsureData();
- if (isExpanded != (expanded->ValueAt(lineDoc) == 1)) {
- expanded->SetValueAt(lineDoc, isExpanded ? 1 : 0);
+ if (isExpanded != (expanded->ValueAt(static_cast<LINE>(lineDoc)) == 1)) {
+ expanded->SetValueAt(static_cast<LINE>(lineDoc), isExpanded ? 1 : 0);
Check();
return true;
} else {
@@ -297,15 +322,16 @@ bool ContractionState::SetExpanded(Sci::Line lineDoc, bool isExpanded) {
}
}
-Sci::Line ContractionState::ContractedNext(Sci::Line lineDocStart) const {
+template <typename LINE>
+Sci::Line ContractionState<LINE>::ContractedNext(Sci::Line lineDocStart) const {
if (OneToOne()) {
return -1;
} else {
Check();
- if (!expanded->ValueAt(lineDocStart)) {
+ if (!expanded->ValueAt(static_cast<LINE>(lineDocStart))) {
return lineDocStart;
} else {
- const Sci::Line lineDocNextChange = expanded->EndRun(lineDocStart);
+ const Sci::Line lineDocNextChange = expanded->EndRun(static_cast<LINE>(lineDocStart));
if (lineDocNextChange < LinesInDoc())
return lineDocNextChange;
else
@@ -314,26 +340,28 @@ Sci::Line ContractionState::ContractedNext(Sci::Line lineDocStart) const {
}
}
-int ContractionState::GetHeight(Sci::Line lineDoc) const {
+template <typename LINE>
+int ContractionState<LINE>::GetHeight(Sci::Line lineDoc) const {
if (OneToOne()) {
return 1;
} else {
- return heights->ValueAt(lineDoc);
+ return heights->ValueAt(static_cast<LINE>(lineDoc));
}
}
// Set the number of display lines needed for this line.
// Return true if this is a change.
-bool ContractionState::SetHeight(Sci::Line lineDoc, int height) {
+template <typename LINE>
+bool ContractionState<LINE>::SetHeight(Sci::Line lineDoc, int height) {
if (OneToOne() && (height == 1)) {
return false;
} else if (lineDoc < LinesInDoc()) {
EnsureData();
if (GetHeight(lineDoc) != height) {
if (GetVisible(lineDoc)) {
- displayLines->InsertText(lineDoc, height - GetHeight(lineDoc));
+ displayLines->InsertText(static_cast<LINE>(lineDoc), height - GetHeight(lineDoc));
}
- heights->SetValueAt(lineDoc, height);
+ heights->SetValueAt(static_cast<LINE>(lineDoc), height);
Check();
return true;
} else {
@@ -345,15 +373,17 @@ bool ContractionState::SetHeight(Sci::Line lineDoc, int height) {
}
}
-void ContractionState::ShowAll() {
- const Sci::Line lines = LinesInDoc();
+template <typename LINE>
+void ContractionState<LINE>::ShowAll() {
+ const LINE lines = static_cast<LINE>(LinesInDoc());
Clear();
linesInDocument = lines;
}
// Debugging checks
-void ContractionState::Check() const {
+template <typename LINE>
+void ContractionState<LINE>::Check() const {
#ifdef CHECK_CORRECTNESS
for (Sci::Line vline = 0; vline < LinesDisplayed(); vline++) {
const Sci::Line lineDoc = DocFromDisplay(vline);
@@ -378,7 +408,7 @@ void ContractionState::Check() const {
namespace Scintilla {
std::unique_ptr<IContractionState> ContractionStateCreate() {
- return std::make_unique<ContractionState>();
+ return std::make_unique<ContractionState<Sci::Line>>();
}
}