diff options
Diffstat (limited to 'src/PositionCache.cxx')
| -rw-r--r-- | src/PositionCache.cxx | 58 | 
1 files changed, 22 insertions, 36 deletions
| diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx index c302f8581..b6e6c375c 100644 --- a/src/PositionCache.cxx +++ b/src/PositionCache.cxx @@ -46,7 +46,6 @@ using namespace Scintilla;  #endif  LineLayout::LineLayout(int maxLineLength_) : -	lineStarts(0),  	lenLineStarts(0),  	lineNumber(-1),  	inCache(false), @@ -58,9 +57,6 @@ LineLayout::LineLayout(int maxLineLength_) :  	highlightColumn(false),  	containsCaret(false),  	edgeColumn(0), -	chars(0), -	styles(0), -	positions(0),  	hotspot(0,0),  	widthLine(wrapWidthInfinite),  	lines(1), @@ -77,24 +73,20 @@ LineLayout::~LineLayout() {  void LineLayout::Resize(int maxLineLength_) {  	if (maxLineLength_ > maxLineLength) {  		Free(); -		chars = new char[maxLineLength_ + 1]; -		styles = new unsigned char[maxLineLength_ + 1]; +		chars.reset(new char[maxLineLength_ + 1]); +		styles.reset(new unsigned char[maxLineLength_ + 1]);  		// Extra position allocated as sometimes the Windows  		// GetTextExtentExPoint API writes an extra element. -		positions = new XYPOSITION[maxLineLength_ + 1 + 1]; +		positions.reset(new XYPOSITION[maxLineLength_ + 1 + 1]);  		maxLineLength = maxLineLength_;  	}  }  void LineLayout::Free() { -	delete []chars; -	chars = 0; -	delete []styles; -	styles = 0; -	delete []positions; -	positions = 0; -	delete []lineStarts; -	lineStarts = 0; +	chars.reset(); +	styles.reset(); +	positions.reset(); +	lineStarts.reset();  }  void LineLayout::Invalidate(validLevel validity_) { @@ -141,8 +133,7 @@ void LineLayout::SetLineStart(int line, int start) {  			else  				newLineStarts[i] = 0;  		} -		delete []lineStarts; -		lineStarts = newLineStarts; +		lineStarts.reset(newLineStarts);  		lenLineStarts = newMaxLines;  	}  	lineStarts[line] = start; @@ -282,8 +273,7 @@ void LineLayoutCache::AllocateForLevel(Sci::Line linesOnScreen, Sci::Line linesI  	} else {  		if (lengthForLevel < cache.size()) {  			for (size_t i = lengthForLevel; i < cache.size(); i++) { -				delete cache[i]; -				cache[i] = 0; +				cache[i].reset();  			}  		}  		cache.resize(lengthForLevel); @@ -293,14 +283,12 @@ void LineLayoutCache::AllocateForLevel(Sci::Line linesOnScreen, Sci::Line linesI  void LineLayoutCache::Deallocate() {  	PLATFORM_ASSERT(useCount == 0); -	for (LineLayout *ll : cache) -		delete ll;  	cache.clear();  }  void LineLayoutCache::Invalidate(LineLayout::validLevel validity_) {  	if (!cache.empty() && !allInvalidated) { -		for (LineLayout *ll : cache) { +		for (const std::unique_ptr<LineLayout> &ll : cache) {  			if (ll) {  				ll->Invalidate(validity_);  			} @@ -346,16 +334,15 @@ LineLayout *LineLayoutCache::Retrieve(Sci::Line lineNumber, Sci::Line lineCaret,  			if (cache[pos]) {  				if ((cache[pos]->lineNumber != lineNumber) ||  				        (cache[pos]->maxLineLength < maxChars)) { -					delete cache[pos]; -					cache[pos] = 0; +					cache[pos].reset();  				}  			}  			if (!cache[pos]) { -				cache[pos] = new LineLayout(maxChars); +				cache[pos].reset(new LineLayout(maxChars));  			}  			cache[pos]->lineNumber = lineNumber;  			cache[pos]->inCache = true; -			ret = cache[pos]; +			ret = cache[pos].get();  			useCount++;  		}  	} @@ -507,10 +494,10 @@ TextSegment BreakFinder::Next() {  		while (nextBreak < lineRange.end) {  			int charWidth = 1;  			if (encodingFamily == efUnicode) -				charWidth = UTF8DrawBytes(reinterpret_cast<unsigned char *>(ll->chars) + nextBreak, lineRange.end - nextBreak); +				charWidth = UTF8DrawBytes(reinterpret_cast<unsigned char *>(&ll->chars[nextBreak]), lineRange.end - nextBreak);  			else if (encodingFamily == efDBCS)  				charWidth = pdoc->IsDBCSLeadByte(ll->chars[nextBreak]) ? 2 : 1; -			const Representation *repr = preprs->RepresentationFromCharacter(ll->chars + nextBreak, charWidth); +			const Representation *repr = preprs->RepresentationFromCharacter(&ll->chars[nextBreak], charWidth);  			if (((nextBreak > 0) && (ll->styles[nextBreak] != ll->styles[nextBreak - 1])) ||  					repr ||  					(nextBreak == saeNext)) { @@ -546,7 +533,7 @@ TextSegment BreakFinder::Next() {  		subBreak = -1;  		return TextSegment(startSegment, nextBreak - startSegment);  	} else { -		subBreak += pdoc->SafeSegment(ll->chars + subBreak, nextBreak-subBreak, lengthEachSubdivision); +		subBreak += pdoc->SafeSegment(&ll->chars[subBreak], nextBreak-subBreak, lengthEachSubdivision);  		if (subBreak >= nextBreak) {  			subBreak = -1;  			return TextSegment(startSegment, nextBreak - startSegment); @@ -569,8 +556,8 @@ PositionCacheEntry::PositionCacheEntry(const PositionCacheEntry &other) :  	styleNumber(other.styleNumber), len(other.styleNumber), clock(other.styleNumber), positions(nullptr) {  	if (other.positions) {  		const size_t lenData = len + (len / sizeof(XYPOSITION)) + 1; -		positions = new XYPOSITION[lenData]; -		memcpy(positions, other.positions, lenData * sizeof(XYPOSITION)); +		positions.reset(new XYPOSITION[lenData]); +		memcpy(positions.get(), other.positions.get(), lenData * sizeof(XYPOSITION));  	}  } @@ -581,11 +568,11 @@ void PositionCacheEntry::Set(unsigned int styleNumber_, const char *s_,  	len = len_;  	clock = clock_;  	if (s_ && positions_) { -		positions = new XYPOSITION[len + (len / sizeof(XYPOSITION)) + 1]; +		positions.reset(new XYPOSITION[len + (len / sizeof(XYPOSITION)) + 1]);  		for (unsigned int i=0; i<len; i++) {  			positions[i] = positions_[i];  		} -		memcpy(positions + len, s_, len); +		memcpy(&positions[len], s_, len);  	}  } @@ -594,8 +581,7 @@ PositionCacheEntry::~PositionCacheEntry() {  }  void PositionCacheEntry::Clear() { -	delete []positions; -	positions = nullptr; +	positions.reset();  	styleNumber = 0;  	len = 0;  	clock = 0; @@ -604,7 +590,7 @@ void PositionCacheEntry::Clear() {  bool PositionCacheEntry::Retrieve(unsigned int styleNumber_, const char *s_,  	unsigned int len_, XYPOSITION *positions_) const {  	if ((styleNumber == styleNumber_) && (len == len_) && -		(memcmp(positions + len, s_, len)== 0)) { +		(memcmp(&positions[len], s_, len)== 0)) {  		for (unsigned int i=0; i<len; i++) {  			positions_[i] = positions[i];  		} | 
