From 36e4a162b950bcee61f0fe27cbacd3e85a7bdb55 Mon Sep 17 00:00:00 2001 From: Neil Date: Thu, 1 Feb 2018 09:22:14 +1100 Subject: Templatize RunStyles so it can be over ranges of different types and contain different style types. Currently only instantiated over . --- src/ContractionState.cxx | 6 +-- src/ContractionState.h | 6 +-- src/Decoration.h | 2 +- src/RunStyles.cxx | 120 ++++++++++++++++++++++++++------------------ src/RunStyles.h | 39 +++++++------- test/unit/testRunStyles.cxx | 2 +- 6 files changed, 100 insertions(+), 75 deletions(-) diff --git a/src/ContractionState.cxx b/src/ContractionState.cxx index a9db134bc..8777e4af9 100644 --- a/src/ContractionState.cxx +++ b/src/ContractionState.cxx @@ -35,9 +35,9 @@ ContractionState::~ContractionState() { void ContractionState::EnsureData() { if (OneToOne()) { - visible.reset(new RunStyles()); - expanded.reset(new RunStyles()); - heights.reset(new RunStyles()); + visible.reset(new RunStyles()); + expanded.reset(new RunStyles()); + heights.reset(new RunStyles()); foldDisplayTexts.reset(new SparseVector()); displayLines.reset(new Partitioning(4)); InsertLines(0, linesInDocument); diff --git a/src/ContractionState.h b/src/ContractionState.h index 44a531ca5..7f11196ea 100644 --- a/src/ContractionState.h +++ b/src/ContractionState.h @@ -17,9 +17,9 @@ class SparseVector; */ class ContractionState { // 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; diff --git a/src/Decoration.h b/src/Decoration.h index ab9912935..79ee9ef73 100644 --- a/src/Decoration.h +++ b/src/Decoration.h @@ -12,7 +12,7 @@ namespace Scintilla { class Decoration { int indicator; public: - RunStyles rs; + RunStyles rs; explicit Decoration(int indicator_); ~Decoration(); diff --git a/src/RunStyles.cxx b/src/RunStyles.cxx index a365df6e9..f3939bbd2 100644 --- a/src/RunStyles.cxx +++ b/src/RunStyles.cxx @@ -26,8 +26,9 @@ using namespace Scintilla; // Find the first run at a position -int RunStyles::RunFromPosition(int position) const { - int run = starts->PartitionFromPosition(position); +template +DISTANCE RunStyles::RunFromPosition(DISTANCE position) const { + DISTANCE run = starts->PartitionFromPosition(position); // Go to first element with this position while ((run > 0) && (position == starts->PositionFromPartition(run-1))) { run--; @@ -36,11 +37,12 @@ int RunStyles::RunFromPosition(int position) const { } // If there is no run boundary at position, insert one continuing style. -int RunStyles::SplitRun(int position) { - int run = RunFromPosition(position); - const int posRun = starts->PositionFromPartition(run); +template +DISTANCE RunStyles::SplitRun(DISTANCE position) { + DISTANCE run = RunFromPosition(position); + const DISTANCE posRun = starts->PositionFromPartition(run); if (posRun < position) { - int runStyle = ValueAt(position); + STYLE runStyle = ValueAt(position); run++; starts->InsertPartition(run, position); styles->InsertValue(run, 1, runStyle); @@ -48,12 +50,14 @@ int RunStyles::SplitRun(int position) { return run; } -void RunStyles::RemoveRun(int run) { +template +void RunStyles::RemoveRun(DISTANCE run) { starts->RemovePartition(run); styles->DeleteRange(run, 1); } -void RunStyles::RemoveRunIfEmpty(int run) { +template +void RunStyles::RemoveRunIfEmpty(DISTANCE run) { if ((run < starts->Partitions()) && (starts->Partitions() > 1)) { if (starts->PositionFromPartition(run) == starts->PositionFromPartition(run+1)) { RemoveRun(run); @@ -61,7 +65,8 @@ void RunStyles::RemoveRunIfEmpty(int run) { } } -void RunStyles::RemoveRunIfSameAsPrevious(int run) { +template +void RunStyles::RemoveRunIfSameAsPrevious(DISTANCE run) { if ((run > 0) && (run < starts->Partitions())) { if (styles->ValueAt(run-1) == styles->ValueAt(run)) { RemoveRun(run); @@ -69,30 +74,35 @@ void RunStyles::RemoveRunIfSameAsPrevious(int run) { } } -RunStyles::RunStyles() { - starts.reset(new Partitioning(8)); - styles.reset(new SplitVector()); +template +RunStyles::RunStyles() { + starts.reset(new Partitioning(8)); + styles.reset(new SplitVector