diff options
Diffstat (limited to 'src/PositionCache.cxx')
-rw-r--r-- | src/PositionCache.cxx | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx index 87fa544cd..bf7c4623a 100644 --- a/src/PositionCache.cxx +++ b/src/PositionCache.cxx @@ -57,9 +57,9 @@ void BidiData::Resize(size_t maxLineLength_) { widthReprs.resize(maxLineLength_ + 1); } -LineLayout::LineLayout(int maxLineLength_) : +LineLayout::LineLayout(Sci::Line lineNumber_, int maxLineLength_) : lenLineStarts(0), - lineNumber(-1), + lineNumber(lineNumber_), inCache(false), maxLineLength(-1), numCharsInLine(0), @@ -117,6 +117,14 @@ void LineLayout::Invalidate(ValidLevel validity_) noexcept { validity = validity_; } +Sci::Line LineLayout::LineNumber() const noexcept { + return lineNumber; +} + +bool LineLayout::CanHold(Sci::Line lineDoc, int lineLength_) const noexcept { + return (lineNumber == lineDoc) && (lineLength_ <= maxLineLength); +} + int LineLayout::LineStart(int line) const noexcept { if (line <= 0) { return 0; @@ -458,22 +466,20 @@ LineLayout *LineLayoutCache::Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, } if (pos < cache.size()) { - if (cache[pos] && - ((cache[pos]->lineNumber != lineNumber) || (cache[pos]->maxLineLength < maxChars))) { + if (cache[pos] && !cache[pos]->CanHold(lineNumber, maxChars)) { cache[pos].reset(); } if (!cache[pos]) { - cache[pos] = std::make_unique<LineLayout>(maxChars); + cache[pos] = std::make_unique<LineLayout>(lineNumber, maxChars); } - cache[pos]->lineNumber = lineNumber; cache[pos]->inCache = true; -#ifdef CHECK_LLC_UNIQUE +#ifndef CHECK_LLC_UNIQUE // Expensive check that there is only one entry for any line number std::vector<bool> linesInCache(linesInDoc); for (const auto &entry : cache) { if (entry) { - PLATFORM_ASSERT(!linesInCache[entry->lineNumber]); - linesInCache[entry->lineNumber] = true; + PLATFORM_ASSERT(!linesInCache[entry->LineNumber()]); + linesInCache[entry->LineNumber()] = true; } } #endif @@ -482,9 +488,7 @@ LineLayout *LineLayoutCache::Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, } // Only reach here for level == Cache::none - LineLayout *ret = new LineLayout(maxChars); - ret->lineNumber = lineNumber; - return ret; + return new LineLayout(lineNumber, maxChars); } void LineLayoutCache::Dispose(LineLayout *ll) noexcept { |