diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Decoration.cxx | 139 | ||||
| -rw-r--r-- | src/Decoration.h | 4 | ||||
| -rw-r--r-- | src/Document.cxx | 2 | 
3 files changed, 86 insertions, 59 deletions
| diff --git a/src/Decoration.cxx b/src/Decoration.cxx index c650b11dc..b69e05855 100644 --- a/src/Decoration.cxx +++ b/src/Decoration.cxx @@ -28,10 +28,11 @@ using namespace Scintilla;  namespace { +template <typename POS>  class Decoration : public IDecoration {  	int indicator;  public: -	RunStyles<Sci::Position, int> rs; +	RunStyles<POS, int> rs;  	explicit Decoration(int indicator_) : indicator(indicator_) {  	} @@ -48,37 +49,38 @@ public:  		return rs.Length();  	}  	int ValueAt(Sci::Position position) const override { -		return rs.ValueAt(static_cast<Sci::Position>(position)); +		return rs.ValueAt(static_cast<POS>(position));  	}  	Sci::Position StartRun(Sci::Position position) const override { -		return rs.StartRun(static_cast<Sci::Position>(position)); +		return rs.StartRun(static_cast<POS>(position));  	}  	Sci::Position EndRun(Sci::Position position) const override { -		return rs.EndRun(static_cast<Sci::Position>(position)); +		return rs.EndRun(static_cast<POS>(position));  	}  	void SetValueAt(Sci::Position position, int value) override { -		rs.SetValueAt(static_cast<Sci::Position>(position), value); +		rs.SetValueAt(static_cast<POS>(position), value);  	}  	void InsertSpace(Sci::Position position, Sci::Position insertLength) override { -		rs.InsertSpace(static_cast<Sci::Position>(position), static_cast<Sci::Position>(insertLength)); +		rs.InsertSpace(static_cast<POS>(position), static_cast<POS>(insertLength));  	}  	Sci::Position Runs() const override {  		return rs.Runs();  	}  }; +template <typename POS>  class DecorationList : public IDecorationList {  	int currentIndicator;  	int currentValue; -	Decoration *current;	// Cached so FillRange doesn't have to search for each call. +	Decoration<POS> *current;	// Cached so FillRange doesn't have to search for each call.  	Sci::Position lengthDocument;  	// Ordered by indicator -	std::vector<std::unique_ptr<Decoration>> decorationList; +	std::vector<std::unique_ptr<Decoration<POS>>> decorationList;  	std::vector<const IDecoration*> decorationView;	// Read-only view of decorationList  	bool clickNotified; -	Decoration *DecorationFromIndicator(int indicator); -	Decoration *Create(int indicator, Sci::Position length); +	Decoration<POS> *DecorationFromIndicator(int indicator); +	Decoration<POS> *Create(int indicator, Sci::Position length);  	void Delete(int indicator);  	void DeleteAnyEmpty();  	void SetView(); @@ -118,16 +120,19 @@ public:  	}  }; -DecorationList::DecorationList() : currentIndicator(0), currentValue(1), current(nullptr), +template <typename POS> +DecorationList<POS>::DecorationList() : currentIndicator(0), currentValue(1), current(nullptr),  	lengthDocument(0), clickNotified(false) {  } -DecorationList::~DecorationList() { +template <typename POS> +DecorationList<POS>::~DecorationList() {  	current = nullptr;  } -Decoration *DecorationList::DecorationFromIndicator(int indicator) { -	for (const std::unique_ptr<Decoration> &deco : decorationList) { +template <typename POS> +Decoration<POS> *DecorationList<POS>::DecorationFromIndicator(int indicator) { +	for (const std::unique_ptr<Decoration<POS>> &deco : decorationList) {  		if (deco->Indicator() == indicator) {  			return deco.get();  		} @@ -135,17 +140,18 @@ Decoration *DecorationList::DecorationFromIndicator(int indicator) {  	return nullptr;  } -Decoration *DecorationList::Create(int indicator, Sci::Position length) { +template <typename POS> +Decoration<POS> *DecorationList<POS>::Create(int indicator, Sci::Position length) {  	currentIndicator = indicator; -	std::unique_ptr<Decoration> decoNew = std::make_unique<Decoration>(indicator); -	decoNew->rs.InsertSpace(0, length); +	std::unique_ptr<Decoration<POS>> decoNew = std::make_unique<Decoration<POS>>(indicator); +	decoNew->rs.InsertSpace(0, static_cast<POS>(length)); -	std::vector<std::unique_ptr<Decoration>>::iterator it = std::lower_bound( +	typename std::vector<std::unique_ptr<Decoration<POS>>>::iterator it = std::lower_bound(  		decorationList.begin(), decorationList.end(), decoNew, -		[](const std::unique_ptr<Decoration> &a, const std::unique_ptr<Decoration> &b) { +		[](const std::unique_ptr<Decoration<POS>> &a, const std::unique_ptr<Decoration<POS>> &b) {  		return a->Indicator() < b->Indicator();  	}); -	std::vector<std::unique_ptr<Decoration>>::iterator itAdded = +	typename std::vector<std::unique_ptr<Decoration<POS>>>::iterator itAdded =  		decorationList.insert(it, std::move(decoNew));  	SetView(); @@ -153,54 +159,62 @@ Decoration *DecorationList::Create(int indicator, Sci::Position length) {  	return itAdded->get();  } -void DecorationList::Delete(int indicator) { +template <typename POS> +void DecorationList<POS>::Delete(int indicator) {  	decorationList.erase(std::remove_if(decorationList.begin(), decorationList.end(), -		[=](const std::unique_ptr<Decoration> &deco) { +		[=](const std::unique_ptr<Decoration<POS>> &deco) {  		return deco->Indicator() == indicator;  	}), decorationList.end());  	current = nullptr;  	SetView();  } -void DecorationList::SetCurrentIndicator(int indicator) { +template <typename POS> +void DecorationList<POS>::SetCurrentIndicator(int indicator) {  	currentIndicator = indicator;  	current = DecorationFromIndicator(indicator);  	currentValue = 1;  } -void DecorationList::SetCurrentValue(int value) { +template <typename POS> +void DecorationList<POS>::SetCurrentValue(int value) {  	currentValue = value ? value : 1;  } -FillResult<Sci::Position> DecorationList::FillRange(Sci::Position position, int value, Sci::Position fillLength) { +template <typename POS> +FillResult<Sci::Position> DecorationList<POS>::FillRange(Sci::Position position, int value, Sci::Position fillLength) {  	if (!current) {  		current = DecorationFromIndicator(currentIndicator);  		if (!current) {  			current = Create(currentIndicator, lengthDocument);  		}  	} -	const FillResult<Sci::Position> fr = current->rs.FillRange(position, value, fillLength); -	if (current->Empty()) { +	// Converting result from POS to Sci::Position as callers not polymorphic. +	const FillResult<POS> frInPOS = current->rs.FillRange(static_cast<POS>(position), value, static_cast<POS>(fillLength)); +	const FillResult<Sci::Position> fr { frInPOS.changed, frInPOS.position, frInPOS.fillLength }; +		if (current->Empty()) {  		Delete(currentIndicator);  	}  	return fr;  } -void DecorationList::InsertSpace(Sci::Position position, Sci::Position insertLength) { +template <typename POS> +void DecorationList<POS>::InsertSpace(Sci::Position position, Sci::Position insertLength) {  	const bool atEnd = position == lengthDocument;  	lengthDocument += insertLength; -	for (const std::unique_ptr<Decoration> &deco : decorationList) { -		deco->rs.InsertSpace(position, insertLength); +	for (const std::unique_ptr<Decoration<POS>> &deco : decorationList) { +		deco->rs.InsertSpace(static_cast<POS>(position), static_cast<POS>(insertLength));  		if (atEnd) { -			deco->rs.FillRange(position, 0, insertLength); +			deco->rs.FillRange(static_cast<POS>(position), 0, static_cast<POS>(insertLength));  		}  	}  } -void DecorationList::DeleteRange(Sci::Position position, Sci::Position deleteLength) { +template <typename POS> +void DecorationList<POS>::DeleteRange(Sci::Position position, Sci::Position deleteLength) {  	lengthDocument -= deleteLength; -	for (const std::unique_ptr<Decoration> &deco : decorationList) { -		deco->rs.DeleteRange(position, deleteLength); +	for (const std::unique_ptr<Decoration<POS>> &deco : decorationList) { +		deco->rs.DeleteRange(static_cast<POS>(position), static_cast<POS>(deleteLength));  	}  	DeleteAnyEmpty();  	if (decorationList.size() != decorationView.size()) { @@ -210,37 +224,41 @@ void DecorationList::DeleteRange(Sci::Position position, Sci::Position deleteLen  	}  } -void DecorationList::DeleteLexerDecorations() { +template <typename POS> +void DecorationList<POS>::DeleteLexerDecorations() {  	decorationList.erase(std::remove_if(decorationList.begin(), decorationList.end(), -		[=](const std::unique_ptr<Decoration> &deco) { +		[=](const std::unique_ptr<Decoration<POS>> &deco) {  		return deco->Indicator() < INDIC_CONTAINER;  	}), decorationList.end());  	current = nullptr;  	SetView();  } -void DecorationList::DeleteAnyEmpty() { +template <typename POS> +void DecorationList<POS>::DeleteAnyEmpty() {  	if (lengthDocument == 0) {  		decorationList.clear();  	} else {  		decorationList.erase(std::remove_if(decorationList.begin(), decorationList.end(), -			[=](const std::unique_ptr<Decoration> &deco) { +			[=](const std::unique_ptr<Decoration<POS>> &deco) {  			return deco->Empty();  		}), decorationList.end());  	}  } -void DecorationList::SetView() { +template <typename POS> +void DecorationList<POS>::SetView() {  	decorationView.clear(); -	for (const std::unique_ptr<Decoration> &deco : decorationList) { +	for (const std::unique_ptr<Decoration<POS>> &deco : decorationList) {  		decorationView.push_back(deco.get());  	}  } -int DecorationList::AllOnFor(Sci::Position position) const { +template <typename POS> +int DecorationList<POS>::AllOnFor(Sci::Position position) const {  	int mask = 0; -	for (const std::unique_ptr<Decoration> &deco : decorationList) { -		if (deco->rs.ValueAt(position)) { +	for (const std::unique_ptr<Decoration<POS>> &deco : decorationList) { +		if (deco->rs.ValueAt(static_cast<POS>(position))) {  			if (deco->Indicator() < INDIC_IME) {  				mask |= 1 << deco->Indicator();  			} @@ -249,26 +267,29 @@ int DecorationList::AllOnFor(Sci::Position position) const {  	return mask;  } -int DecorationList::ValueAt(int indicator, Sci::Position position) { -	const Decoration *deco = DecorationFromIndicator(indicator); +template <typename POS> +int DecorationList<POS>::ValueAt(int indicator, Sci::Position position) { +	const Decoration<POS> *deco = DecorationFromIndicator(indicator);  	if (deco) { -		return deco->rs.ValueAt(position); +		return deco->rs.ValueAt(static_cast<POS>(position));  	}  	return 0;  } -Sci::Position DecorationList::Start(int indicator, Sci::Position position) { -	const Decoration *deco = DecorationFromIndicator(indicator); +template <typename POS> +Sci::Position DecorationList<POS>::Start(int indicator, Sci::Position position) { +	const Decoration<POS> *deco = DecorationFromIndicator(indicator);  	if (deco) { -		return deco->rs.StartRun(position); +		return deco->rs.StartRun(static_cast<POS>(position));  	}  	return 0;  } -Sci::Position DecorationList::End(int indicator, Sci::Position position) { -	const Decoration *deco = DecorationFromIndicator(indicator); +template <typename POS> +Sci::Position DecorationList<POS>::End(int indicator, Sci::Position position) { +	const Decoration<POS> *deco = DecorationFromIndicator(indicator);  	if (deco) { -		return deco->rs.EndRun(position); +		return deco->rs.EndRun(static_cast<POS>(position));  	}  	return 0;  } @@ -277,12 +298,18 @@ Sci::Position DecorationList::End(int indicator, Sci::Position position) {  namespace Scintilla { -std::unique_ptr<IDecoration> DecorationCreate(int indicator) { -	return std::make_unique<Decoration>(indicator); +std::unique_ptr<IDecoration> DecorationCreate(bool largeDocument, int indicator) { +	if (largeDocument) +		return std::make_unique<Decoration<Sci::Position>>(indicator); +	else +		return std::make_unique<Decoration<int>>(indicator);  } -std::unique_ptr<IDecorationList> DecorationListCreate() { -	return std::make_unique<DecorationList>(); +std::unique_ptr<IDecorationList> DecorationListCreate(bool largeDocument) { +	if (largeDocument) +		return std::make_unique<DecorationList<Sci::Position>>(); +	else +		return std::make_unique<DecorationList<int>>();  }  } diff --git a/src/Decoration.h b/src/Decoration.h index 76f00ec55..1461f2f98 100644 --- a/src/Decoration.h +++ b/src/Decoration.h @@ -50,9 +50,9 @@ public:  	virtual void SetClickNotified(bool notified) = 0;  }; -std::unique_ptr<IDecoration> DecorationCreate(int indicator); +std::unique_ptr<IDecoration> DecorationCreate(bool largeDocument, int indicator); -std::unique_ptr<IDecorationList> DecorationListCreate(); +std::unique_ptr<IDecorationList> DecorationListCreate(bool largeDocument);  } diff --git a/src/Document.cxx b/src/Document.cxx index 9a420133b..09a91d469 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -113,7 +113,7 @@ Document::Document(int options) :  	perLineData[ldMargin] = std::make_unique<LineAnnotation>();  	perLineData[ldAnnotation] = std::make_unique<LineAnnotation>(); -	decorations = DecorationListCreate(); +	decorations = DecorationListCreate(false);  	cb.SetPerLine(this);  } | 
