aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornyamatongwe <devnull@localhost>2013-05-04 17:49:07 +1000
committernyamatongwe <devnull@localhost>2013-05-04 17:49:07 +1000
commit3c4ee3e6f6344a3933383ed939f49c2f8d57e684 (patch)
treec4d2e063f8cb0471f8d94f09ddcfd772e8031e1a
parent4947d05b57e5d1d009090937ed54ff47da7eb67a (diff)
downloadscintilla-mirror-3c4ee3e6f6344a3933383ed939f49c2f8d57e684.tar.gz
Replacing raw pointers and allocations with std::vector.
-rw-r--r--src/PositionCache.cxx105
-rw-r--r--src/PositionCache.h15
2 files changed, 38 insertions, 82 deletions
diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx
index 759558e73..9fb045636 100644
--- a/src/PositionCache.cxx
+++ b/src/PositionCache.cxx
@@ -207,7 +207,7 @@ int LineLayout::EndLineStyle() const {
}
LineLayoutCache::LineLayoutCache() :
- level(0), length(0), size(0), cache(0),
+ level(0),
allInvalidated(false), styleClock(-1), useCount(0) {
Allocate(0);
}
@@ -216,24 +216,15 @@ LineLayoutCache::~LineLayoutCache() {
Deallocate();
}
-void LineLayoutCache::Allocate(int length_) {
- PLATFORM_ASSERT(cache == NULL);
+void LineLayoutCache::Allocate(size_t length_) {
+ PLATFORM_ASSERT(cache.empty());
allInvalidated = false;
- length = length_;
- size = length;
- if (size > 1) {
- size = (size / 16 + 1) * 16;
- }
- if (size > 0) {
- cache = new LineLayout * [size];
- }
- for (int i = 0; i < size; i++)
- cache[i] = 0;
+ cache.resize(length_);
}
void LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) {
PLATFORM_ASSERT(useCount == 0);
- int lengthForLevel = 0;
+ size_t lengthForLevel = 0;
if (level == llcCaret) {
lengthForLevel = 1;
} else if (level == llcPage) {
@@ -241,35 +232,31 @@ void LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) {
} else if (level == llcDocument) {
lengthForLevel = linesInDoc;
}
- if (lengthForLevel > size) {
+ if (lengthForLevel > cache.size()) {
Deallocate();
Allocate(lengthForLevel);
} else {
- if (lengthForLevel < length) {
- for (int i = lengthForLevel; i < length; i++) {
+ if (lengthForLevel < cache.size()) {
+ for (size_t i = lengthForLevel; i < cache.size(); i++) {
delete cache[i];
cache[i] = 0;
}
}
- length = lengthForLevel;
+ cache.resize(lengthForLevel);
}
- PLATFORM_ASSERT(length == lengthForLevel);
- PLATFORM_ASSERT(cache != NULL || length == 0);
+ PLATFORM_ASSERT(cache.size() == lengthForLevel);
}
void LineLayoutCache::Deallocate() {
PLATFORM_ASSERT(useCount == 0);
- for (int i = 0; i < length; i++)
+ for (size_t i = 0; i < cache.size(); i++)
delete cache[i];
- delete []cache;
- cache = 0;
- length = 0;
- size = 0;
+ cache.clear();
}
void LineLayoutCache::Invalidate(LineLayout::validLevel validity_) {
- if (cache && !allInvalidated) {
- for (int i = 0; i < length; i++) {
+ if (!cache.empty() && !allInvalidated) {
+ for (size_t i = 0; i < cache.size(); i++) {
if (cache[i]) {
cache[i]->Invalidate(validity_);
}
@@ -303,15 +290,15 @@ LineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChar
} else if (level == llcPage) {
if (lineNumber == lineCaret) {
pos = 0;
- } else if (length > 1) {
- pos = 1 + (lineNumber % (length - 1));
+ } else if (cache.size() > 1) {
+ pos = 1 + (lineNumber % (cache.size() - 1));
}
} else if (level == llcDocument) {
pos = lineNumber;
}
if (pos >= 0) {
PLATFORM_ASSERT(useCount == 0);
- if (cache && (pos < length)) {
+ if (!cache.empty() && (pos < static_cast<int>(cache.size()))) {
if (cache[pos]) {
if ((cache[pos]->lineNumber != lineNumber) ||
(cache[pos]->maxLineLength < maxChars)) {
@@ -351,33 +338,18 @@ void LineLayoutCache::Dispose(LineLayout *ll) {
}
void BreakFinder::Insert(int val) {
- // Expand if needed
- if (saeLen >= saeSize) {
- saeSize *= 2;
- int *selAndEdgeNew = new int[saeSize];
- for (unsigned int j = 0; j<saeLen; j++) {
- selAndEdgeNew[j] = selAndEdge[j];
- }
- delete []selAndEdge;
- selAndEdge = selAndEdgeNew;
- }
-
if (val >= nextBreak) {
- for (unsigned int j = 0; j<saeLen; j++) {
- if (val == selAndEdge[j]) {
+ for (std::vector<int>::iterator it = selAndEdge.begin(); it != selAndEdge.end(); ++it) {
+ if (val == *it) {
return;
}
- if (val < selAndEdge[j]) {
- for (unsigned int k = saeLen; k>j; k--) {
- selAndEdge[k] = selAndEdge[k-1];
- }
- saeLen++;
- selAndEdge[j] = val;
+ if (val <*it) {
+ selAndEdge.insert(it, 1, val);
return;
}
}
// Not less than any so append
- selAndEdge[saeLen++] = val;
+ selAndEdge.push_back(val);
}
}
@@ -399,17 +371,11 @@ BreakFinder::BreakFinder(LineLayout *ll_, int lineStart_, int lineEnd_, int posL
lineEnd(lineEnd_),
posLineStart(posLineStart_),
nextBreak(lineStart_),
- saeSize(0),
- saeLen(0),
saeCurrentPos(0),
saeNext(0),
subBreak(-1),
pdoc(pdoc_) {
- saeSize = 8;
- selAndEdge = new int[saeSize];
- for (unsigned int j=0; j < saeSize; j++) {
- selAndEdge[j] = 0;
- }
+ selAndEdge.resize(1);
// Search for first visible break
// First find the first visible character
@@ -447,11 +413,10 @@ BreakFinder::BreakFinder(LineLayout *ll_, int lineStart_, int lineEnd_, int posL
Insert(pos);
}
}
- saeNext = (saeLen > 0) ? selAndEdge[0] : -1;
+ saeNext = (!selAndEdge.empty()) ? selAndEdge[0] : -1;
}
BreakFinder::~BreakFinder() {
- delete []selAndEdge;
}
int BreakFinder::First() const {
@@ -467,7 +432,7 @@ int BreakFinder::Next() {
IsControlCharacter(ll->chars[nextBreak]) || IsControlCharacter(ll->chars[nextBreak + 1])) {
if (nextBreak == saeNext) {
saeCurrentPos++;
- saeNext = (saeLen > saeCurrentPos) ? selAndEdge[saeCurrentPos] : -1;
+ saeNext = (saeCurrentPos < selAndEdge.size()) ? selAndEdge[saeCurrentPos] : -1;
}
nextBreak++;
if ((nextBreak - prev) < lengthStartSubdivision) {
@@ -509,7 +474,7 @@ void PositionCacheEntry::Set(unsigned int styleNumber_, const char *s_,
len = len_;
clock = clock_;
if (s_ && positions_) {
- positions = new XYPOSITION[len + (len + 1) / 2];
+ positions = new XYPOSITION[len + (len / 4) + 1];
for (unsigned int i=0; i<len; i++) {
positions[i] = static_cast<XYPOSITION>(positions_[i]);
}
@@ -566,20 +531,18 @@ void PositionCacheEntry::ResetClock() {
}
PositionCache::PositionCache() {
- size = 0x400;
clock = 1;
- pces = new PositionCacheEntry[size];
+ pces.resize(0x400);
allClear = true;
}
PositionCache::~PositionCache() {
Clear();
- delete []pces;
}
void PositionCache::Clear() {
if (!allClear) {
- for (size_t i=0; i<size; i++) {
+ for (size_t i=0; i<pces.size(); i++) {
pces[i].Clear();
}
}
@@ -589,9 +552,7 @@ void PositionCache::Clear() {
void PositionCache::SetSize(size_t size_) {
Clear();
- delete []pces;
- size = size_;
- pces = new PositionCacheEntry[size];
+ pces.resize(size_);
}
void PositionCache::MeasureWidths(Surface *surface, ViewStyle &vstyle, unsigned int styleNumber,
@@ -599,17 +560,17 @@ void PositionCache::MeasureWidths(Surface *surface, ViewStyle &vstyle, unsigned
allClear = false;
int probe = -1;
- if ((size > 0) && (len < 30)) {
+ if ((!pces.empty()) && (len < 30)) {
// Only store short strings in the cache so it doesn't churn with
// long comments with only a single comment.
// Two way associative: try two probe positions.
int hashValue = PositionCacheEntry::Hash(styleNumber, s, len);
- probe = static_cast<int>(hashValue % size);
+ probe = static_cast<int>(hashValue % pces.size());
if (pces[probe].Retrieve(styleNumber, s, len, positions)) {
return;
}
- int probe2 = static_cast<int>((hashValue * 37) % size);
+ int probe2 = static_cast<int>((hashValue * 37) % pces.size());
if (pces[probe2].Retrieve(styleNumber, s, len, positions)) {
return;
}
@@ -639,7 +600,7 @@ void PositionCache::MeasureWidths(Surface *surface, ViewStyle &vstyle, unsigned
if (clock > 60000) {
// Since there are only 16 bits for the clock, wrap it round and
// reset all cache entries so none get stuck with a high clock.
- for (size_t i=0; i<size; i++) {
+ for (size_t i=0; i<pces.size(); i++) {
pces[i].ResetClock();
}
clock = 2;
diff --git a/src/PositionCache.h b/src/PositionCache.h
index ad3fffd7f..34f237705 100644
--- a/src/PositionCache.h
+++ b/src/PositionCache.h
@@ -73,13 +73,11 @@ public:
*/
class LineLayoutCache {
int level;
- int length;
- int size;
- LineLayout **cache;
+ std::vector<LineLayout *>cache;
bool allInvalidated;
int styleClock;
int useCount;
- void Allocate(int length_);
+ void Allocate(size_t length_);
void AllocateForLevel(int linesOnScreen, int linesInDoc);
public:
LineLayoutCache();
@@ -122,9 +120,7 @@ class BreakFinder {
int lineEnd;
int posLineStart;
int nextBreak;
- int *selAndEdge;
- unsigned int saeSize;
- unsigned int saeLen;
+ std::vector<int> selAndEdge;
unsigned int saeCurrentPos;
int saeNext;
int subBreak;
@@ -146,8 +142,7 @@ public:
};
class PositionCache {
- PositionCacheEntry *pces;
- size_t size;
+ std::vector<PositionCacheEntry> pces;
unsigned int clock;
bool allClear;
// Private so PositionCache objects can not be copied
@@ -157,7 +152,7 @@ public:
~PositionCache();
void Clear();
void SetSize(size_t size_);
- size_t GetSize() const { return size; }
+ size_t GetSize() const { return pces.size(); }
void MeasureWidths(Surface *surface, ViewStyle &vstyle, unsigned int styleNumber,
const char *s, unsigned int len, XYPOSITION *positions, Document *pdoc);
};