diff options
author | Max Horn | 2009-05-26 11:28:38 +0000 |
---|---|---|
committer | Max Horn | 2009-05-26 11:28:38 +0000 |
commit | 94dfc8f6386ebf0f4a13094e68eaec289a974347 (patch) | |
tree | 06c3e53c20f2c43cec51c9481a0e9227e79fc3e1 /test | |
parent | ae378632cd4c28bc9d598aa05b1fe4365f7f1023 (diff) | |
download | scummvm-rg350-94dfc8f6386ebf0f4a13094e68eaec289a974347.tar.gz scummvm-rg350-94dfc8f6386ebf0f4a13094e68eaec289a974347.tar.bz2 scummvm-rg350-94dfc8f6386ebf0f4a13094e68eaec289a974347.zip |
Fixed a bug in Common::Array (including a unit test for it), and changed the way the internal storage growth over time.
The bug could result in incorrect results when using push_back (or insert_at)
to insert data from an array into itself if this insertions would cause the
internal array storage to grow. Also added a unit test for this bug.
Furthermore, if the internal storage needs to grow, it will now be resized to the next power of two,
instead of being increased by 32.
svn-id: r40907
Diffstat (limited to 'test')
-rw-r--r-- | test/common/array.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/test/common/array.h b/test/common/array.h index cb793004a4..bce4e8cba1 100644 --- a/test/common/array.h +++ b/test/common/array.h @@ -124,6 +124,29 @@ class ArrayTestSuite : public CxxTest::TestSuite TS_ASSERT_EQUALS(array2.size(), (unsigned int)3); } + struct SafeInt { + int val; + SafeInt() : val(0) {} + SafeInt(int v) : val(v) {} + ~SafeInt() { val = -1; } + bool operator==(int v) { + return val == v; + } + }; + + void test_push_back_ex() { + // This test makes sure that inserting an element invalidates + // references/iterators/pointers to elements in the array itself + // only *after* their value has been copied. + Common::Array<SafeInt> array; + + array.push_back(42); + for (int i = 0; i < 40; ++i) { + array.push_back(array[0]); + TS_ASSERT_EQUALS(array[i], 42); + } + } + void test_copy_constructor() { Common::Array<int> array1; |