diff options
author | Nicolas Catania <niko@google.com> | 2010-02-07 18:56:48 -0800 |
---|---|---|
committer | Nicolas Catania <niko@google.com> | 2010-02-07 18:56:48 -0800 |
commit | 77af30859da3429ae4a13ae5cea2face80c35fa7 (patch) | |
tree | 9dbc82a3243405a6c523264eef10c2c8adfee166 | |
parent | 63ba1ac81156cce2f045229f7ee7843b923006d0 (diff) | |
download | astl-77af30859da3429ae4a13ae5cea2face80c35fa7.tar.gz |
Added at() method to vector.
We use a dummy static field as the returned reference when
the index is out of bound.
-rw-r--r-- | include/vector | 12 | ||||
-rw-r--r-- | tests/test_vector.cpp | 9 |
2 files changed, 21 insertions, 0 deletions
diff --git a/include/vector b/include/vector index 051da1d..b17cc70 100644 --- a/include/vector +++ b/include/vector @@ -132,6 +132,13 @@ class vector // @return A reference to the element. reference operator[](size_type index) { return *(mBegin + index); } + // 'at' is similar to operator[] except that it does check bounds. + const_reference at(const size_type index) const + { return index < mLength ? *( mBegin + index) : sDummy; } + + reference at(const size_type index) + { return index < mLength ? *( mBegin + index) : sDummy; } + iterator begin() { return iterator(mBegin); } iterator end() { return iterator(mBegin + mLength); } @@ -217,6 +224,7 @@ class vector pointer mBegin; size_type mCapacity; size_type mLength; + static value_type sDummy; // at() doen't throw exception and returns mDummy. static const size_type kExponentialFactor = 2; static const size_type kExponentialLimit = 256; static const size_type kLinearIncrement = 256; @@ -234,6 +242,7 @@ class vector // // Invariant: mLength <= mCapacity <= max_size() + template<typename _T> vector<_T>::vector() :mBegin(NULL), mCapacity(0), mLength(0) { } @@ -490,6 +499,9 @@ void vector<_T>::deallocate() free(mBegin); } +// Dummy element returned when at() is out of bound. +template<typename _T> _T vector<_T>::sDummy; + } // namespace std #endif // ANDROID_ASTL_VECTOR__ diff --git a/tests/test_vector.cpp b/tests/test_vector.cpp index 8b85b97..95de15e 100644 --- a/tests/test_vector.cpp +++ b/tests/test_vector.cpp @@ -641,6 +641,14 @@ bool testEraseRange() return true; } +// Valgrind should not barf when we access element out of bound. +bool testAt() { + vector<int> vec; + + vec.at(1000) = 0xdeadbeef; + EXPECT_TRUE(vec.at(1000) == 0xdeadbeef); + return true; +} } // namespace android int main(int argc, char **argv) @@ -659,5 +667,6 @@ int main(int argc, char **argv) FAIL_UNLESS(testCtorDtorForNonPod); FAIL_UNLESS(testEraseElt); FAIL_UNLESS(testEraseRange); + FAIL_UNLESS(testAt); return kPassed; } |