add realloc method to SkAutoSTMalloc
BUG=skia: Review URL: https://codereview.chromium.org/1069013002
This commit is contained in:
parent
05e4abae89
commit
f1f8895cbe
@ -216,6 +216,7 @@
|
||||
'../tests/SVGDeviceTest.cpp',
|
||||
'../tests/TessellatingPathRendererTests.cpp',
|
||||
'../tests/TArrayTest.cpp',
|
||||
'../tests/TemplatesTest.cpp',
|
||||
'../tests/TDPQueueTest.cpp',
|
||||
'../tests/Time.cpp',
|
||||
'../tests/TLSTest.cpp',
|
||||
|
@ -411,17 +411,13 @@ private:
|
||||
|
||||
template <size_t N, typename T> class SkAutoSTMalloc : SkNoncopyable {
|
||||
public:
|
||||
SkAutoSTMalloc() {
|
||||
fPtr = NULL;
|
||||
}
|
||||
SkAutoSTMalloc() : fPtr(fTStorage) {}
|
||||
|
||||
SkAutoSTMalloc(size_t count) {
|
||||
if (count > N) {
|
||||
fPtr = (T*)sk_malloc_flags(count * sizeof(T), SK_MALLOC_THROW | SK_MALLOC_TEMP);
|
||||
} else if (count) {
|
||||
fPtr = fTStorage;
|
||||
} else {
|
||||
fPtr = NULL;
|
||||
fPtr = fTStorage;
|
||||
}
|
||||
}
|
||||
|
||||
@ -437,11 +433,9 @@ public:
|
||||
sk_free(fPtr);
|
||||
}
|
||||
if (count > N) {
|
||||
fPtr = (T*)sk_malloc_flags(count * sizeof(T), SK_MALLOC_THROW | SK_MALLOC_TEMP);
|
||||
} else if (count) {
|
||||
fPtr = fTStorage;
|
||||
fPtr = (T*)sk_malloc_throw(count * sizeof(T));
|
||||
} else {
|
||||
fPtr = NULL;
|
||||
fPtr = fTStorage;
|
||||
}
|
||||
return fPtr;
|
||||
}
|
||||
@ -464,6 +458,20 @@ public:
|
||||
return fPtr[index];
|
||||
}
|
||||
|
||||
// Reallocs the array, can be used to shrink the allocation. Makes no attempt to be intelligent
|
||||
void realloc(size_t count) {
|
||||
if (count > N) {
|
||||
if (fPtr == fTStorage) {
|
||||
fPtr = (T*)sk_malloc_throw(count * sizeof(T));
|
||||
memcpy(fPtr, fTStorage, N * sizeof(T));
|
||||
} else {
|
||||
fPtr = (T*)sk_realloc_throw(fPtr, count * sizeof(T));
|
||||
}
|
||||
} else if (fPtr != fTStorage) {
|
||||
fPtr = (T*)sk_realloc_throw(fPtr, count * sizeof(T));
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
T* fPtr;
|
||||
union {
|
||||
|
72
tests/TemplatesTest.cpp
Normal file
72
tests/TemplatesTest.cpp
Normal file
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "SkTemplates.h"
|
||||
#include "Test.h"
|
||||
|
||||
// Tests for some of the helpers in SkTemplates.h
|
||||
static void test_automalloc_realloc(skiatest::Reporter* reporter) {
|
||||
SkAutoSTMalloc<1, int> array;
|
||||
|
||||
// test we have a valid pointer, should not crash
|
||||
array[0] = 1;
|
||||
REPORTER_ASSERT(reporter, array[0] == 1);
|
||||
|
||||
// using realloc for init
|
||||
array.realloc(1);
|
||||
|
||||
array[0] = 1;
|
||||
REPORTER_ASSERT(reporter, array[0] == 1);
|
||||
|
||||
// verify realloc can grow
|
||||
array.realloc(2);
|
||||
REPORTER_ASSERT(reporter, array[0] == 1);
|
||||
|
||||
// realloc can shrink
|
||||
array.realloc(1);
|
||||
REPORTER_ASSERT(reporter, array[0] == 1);
|
||||
|
||||
// should not crash
|
||||
array.realloc(0);
|
||||
|
||||
// grow and shrink again
|
||||
array.realloc(10);
|
||||
for (int i = 0; i < 10; i++) {
|
||||
array[i] = 10 - i;
|
||||
}
|
||||
array.realloc(20);
|
||||
for (int i = 0; i < 10; i++) {
|
||||
REPORTER_ASSERT(reporter, array[i] == 10 - i);
|
||||
}
|
||||
array.realloc(10);
|
||||
for (int i = 0; i < 10; i++) {
|
||||
REPORTER_ASSERT(reporter, array[i] == 10 - i);
|
||||
}
|
||||
|
||||
array.realloc(1);
|
||||
REPORTER_ASSERT(reporter, array[0] = 10);
|
||||
|
||||
// resets mixed with realloc, below stack alloc size
|
||||
array.reset(0);
|
||||
array.realloc(1);
|
||||
array.reset(1);
|
||||
|
||||
array[0] = 1;
|
||||
REPORTER_ASSERT(reporter, array[0] == 1);
|
||||
|
||||
// reset and realloc > stack size
|
||||
array.reset(2);
|
||||
array.realloc(3);
|
||||
array[0] = 1;
|
||||
REPORTER_ASSERT(reporter, array[0] == 1);
|
||||
array.realloc(1);
|
||||
REPORTER_ASSERT(reporter, array[0] == 1);
|
||||
}
|
||||
|
||||
DEF_TEST(Templates, reporter) {
|
||||
test_automalloc_realloc(reporter);
|
||||
}
|
Loading…
Reference in New Issue
Block a user