diff options
Diffstat (limited to 'test/source/TestRingBuffer.cpp')
-rw-r--r-- | test/source/TestRingBuffer.cpp | 1139 |
1 files changed, 0 insertions, 1139 deletions
diff --git a/test/source/TestRingBuffer.cpp b/test/source/TestRingBuffer.cpp deleted file mode 100644 index d640380..0000000 --- a/test/source/TestRingBuffer.cpp +++ /dev/null @@ -1,1139 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Copyright (c) Electronic Arts Inc. All rights reserved. -///////////////////////////////////////////////////////////////////////////// - - -#include "EASTLTest.h" -#include <EASTL/bonus/ring_buffer.h> -#include <EASTL/bonus/fixed_ring_buffer.h> -#include <EASTL/vector.h> -#include <EASTL/deque.h> -#include <EASTL/string.h> -#include <EASTL/list.h> -#include <EASTL/fixed_vector.h> -#include <EASTL/fixed_string.h> - - - -using namespace eastl; - - -// Template instantations. -// These tell the compiler to compile all the functions for the given class. -template class eastl::ring_buffer< int, eastl::vector<int> >; -template class eastl::ring_buffer< Align64, eastl::vector<Align64> >; -template class eastl::ring_buffer< TestObject, eastl::vector<TestObject> >; - -template class eastl::ring_buffer< int, eastl::deque<int> >; -template class eastl::ring_buffer< Align64, eastl::deque<Align64> >; -template class eastl::ring_buffer< TestObject, eastl::deque<TestObject> >; - -template class eastl::ring_buffer< int, eastl::list<int> >; -template class eastl::ring_buffer< Align64, eastl::list<Align64> >; -template class eastl::ring_buffer< TestObject, eastl::list<TestObject> >; - -// TODO(rparolin): To consider adding support for eastl::array. -// template class eastl::ring_buffer< int, eastl::array<int, 64>>; - -typedef eastl::fixed_string<char, 256, false> RBFixedString; -typedef eastl::fixed_vector<RBFixedString, 100, false> RBFixedStringVector; -typedef RBFixedStringVector::overflow_allocator_type RBFixedStringVectorOverflowAllocator; -template class eastl::ring_buffer<RBFixedString, RBFixedStringVector, RBFixedStringVectorOverflowAllocator>; - -typedef eastl::fixed_vector<int, 100, false> RBFixedIntVector; -template class eastl::ring_buffer<int, RBFixedIntVector, RBFixedIntVector::overflow_allocator_type>; -// template class eastl::ring_buffer<int, RBFixedIntVector>; // currently fails to compile - -typedef eastl::fixed_vector<int, 100> RBFixedIntVectorWithOverFlow; -template class eastl::ring_buffer<int, RBFixedIntVectorWithOverFlow, RBFixedIntVectorWithOverFlow::overflow_allocator_type>; -// template class eastl::ring_buffer<int, RBFixedIntVectorWithOverFlow>; // currently fails to compile - - - -int TestRingBuffer() -{ - int nErrorCount = 0; - - // GCC prior to 4.1 has a fatal code generation bug in string arrays, which we use below. - #if !defined(EA_DEBUG) && defined(__GNUC__) && !defined(__EDG__) && (((__GNUC__ * 100) + __GNUC_MINOR__) < 401) - return nErrorCount; - #endif - - { // regression for bug in the capacity() function for the case of capacity == 0. - - vector<int> emptyIntArray; - ring_buffer<int, vector<int> > intRingBuffer(emptyIntArray); - - EATEST_VERIFY(intRingBuffer.validate()); - EATEST_VERIFY(intRingBuffer.capacity() == 0); - - intRingBuffer.resize(0); - EATEST_VERIFY(intRingBuffer.validate()); - EATEST_VERIFY(intRingBuffer.size() == 0); - - intRingBuffer.resize(1); - EATEST_VERIFY(intRingBuffer.validate()); - EATEST_VERIFY(intRingBuffer.size() == 1); - } - - { - EA::UnitTest::Rand rng(EA::UnitTest::GetRandSeed()); - - typedef ring_buffer< string, vector<string> > RBVectorString; - - int counter = 0; - char counterBuffer[32]; - - // explicit ring_buffer(size_type size = 0); - const int kOriginalCapacity = 50; - RBVectorString rbVectorString(50); - - // bool empty() const; - // size_type size() const; - // bool validate() const; - EATEST_VERIFY(rbVectorString.validate()); - EATEST_VERIFY(rbVectorString.empty()); - EATEST_VERIFY(rbVectorString.size() == 0); - EATEST_VERIFY(rbVectorString.capacity() == 50); - - // void clear(); - rbVectorString.clear(); - EATEST_VERIFY(rbVectorString.validate()); - EATEST_VERIFY(rbVectorString.empty()); - EATEST_VERIFY(rbVectorString.size() == 0); - EATEST_VERIFY(rbVectorString.capacity() == 50); - - // container_type& get_container(); - RBVectorString::container_type& c = rbVectorString.get_container(); - EATEST_VERIFY(c.size() == (kOriginalCapacity + 1)); // We need to add one because the ring_buffer mEnd is necessarily an unused element. - - // iterator begin(); - // iterator end(); - // int validate_iterator(const_iterator i) const; - RBVectorString::iterator it = rbVectorString.begin(); - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current)); - - while(it != rbVectorString.end()) // This loop should do nothing. - { - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current)); - ++it; - } - - // void push_back(const value_type& value); - sprintf(counterBuffer, "%d", counter++); - rbVectorString.push_back(string(counterBuffer)); - EATEST_VERIFY(rbVectorString.validate()); - EATEST_VERIFY(!rbVectorString.empty()); - EATEST_VERIFY(rbVectorString.size() == 1); - EATEST_VERIFY(rbVectorString.capacity() == 50); - - it = rbVectorString.begin(); - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - EATEST_VERIFY(*it == "0"); - - // reference front(); - // reference back(); - string& sFront = rbVectorString.front(); - string& sBack = rbVectorString.back(); - EATEST_VERIFY(&sFront == &sBack); - - // void push_back(); - string& ref = rbVectorString.push_back(); - EATEST_VERIFY(rbVectorString.validate()); - EATEST_VERIFY(rbVectorString.size() == 2); - EATEST_VERIFY(rbVectorString.capacity() == 50); - EATEST_VERIFY(&ref == &rbVectorString.back()); - - it = rbVectorString.begin(); - ++it; - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - EATEST_VERIFY(it->empty()); - - sprintf(counterBuffer, "%d", counter++); - *it = counterBuffer; - EATEST_VERIFY(*it == "1"); - - ++it; - EATEST_VERIFY(it == rbVectorString.end()); - - it = rbVectorString.begin(); - while(it != rbVectorString.end()) - { - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - ++it; - } - - // reference operator[](size_type n); - string& s0 = rbVectorString[0]; - EATEST_VERIFY(s0 == "0"); - - string& s1 = rbVectorString[1]; - EATEST_VERIFY(s1 == "1"); - - // Now we start hammering the ring buffer with push_back. - for(eastl_size_t i = 0, iEnd = rbVectorString.capacity() * 5; i != iEnd; i++) - { - sprintf(counterBuffer, "%d", counter++); - rbVectorString.push_back(string(counterBuffer)); - EATEST_VERIFY(rbVectorString.validate()); - } - - int counterCheck = counter - 1; - char counterCheckBuffer[32]; - sprintf(counterCheckBuffer, "%d", counterCheck); - EATEST_VERIFY(rbVectorString.back() == counterCheckBuffer); - - // reverse_iterator rbegin(); - // reverse_iterator rend(); - for(RBVectorString::reverse_iterator ri = rbVectorString.rbegin(); ri != rbVectorString.rend(); ++ri) - { - sprintf(counterCheckBuffer, "%d", counterCheck--); - EATEST_VERIFY(*ri == counterCheckBuffer); - } - - ++counterCheck; - - // iterator begin(); - // iterator end(); - for(RBVectorString::iterator i = rbVectorString.begin(); i != rbVectorString.end(); ++i) - { - EATEST_VERIFY(rbVectorString.validate_iterator(i) == (isf_valid | isf_current | isf_can_dereference)); - EATEST_VERIFY(*i == counterCheckBuffer); - sprintf(counterCheckBuffer, "%d", ++counterCheck); - } - - // void clear(); - rbVectorString.clear(); - EATEST_VERIFY(rbVectorString.validate()); - EATEST_VERIFY(rbVectorString.empty()); - EATEST_VERIFY(rbVectorString.size() == 0); - EATEST_VERIFY(rbVectorString.capacity() == 50); - - // Random operations - // Not easy to test the expected values without some tedium. - for(int j = 0; j < 10000 + (gEASTL_TestLevel * 10000); j++) - { - sprintf(counterBuffer, "%d", counter++); - - const eastl_size_t op = rng.RandLimit(12); - const eastl_size_t s = rbVectorString.size(); - - if(op == 0) - { - // void push_back(const value_type& value); - - rbVectorString.push_back(string(counterBuffer)); - EATEST_VERIFY(rbVectorString.size() == eastl::min(s + 1, rbVectorString.capacity())); - } - else if(op == 1) - { - // void push_back(); - - string& ref2 = rbVectorString.push_back(); - rbVectorString.back() = string(counterBuffer); - EATEST_VERIFY(rbVectorString.size() == eastl::min(s + 1, rbVectorString.capacity())); - EATEST_VERIFY(&ref2 == &rbVectorString.back()); - } - else if(op == 2) - { - // void pop_back(); - - if(!rbVectorString.empty()) - { - rbVectorString.pop_back(); - EATEST_VERIFY(rbVectorString.size() == (s - 1)); - } - } - else if(op == 3) - { - // void push_front(const value_type& value); - - rbVectorString.push_front(string(counterBuffer)); - EATEST_VERIFY(rbVectorString.size() == eastl::min(s + 1, rbVectorString.capacity())); - } - else if(op == 4) - { - // void push_front(); - - string& ref2 = rbVectorString.push_front(); - rbVectorString.front() = string(counterBuffer); - EATEST_VERIFY(rbVectorString.size() == eastl::min(s + 1, rbVectorString.capacity())); - EATEST_VERIFY(&ref2 == &rbVectorString.front()); - } - else if(op == 5) - { - // void pop_front(); - - if(!rbVectorString.empty()) - { - rbVectorString.pop_front(); - EATEST_VERIFY(rbVectorString.size() == (s - 1)); - } - } - else if(op == 6) - { - // iterator insert(iterator position, const value_type& value); - - it = rbVectorString.begin(); - const eastl_size_t dist = rng.RandLimit((uint32_t)s + 1); - eastl::advance(it, dist); - - if(it == rbVectorString.end()) - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current)); - else - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - - rbVectorString.insert(it, string(counterBuffer)); - EATEST_VERIFY(rbVectorString.size() == eastl::min(s + 1, rbVectorString.capacity())); - } - else if(op == 7) - { - // void insert(iterator position, size_type n, const value_type& value); - - it = rbVectorString.begin(); - const eastl_size_t dist = rng.RandLimit((uint32_t)s + 1); - eastl::advance(it, dist); - - if(it == rbVectorString.end()) - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current)); - else - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - - const eastl_size_t count = (eastl_size_t)rng.RandLimit(10); - - rbVectorString.insert(it, count, string(counterBuffer)); - EATEST_VERIFY(rbVectorString.size() == eastl::min(s + count, rbVectorString.capacity())); - } - else if(op == 8) - { - // template <typename InputIterator> - // void insert(iterator position, InputIterator first, InputIterator last); - - string stringArray[10]; - - it = rbVectorString.begin(); - const eastl_size_t dist = rng.RandLimit((uint32_t)s + 1); - eastl::advance(it, dist); - - if(it == rbVectorString.end()) - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current)); - else - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - - const eastl_size_t count = (eastl_size_t)rng.RandLimit(10); - - rbVectorString.insert(it, stringArray, stringArray + count); - EATEST_VERIFY(rbVectorString.size() == eastl::min(s + count, rbVectorString.capacity())); - } - else if(op == 9) - { - // iterator erase(iterator position); - - if(!rbVectorString.empty()) - { - it = rbVectorString.begin(); - const eastl_size_t dist = rng.RandLimit((uint32_t)s); - eastl::advance(it, dist); - EATEST_VERIFY(rbVectorString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - rbVectorString.erase(it); - - EATEST_VERIFY(rbVectorString.size() == (s - 1)); - } - } - else if(op == 10) - { - // iterator erase(iterator first, iterator last); - - if(!rbVectorString.empty()) - { - RBVectorString::iterator it1 = rbVectorString.begin(); - const eastl_size_t pos = rng.RandLimit((uint32_t)s / 4); - eastl::advance(it1, pos); - EATEST_VERIFY(rbVectorString.validate_iterator(it1) == (isf_valid | isf_current | isf_can_dereference)); - - RBVectorString::iterator it2 = it1; - const eastl_size_t dist = rng.RandLimit((uint32_t)s / 4); - eastl::advance(it2, dist); - EATEST_VERIFY(rbVectorString.validate_iterator(it2) == (isf_valid | isf_current | isf_can_dereference)); - - EATEST_VERIFY(s > (pos + dist)); - rbVectorString.erase(it1, it2); - EATEST_VERIFY(rbVectorString.size() == (s - dist)); - } - } - else if(op == 11) - { - // void resize(size_type n); - const eastl_size_t nSubOp = rng.RandLimit(100); - - if(nSubOp == 1) - { - rbVectorString.resize(kOriginalCapacity); - EATEST_VERIFY(rbVectorString.size() == (RBVectorString::size_type)kOriginalCapacity); - } - else if(nSubOp == 2) - { - const eastl_size_t newSize = rng.RandLimit((uint32_t)s * 2) + 2; - - rbVectorString.resize(newSize); - EATEST_VERIFY(rbVectorString.size() == newSize); - } - else if(nSubOp == 3) - { - rbVectorString.clear(); - EATEST_VERIFY(rbVectorString.size() == 0); - } - } - - EATEST_VERIFY(rbVectorString.validate()); - } - - // We make sure that after the above we still have some contents. - if(rbVectorString.size() < 8) - rbVectorString.resize(8); - - EATEST_VERIFY(rbVectorString.validate()); - - // Test const functions - // const_iterator begin() const; - // const_iterator end() const; - // const_reverse_iterator rbegin() const; - // const_reverse_iterator rend() const; - // const_reference front() const; - // const_reference back() const; - // const_reference operator[](size_type n) const; - // const container_type& get_container() const; - const RBVectorString& rbVSConst = rbVectorString; - - for(RBVectorString::const_iterator ic = rbVSConst.begin(); ic != rbVSConst.end(); ++ic) - { - EATEST_VERIFY(rbVectorString.validate_iterator(ic) == (isf_valid | isf_current | isf_can_dereference)); - } - - for(RBVectorString::const_reverse_iterator ric = rbVSConst.rbegin(); ric != rbVSConst.rend(); ++ric) - { - if(ric == rbVSConst.rbegin()) - EATEST_VERIFY(rbVectorString.validate_iterator(ric.base()) == (isf_valid | isf_current)); - else - EATEST_VERIFY(rbVectorString.validate_iterator(ric.base()) == (isf_valid | isf_current | isf_can_dereference)); - } - - EATEST_VERIFY(rbVSConst.front() == rbVectorString.front()); - EATEST_VERIFY(rbVSConst.back() == rbVectorString.back()); - EATEST_VERIFY(rbVSConst[0] == rbVectorString[0]); - EATEST_VERIFY(&rbVSConst.get_container() == &rbVectorString.get_container()); - - - // Test additional constructors. - // ring_buffer(const this_type& x); - // explicit ring_buffer(const Container& x); - // this_type& operator=(const this_type& x); - // void swap(this_type& x); - RBVectorString rbVectorString2(rbVectorString); - RBVectorString rbVectorString3(rbVectorString.get_container()); - RBVectorString rbVectorString4(rbVectorString.capacity() / 2); - RBVectorString rbVectorString5(rbVectorString.capacity() * 2); - - EATEST_VERIFY(rbVectorString.validate()); - EATEST_VERIFY(rbVectorString2.validate()); - EATEST_VERIFY(rbVectorString3.validate()); - EATEST_VERIFY(rbVectorString4.validate()); - EATEST_VERIFY(rbVectorString5.validate()); - - EATEST_VERIFY(rbVectorString == rbVectorString2); - EATEST_VERIFY(rbVectorString3.get_container() == rbVectorString2.get_container()); - - rbVectorString3 = rbVectorString4; - EATEST_VERIFY(rbVectorString3.validate()); - - eastl::swap(rbVectorString2, rbVectorString4); - EATEST_VERIFY(rbVectorString2.validate()); - EATEST_VERIFY(rbVectorString3.validate()); - EATEST_VERIFY(rbVectorString4.validate()); - EATEST_VERIFY(rbVectorString == rbVectorString4); - EATEST_VERIFY(rbVectorString2 == rbVectorString3); - - // void ring_buffer<T, Container>::reserve(size_type n) - eastl_size_t cap = rbVectorString2.capacity(); - rbVectorString2.reserve(cap += 2); - EATEST_VERIFY(rbVectorString2.validate()); - EATEST_VERIFY(rbVectorString2.capacity() == cap); - rbVectorString2.reserve(cap -= 4); // This should act as a no-op if we are following convention. - EATEST_VERIFY(rbVectorString2.validate()); - - // void ring_buffer<T, Container>::set_capacity(size_type n) - cap = rbVectorString2.capacity(); - rbVectorString2.resize(cap); - EATEST_VERIFY(rbVectorString2.size() == cap); - rbVectorString2.set_capacity(cap += 2); - EATEST_VERIFY(rbVectorString2.validate()); - EATEST_VERIFY(rbVectorString2.capacity() == cap); - rbVectorString2.set_capacity(cap -= 4); - EATEST_VERIFY(rbVectorString2.capacity() == cap); - EATEST_VERIFY(rbVectorString2.validate()); - - // template <typename InputIterator> - // void assign(InputIterator first, InputIterator last); - string stringArray[10]; - for(int q = 0; q < 10; q++) - stringArray[q] = (char)('0' + (char)q); - - rbVectorString5.assign(stringArray, stringArray + 10); - EATEST_VERIFY(rbVectorString5.validate()); - EATEST_VERIFY(rbVectorString5.size() == 10); - EATEST_VERIFY(rbVectorString5.front() == "0"); - EATEST_VERIFY(rbVectorString5.back() == "9"); - } - - - { - // Additional testing - typedef ring_buffer< int, vector<int> > RBVectorInt; - - RBVectorInt rbVectorInt(6); - - rbVectorInt.push_back(0); - rbVectorInt.push_back(1); - rbVectorInt.push_back(2); - rbVectorInt.push_back(3); - rbVectorInt.push_back(4); - rbVectorInt.push_back(5); - EATEST_VERIFY(rbVectorInt[0] == 0); - EATEST_VERIFY(rbVectorInt[5] == 5); - - // iterator insert(iterator position, const value_type& value); - rbVectorInt.insert(rbVectorInt.begin(), 999); - EATEST_VERIFY(rbVectorInt[0] == 999); - EATEST_VERIFY(rbVectorInt[1] == 0); - EATEST_VERIFY(rbVectorInt[5] == 4); - - rbVectorInt.clear(); - rbVectorInt.push_back(0); - rbVectorInt.push_back(1); - rbVectorInt.push_back(2); - rbVectorInt.push_back(3); - rbVectorInt.push_back(4); - - // iterator insert(iterator position, const value_type& value); - rbVectorInt.insert(rbVectorInt.begin(), 999); - EATEST_VERIFY(rbVectorInt[0] == 999); - EATEST_VERIFY(rbVectorInt[1] == 0); - EATEST_VERIFY(rbVectorInt[5] == 4); - - rbVectorInt.clear(); - rbVectorInt.push_back(0); - rbVectorInt.push_back(1); - rbVectorInt.push_back(2); - rbVectorInt.push_back(3); - rbVectorInt.push_back(4); - rbVectorInt.push_back(5); - rbVectorInt.push_back(6); - EATEST_VERIFY(rbVectorInt[0] == 1); - EATEST_VERIFY(rbVectorInt[5] == 6); - - // iterator insert(iterator position, const value_type& value); - rbVectorInt.insert(rbVectorInt.begin(), 999); - EATEST_VERIFY(rbVectorInt[0] == 999); - EATEST_VERIFY(rbVectorInt[1] == 1); - EATEST_VERIFY(rbVectorInt[5] == 5); - - // iterator insert(iterator position, const value_type& value); - RBVectorInt::iterator it = rbVectorInt.begin(); - eastl::advance(it, 3); - rbVectorInt.insert(it, 888); - EATEST_VERIFY(rbVectorInt[0] == 999); - EATEST_VERIFY(rbVectorInt[1] == 1); - EATEST_VERIFY(rbVectorInt[2] == 2); - EATEST_VERIFY(rbVectorInt[3] == 888); - EATEST_VERIFY(rbVectorInt[4] == 3); - EATEST_VERIFY(rbVectorInt[5] == 4); - } - - - { - EA::UnitTest::Rand rng(EA::UnitTest::GetRandSeed()); - - typedef ring_buffer< string, list<string> > RBListString; - - int counter = 0; - char counterBuffer[32]; - - // explicit ring_buffer(size_type size = 0); - const int kOriginalCapacity = 50; - RBListString rbListString(50); - - // bool empty() const; - // size_type size() const; - // bool validate() const; - EATEST_VERIFY(rbListString.validate()); - EATEST_VERIFY(rbListString.empty()); - EATEST_VERIFY(rbListString.size() == 0); - EATEST_VERIFY(rbListString.capacity() == 50); - - // void clear(); - rbListString.clear(); - EATEST_VERIFY(rbListString.validate()); - EATEST_VERIFY(rbListString.empty()); - EATEST_VERIFY(rbListString.size() == 0); - EATEST_VERIFY(rbListString.capacity() == 50); - - // container_type& get_container(); - RBListString::container_type& c = rbListString.get_container(); - EATEST_VERIFY(c.size() == (kOriginalCapacity + 1)); // We need to add one because the ring_buffer mEnd is necessarily an unused element. - - // iterator begin(); - // iterator end(); - // int validate_iterator(const_iterator i) const; - RBListString::iterator it = rbListString.begin(); - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current)); - - while(it != rbListString.end()) // This loop should do nothing. - { - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current)); - ++it; - } - - // void push_back(const value_type& value); - sprintf(counterBuffer, "%d", counter++); - rbListString.push_back(string(counterBuffer)); - EATEST_VERIFY(rbListString.validate()); - EATEST_VERIFY(!rbListString.empty()); - EATEST_VERIFY(rbListString.size() == 1); - EATEST_VERIFY(rbListString.capacity() == 50); - - it = rbListString.begin(); - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - EATEST_VERIFY(*it == "0"); - - // reference front(); - // reference back(); - string& sFront = rbListString.front(); - string& sBack = rbListString.back(); - EATEST_VERIFY(&sFront == &sBack); - - // void push_back(); - string& ref = rbListString.push_back(); - EATEST_VERIFY(rbListString.validate()); - EATEST_VERIFY(rbListString.size() == 2); - EATEST_VERIFY(rbListString.capacity() == 50); - EATEST_VERIFY(&ref == &rbListString.back()); - - it = rbListString.begin(); - ++it; - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - EATEST_VERIFY(it->empty()); - - sprintf(counterBuffer, "%d", counter++); - *it = counterBuffer; - EATEST_VERIFY(*it == "1"); - - ++it; - EATEST_VERIFY(it == rbListString.end()); - - it = rbListString.begin(); - while(it != rbListString.end()) - { - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - ++it; - } - - // reference operator[](size_type n); - string& s0 = rbListString[0]; - EATEST_VERIFY(s0 == "0"); - - string& s1 = rbListString[1]; - EATEST_VERIFY(s1 == "1"); - - // Now we start hammering the ring buffer with push_back. - for(eastl_size_t i = 0, iEnd = rbListString.capacity() * 5; i != iEnd; i++) - { - sprintf(counterBuffer, "%d", counter++); - rbListString.push_back(string(counterBuffer)); - EATEST_VERIFY(rbListString.validate()); - } - - int counterCheck = counter - 1; - char counterCheckBuffer[32]; - sprintf(counterCheckBuffer, "%d", counterCheck); - EATEST_VERIFY(rbListString.back() == counterCheckBuffer); - - // reverse_iterator rbegin(); - // reverse_iterator rend(); - for(RBListString::reverse_iterator ri = rbListString.rbegin(); ri != rbListString.rend(); ++ri) - { - sprintf(counterCheckBuffer, "%d", counterCheck--); - EATEST_VERIFY(*ri == counterCheckBuffer); - } - - ++counterCheck; - - // iterator begin(); - // iterator end(); - for(RBListString::iterator i = rbListString.begin(); i != rbListString.end(); ++i) - { - EATEST_VERIFY(rbListString.validate_iterator(i) == (isf_valid | isf_current | isf_can_dereference)); - EATEST_VERIFY(*i == counterCheckBuffer); - sprintf(counterCheckBuffer, "%d", ++counterCheck); - } - - // void clear(); - rbListString.clear(); - EATEST_VERIFY(rbListString.validate()); - EATEST_VERIFY(rbListString.empty()); - EATEST_VERIFY(rbListString.size() == 0); - EATEST_VERIFY(rbListString.capacity() == 50); - - // Random operations - // Not easy to test the expected values without some tedium. - for(int j = 0; j < 10000 + (gEASTL_TestLevel * 10000); j++) - { - sprintf(counterBuffer, "%d", counter++); - - const eastl_size_t op = rng.RandLimit(12); - const eastl_size_t s = rbListString.size(); - - if(op == 0) - { - // void push_back(const value_type& value); - - rbListString.push_back(string(counterBuffer)); - EATEST_VERIFY(rbListString.size() == eastl::min(s + 1, rbListString.capacity())); - } - else if(op == 1) - { - // void push_back(); - - string& ref2 = rbListString.push_back(); - rbListString.back() = string(counterBuffer); - EATEST_VERIFY(rbListString.size() == eastl::min(s + 1, rbListString.capacity())); - EATEST_VERIFY(&ref2 == &rbListString.back()); - } - else if(op == 2) - { - // void pop_back(); - - if(!rbListString.empty()) - { - rbListString.pop_back(); - EATEST_VERIFY(rbListString.size() == (s - 1)); - } - } - else if(op == 3) - { - // void push_front(const value_type& value); - - rbListString.push_front(string(counterBuffer)); - EATEST_VERIFY(rbListString.size() == eastl::min(s + 1, rbListString.capacity())); - } - else if(op == 4) - { - // void push_front(); - - string& ref2 = rbListString.push_front(); - rbListString.front() = string(counterBuffer); - EATEST_VERIFY(rbListString.size() == eastl::min(s + 1, rbListString.capacity())); - EATEST_VERIFY(&ref2 == &rbListString.front()); - } - else if(op == 5) - { - // void pop_front(); - - if(!rbListString.empty()) - { - rbListString.pop_front(); - EATEST_VERIFY(rbListString.size() == (s - 1)); - } - } - else if(op == 6) - { - // iterator insert(iterator position, const value_type& value); - - it = rbListString.begin(); - const eastl_size_t dist = rng.RandLimit((uint32_t)s + 1); - eastl::advance(it, dist); - - if(it == rbListString.end()) - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current)); - else - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - - rbListString.insert(it, string(counterBuffer)); - EATEST_VERIFY(rbListString.size() == eastl::min(s + 1, rbListString.capacity())); - } - else if(op == 7) - { - // void insert(iterator position, size_type n, const value_type& value); - - it = rbListString.begin(); - const eastl_size_t dist = rng.RandLimit((uint32_t)s + 1); - eastl::advance(it, dist); - - if(it == rbListString.end()) - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current)); - else - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - - const eastl_size_t count = (eastl_size_t)rng.RandLimit(10); - - rbListString.insert(it, count, string(counterBuffer)); - EATEST_VERIFY(rbListString.size() == eastl::min(s + count, rbListString.capacity())); - } - else if(op == 8) - { - // template <typename InputIterator> - // void insert(iterator position, InputIterator first, InputIterator last); - - string stringArray[10]; - - it = rbListString.begin(); - const eastl_size_t dist = rng.RandLimit((uint32_t)s + 1); - eastl::advance(it, dist); - - if(it == rbListString.end()) - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current)); - else - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - - const eastl_size_t count = (eastl_size_t)rng.RandLimit(10); - - rbListString.insert(it, stringArray, stringArray + count); - EATEST_VERIFY(rbListString.size() == eastl::min(s + count, rbListString.capacity())); - } - else if(op == 9) - { - // iterator erase(iterator position); - - if(!rbListString.empty()) - { - it = rbListString.begin(); - const eastl_size_t dist = rng.RandLimit((uint32_t)s); - eastl::advance(it, dist); - EATEST_VERIFY(rbListString.validate_iterator(it) == (isf_valid | isf_current | isf_can_dereference)); - rbListString.erase(it); - - EATEST_VERIFY(rbListString.size() == (s - 1)); - } - } - else if(op == 10) - { - // iterator erase(iterator first, iterator last); - - if(!rbListString.empty()) - { - RBListString::iterator it1 = rbListString.begin(); - const eastl_size_t pos = rng.RandLimit((uint32_t)s / 4); - eastl::advance(it1, pos); - EATEST_VERIFY(rbListString.validate_iterator(it1) == (isf_valid | isf_current | isf_can_dereference)); - - RBListString::iterator it2 = it1; - const eastl_size_t dist = rng.RandLimit((uint32_t)s / 4); - eastl::advance(it2, dist); - EATEST_VERIFY(rbListString.validate_iterator(it2) == (isf_valid | isf_current | isf_can_dereference)); - - EATEST_VERIFY(s > (pos + dist)); - rbListString.erase(it1, it2); - EATEST_VERIFY(rbListString.size() == (s - dist)); - } - } - else if(op == 11) - { - // void resize(size_type n); - const eastl_size_t nSubOp = rng.RandLimit(100); - - if(nSubOp == 1) - { - rbListString.resize(kOriginalCapacity); - EATEST_VERIFY(rbListString.size() == (RBListString::size_type)kOriginalCapacity); - } - else if(nSubOp == 2) - { - const eastl_size_t newSize = rng.RandLimit((uint32_t)s * 2) + 2; - - rbListString.resize(newSize); - EATEST_VERIFY(rbListString.size() == newSize); - } - else if(nSubOp == 3) - { - rbListString.clear(); - EATEST_VERIFY(rbListString.size() == 0); - } - } - - EATEST_VERIFY(rbListString.validate()); - } - - // We make sure that after the above we still have some contents. - if(rbListString.size() < 8) - rbListString.resize(8); - - EATEST_VERIFY(rbListString.validate()); - - // Test const functions - // const_iterator begin() const; - // const_iterator end() const; - // const_reverse_iterator rbegin() const; - // const_reverse_iterator rend() const; - // const_reference front() const; - // const_reference back() const; - // const_reference operator[](size_type n) const; - // const container_type& get_container() const; - const RBListString& rbVSConst = rbListString; - - for(RBListString::const_iterator ic = rbVSConst.begin(); ic != rbVSConst.end(); ++ic) - { - EATEST_VERIFY(rbListString.validate_iterator(ic) == (isf_valid | isf_current | isf_can_dereference)); - } - - for(RBListString::const_reverse_iterator ric = rbVSConst.rbegin(); ric != rbVSConst.rend(); ++ric) - { - if(ric == rbVSConst.rbegin()) - EATEST_VERIFY(rbListString.validate_iterator(ric.base()) == (isf_valid | isf_current)); - else - EATEST_VERIFY(rbListString.validate_iterator(ric.base()) == (isf_valid | isf_current | isf_can_dereference)); - } - - EATEST_VERIFY(rbVSConst.front() == rbListString.front()); - EATEST_VERIFY(rbVSConst.back() == rbListString.back()); - EATEST_VERIFY(rbVSConst[0] == rbListString[0]); - EATEST_VERIFY(&rbVSConst.get_container() == &rbListString.get_container()); - - - // Test additional constructors. - // ring_buffer(const this_type& x); - // explicit ring_buffer(const Container& x); - // this_type& operator=(const this_type& x); - // void swap(this_type& x); - RBListString rbListString2(rbListString); - RBListString rbListString3(rbListString.get_container()); - RBListString rbListString4(rbListString.capacity() / 2); - RBListString rbListString5(rbListString.capacity() * 2); - - EATEST_VERIFY(rbListString.validate()); - EATEST_VERIFY(rbListString2.validate()); - EATEST_VERIFY(rbListString3.validate()); - EATEST_VERIFY(rbListString4.validate()); - EATEST_VERIFY(rbListString5.validate()); - - EATEST_VERIFY(rbListString == rbListString2); - EATEST_VERIFY(rbListString3.get_container() == rbListString2.get_container()); - - rbListString3 = rbListString4; - EATEST_VERIFY(rbListString3.validate()); - - eastl::swap(rbListString2, rbListString4); - EATEST_VERIFY(rbListString2.validate()); - EATEST_VERIFY(rbListString3.validate()); - EATEST_VERIFY(rbListString4.validate()); - EATEST_VERIFY(rbListString == rbListString4); - EATEST_VERIFY(rbListString2 == rbListString3); - - // void ring_buffer<T, Container>::reserve(size_type n) - eastl_size_t cap = rbListString2.capacity(); - rbListString2.reserve(cap += 2); - EATEST_VERIFY(rbListString2.validate()); - EATEST_VERIFY(rbListString2.capacity() == cap); - rbListString2.reserve(cap -= 4); // This should act as a no-op if we are following convention. - EATEST_VERIFY(rbListString2.validate()); - - - // template <typename InputIterator> - // void assign(InputIterator first, InputIterator last); - string stringArray[10]; - for(int q = 0; q < 10; q++) - stringArray[q] = '0' + (char)q; - - rbListString5.assign(stringArray, stringArray + 10); - EATEST_VERIFY(rbListString5.validate()); - EATEST_VERIFY(rbListString5.size() == 10); - EATEST_VERIFY(rbListString5.front() == "0"); - EATEST_VERIFY(rbListString5.back() == "9"); - - - // ring_buffer(this_type&& x); - // ring_buffer(this_type&& x, const allocator_type& allocator); - // this_type& operator=(this_type&& x); - - RBListString rbListStringM1(eastl::move(rbListString5)); - EATEST_VERIFY(rbListStringM1.validate() && rbListString5.validate()); - EATEST_VERIFY((rbListStringM1.size() == 10) && (rbListString5.size() == 0)); - - RBListString rbListStringM2(eastl::move(rbListStringM1), RBListString::allocator_type()); - EATEST_VERIFY(rbListStringM2.validate() && rbListStringM1.validate()); - EATEST_VERIFY((rbListStringM2.size() == 10) && (rbListStringM1.size() == 0)); - - rbListStringM1 = eastl::move(rbListStringM2); - EATEST_VERIFY(rbListStringM1.validate() && rbListStringM2.validate()); - EATEST_VERIFY((rbListStringM1.size() == 10) && (rbListStringM2.size() == 0)); - } - - - - { - // ring_buffer(std::initializer_list<value_type> ilist, const allocator_type& allocator = allocator_type()); - // this_type& operator=(std::initializer_list<value_type> ilist); - // void insert(iterator position, std::initializer_list<value_type> ilist); - #if !defined(EA_COMPILER_NO_INITIALIZER_LISTS) - ring_buffer<int> intBuffer = { 0, 1, 2 }; - EATEST_VERIFY(VerifySequence(intBuffer.begin(), intBuffer.end(), int(), "ring_buffer std::initializer_list", 0, 1, 2, -1)); - - intBuffer = { 16, 17, 18 }; - EATEST_VERIFY(VerifySequence(intBuffer.begin(), intBuffer.end(), int(), "ring_buffer std::initializer_list", 16, 17, 18, -1)); - - // We need to increase the capacity in order to insert new items because the ctor above set the capacity to be only enough to hold the initial list. - intBuffer.reserve(intBuffer.capacity() + 2); - intBuffer.insert(intBuffer.begin(), { 14, 15 }); - EATEST_VERIFY(VerifySequence(intBuffer.begin(), intBuffer.end(), int(), "ring_buffer std::initializer_list", 14, 15, 16, 17, 18, -1)); - #endif - } - - { - // Regression for user-reported problem. - typedef eastl::fixed_vector<float, 8> GamepadData_t; - typedef eastl::ring_buffer<GamepadData_t> GamepadDataDelayBuffer_t; - typedef eastl::fixed_vector<GamepadDataDelayBuffer_t, 32> GamepadDataDelayBufferTable_t; - - GamepadDataDelayBufferTable_t mDelayTable; - mDelayTable.resize(32); - for(eastl_size_t i = 0; i < mDelayTable.size(); i++) - mDelayTable[i].reserve(16); - - GamepadData_t data(8, 1.f); - mDelayTable[0].push_back(data); - mDelayTable[0].push_back(data); - mDelayTable[0].push_back(data); - mDelayTable[0].push_back(data); - - EATEST_VERIFY(mDelayTable[0].size() == 4); - GamepadData_t dataFront = mDelayTable[0].front(); - EATEST_VERIFY((dataFront.size() == 8) && (dataFront[0] == 1.f)); - mDelayTable[0].pop_front(); - } - - { - // Regression for bug with iterator subtraction - typedef eastl::ring_buffer<int> IntBuffer_t; - IntBuffer_t intBuffer = { 0, 1, 2, 3, 4, 5, 6, 7 }; - IntBuffer_t::iterator it = intBuffer.begin(); - - EATEST_VERIFY(*it == 0); - it += 4; - EATEST_VERIFY(*it == 4); - it--; - EATEST_VERIFY(*it == 3); - it -= 2; - EATEST_VERIFY(*it == 1); - - intBuffer.push_back(8); - intBuffer.push_back(9); - intBuffer.push_back(10); - intBuffer.push_back(11); - - EATEST_VERIFY(*it == 10); - it -= 3; - EATEST_VERIFY(*it == 7); // Test looping around the end of the underlying container - it -= 5; - EATEST_VERIFY(*it == 11); // Test wrapping around begin to end of the ring_buffer - it -= 2; - EATEST_VERIFY(*it == 9); // It is important to test going back to the beginning of the underlying container. - - } - - // fixed_ring_buffer<T,N> tests - // ring_buffer<T, fixed_vector<T,N>> tests - { - { - // (MAX_ELEMENTS - 1) accommodates the ring_buffer sentinel - const int MAX_ELEMENTS = 8; - eastl::ring_buffer<int, eastl::fixed_vector<int, MAX_ELEMENTS, false>> rb(MAX_ELEMENTS - 1); - - for (int i = 0; i < MAX_ELEMENTS - 1; i++) - rb.push_back(i); - - auto it = rb.begin(); - for (int i = 0; i < MAX_ELEMENTS - 1; i++) - { EATEST_VERIFY(*it++ == i); } - } - - #if !defined(EA_COMPILER_NO_TEMPLATE_ALIASES) - { - const int MAX_ELEMENTS = 25; - eastl::fixed_ring_buffer<int, MAX_ELEMENTS> rb(MAX_ELEMENTS); - - for(int i = 0; i < MAX_ELEMENTS; i++) - rb.push_back(i); - - auto it = rb.begin(); - for(int i = 0; i < MAX_ELEMENTS; i++) - { EATEST_VERIFY(*it++ == i); } - } - #endif - - #if !defined(EA_COMPILER_NO_INITIALIZER_LISTS) && !defined(EA_COMPILER_NO_TEMPLATE_ALIASES) - { - const int MAX_ELEMENTS = 8; - eastl::fixed_ring_buffer<int, MAX_ELEMENTS> rb = {0, 1, 2, 3, 4, 5, 6, 7}; - - auto it = rb.begin(); - for(int i = 0; i < MAX_ELEMENTS; i++) - { EATEST_VERIFY(*it++ == i); } - } - - { - struct LocalStruct {}; - fixed_ring_buffer<LocalStruct, 8> rb = {{{}, {}, {}}}; - EATEST_VERIFY(rb.size() == 3); - } - #endif - } - - { - const auto MAX_ELEMENTS = EASTL_MAX_STACK_USAGE; - - // create a container simulating LARGE state that exceeds - // our maximum stack size macro. This forces our ring_buffer implementation - // to allocate the container in the heap instead of holding it on the stack. - // This test ensures that allocation is NOT serviced by the default global heap. - // Instead it is serviced by the allocator of the ring_buffers underlying container. - struct PaddedVector : public eastl::vector<int, MallocAllocator> - { - char mPadding[EASTL_MAX_STACK_USAGE]; - }; - - MallocAllocator::reset_all(); - CountingAllocator::resetCount(); - - { - CountingAllocator countingAlloc; - AutoDefaultAllocator _(&countingAlloc); - - eastl::ring_buffer<int, PaddedVector> intBuffer(1); - for (int i = 0; i < MAX_ELEMENTS; i++) - intBuffer.push_back(i); - - #if !EASTL_OPENSOURCE - const auto cacheAllocationCount = gEASTLTest_TotalAllocationCount; - #endif - const auto cacheMallocatorCount = MallocAllocator::mAllocCountAll; - const auto forceReAllocSize = intBuffer.size() * 2; - - intBuffer.resize(forceReAllocSize); - - #if !EASTL_OPENSOURCE - VERIFY(cacheAllocationCount == gEASTLTest_TotalAllocationCount); - #endif - VERIFY(cacheMallocatorCount < MallocAllocator::mAllocCountAll); - VERIFY(CountingAllocator::neverUsed()); - } - } - - return nErrorCount; -} - - - - - - - - - |