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]; } |