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>>();  }  } | 
