diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ContractionState.cxx | 168 |
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>>(); } } |