From ec79c307ff36cdcce0e520e67bef69e64a3e19b5 Mon Sep 17 00:00:00 2001 From: Neil Date: Tue, 17 Apr 2018 08:36:15 +1000 Subject: Templatize ContractionState so it can later be switched between 32-bits and 64-bits. --- src/ContractionState.cxx | 168 ++++++++++++++++++++++++++++------------------- 1 file changed, 99 insertions(+), 69 deletions(-) (limited to 'src') 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 class ContractionState final : public IContractionState { // These contain 1 element for every document line. - std::unique_ptr> visible; - std::unique_ptr> expanded; - std::unique_ptr> heights; + std::unique_ptr> visible; + std::unique_ptr> expanded; + std::unique_ptr> heights; std::unique_ptr> foldDisplayTexts; - std::unique_ptr> displayLines; - Sci::Line linesInDocument; + std::unique_ptr> displayLines; + LINE linesInDocument; void EnsureData(); @@ -88,58 +89,66 @@ public: void Check() const; }; -ContractionState::ContractionState() noexcept : linesInDocument(1) { +template +ContractionState::ContractionState() noexcept : linesInDocument(1) { } -ContractionState::~ContractionState() { +template +ContractionState::~ContractionState() { Clear(); } -void ContractionState::EnsureData() { +template +void ContractionState::EnsureData() { if (OneToOne()) { - visible = std::make_unique>(); - expanded = std::make_unique>(); - heights = std::make_unique>(); + visible = std::make_unique>(); + expanded = std::make_unique>(); + heights = std::make_unique>(); foldDisplayTexts = std::make_unique>(); - displayLines = std::make_unique>(4); + displayLines = std::make_unique>(4); InsertLines(0, linesInDocument); } } -void ContractionState::InsertLine(Sci::Line lineDoc) { +template +void ContractionState::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(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(lineDisplay)); + displayLines->InsertText(lineDocCast, 1); } } -void ContractionState::DeleteLine(Sci::Line lineDoc) { +template +void ContractionState::DeleteLine(Sci::Line lineDoc) { if (OneToOne()) { linesInDocument--; } else { + const LINE lineDocCast = static_cast(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 +void ContractionState::Clear() noexcept { visible.reset(); expanded.reset(); heights.reset(); @@ -148,7 +157,8 @@ void ContractionState::Clear() noexcept { linesInDocument = 1; } -Sci::Line ContractionState::LinesInDoc() const { +template +Sci::Line ContractionState::LinesInDoc() const { if (OneToOne()) { return linesInDocument; } else { @@ -156,29 +166,33 @@ Sci::Line ContractionState::LinesInDoc() const { } } -Sci::Line ContractionState::LinesDisplayed() const { +template +Sci::Line ContractionState::LinesDisplayed() const { if (OneToOne()) { return linesInDocument; } else { - return displayLines->PositionFromPartition(LinesInDoc()); + return displayLines->PositionFromPartition(static_cast(LinesInDoc())); } } -Sci::Line ContractionState::DisplayFromDoc(Sci::Line lineDoc) const { +template +Sci::Line ContractionState::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(lineDoc)); } } -Sci::Line ContractionState::DisplayLastFromDoc(Sci::Line lineDoc) const { +template +Sci::Line ContractionState::DisplayLastFromDoc(Sci::Line lineDoc) const { return DisplayFromDoc(lineDoc) + GetHeight(lineDoc) - 1; } -Sci::Line ContractionState::DocFromDisplay(Sci::Line lineDisplay) const { +template +Sci::Line ContractionState::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(LinesDisplayed())); } - const Sci::Line lineDoc = displayLines->PartitionFromPosition(lineDisplay); + const Sci::Line lineDoc = displayLines->PartitionFromPosition(static_cast(lineDisplay)); PLATFORM_ASSERT(GetVisible(lineDoc)); return lineDoc; } } -void ContractionState::InsertLines(Sci::Line lineDoc, Sci::Line lineCount) { +template +void ContractionState::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 +void ContractionState::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 +bool ContractionState::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(lineDoc)) == 1; } } -bool ContractionState::SetVisible(Sci::Line lineDocStart, Sci::Line lineDocEnd, bool isVisible) { +template +bool ContractionState::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)); + const int difference = isVisible ? heightLine : -heightLine; + visible->SetValueAt(static_cast(line), isVisible ? 1 : 0); + displayLines->InsertText(static_cast(line), difference); delta += difference; } } @@ -242,7 +261,8 @@ bool ContractionState::SetVisible(Sci::Line lineDocStart, Sci::Line lineDocEnd, } } -bool ContractionState::HiddenLines() const { +template +bool ContractionState::HiddenLines() const { if (OneToOne()) { return false; } else { @@ -250,16 +270,19 @@ bool ContractionState::HiddenLines() const { } } -const char *ContractionState::GetFoldDisplayText(Sci::Line lineDoc) const { +template +const char *ContractionState::GetFoldDisplayText(Sci::Line lineDoc) const { Check(); return foldDisplayTexts->ValueAt(lineDoc).get(); } -bool ContractionState::GetFoldDisplayTextShown(Sci::Line lineDoc) const { +template +bool ContractionState::GetFoldDisplayTextShown(Sci::Line lineDoc) const { return !GetExpanded(lineDoc) && GetFoldDisplayText(lineDoc); } -bool ContractionState::SetFoldDisplayText(Sci::Line lineDoc, const char *text) { +template +bool ContractionState::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 +bool ContractionState::GetExpanded(Sci::Line lineDoc) const { if (OneToOne()) { return true; } else { Check(); - return expanded->ValueAt(lineDoc) == 1; + return expanded->ValueAt(static_cast(lineDoc)) == 1; } } -bool ContractionState::SetExpanded(Sci::Line lineDoc, bool isExpanded) { +template +bool ContractionState::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(lineDoc)) == 1)) { + expanded->SetValueAt(static_cast(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 +Sci::Line ContractionState::ContractedNext(Sci::Line lineDocStart) const { if (OneToOne()) { return -1; } else { Check(); - if (!expanded->ValueAt(lineDocStart)) { + if (!expanded->ValueAt(static_cast(lineDocStart))) { return lineDocStart; } else { - const Sci::Line lineDocNextChange = expanded->EndRun(lineDocStart); + const Sci::Line lineDocNextChange = expanded->EndRun(static_cast(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 +int ContractionState::GetHeight(Sci::Line lineDoc) const { if (OneToOne()) { return 1; } else { - return heights->ValueAt(lineDoc); + return heights->ValueAt(static_cast(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 +bool ContractionState::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(lineDoc), height - GetHeight(lineDoc)); } - heights->SetValueAt(lineDoc, height); + heights->SetValueAt(static_cast(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 +void ContractionState::ShowAll() { + const LINE lines = static_cast(LinesInDoc()); Clear(); linesInDocument = lines; } // Debugging checks -void ContractionState::Check() const { +template +void ContractionState::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 ContractionStateCreate() { - return std::make_unique(); + return std::make_unique>(); } } -- cgit v1.2.3