aboutsummaryrefslogtreecommitdiff
path: root/EASTL/test/source/TestIterator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'EASTL/test/source/TestIterator.cpp')
-rw-r--r--EASTL/test/source/TestIterator.cpp401
1 files changed, 401 insertions, 0 deletions
diff --git a/EASTL/test/source/TestIterator.cpp b/EASTL/test/source/TestIterator.cpp
new file mode 100644
index 0000000..e168118
--- /dev/null
+++ b/EASTL/test/source/TestIterator.cpp
@@ -0,0 +1,401 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) Electronic Arts Inc. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+
+
+#include "EASTLTest.h"
+#include <EASTL/iterator.h>
+#include <EASTL/vector.h>
+#include <EASTL/set.h>
+#include <EASTL/array.h>
+#include <EASTL/numeric.h>
+#include <EASTL/list.h>
+#include <EASTL/slist.h>
+#include <EASTL/string.h>
+#include <EASTL/intrusive_list.h>
+#include <EASTL/memory.h>
+
+EA_DISABLE_ALL_VC_WARNINGS()
+#include <stdio.h>
+#include <string.h>
+EA_RESTORE_ALL_VC_WARNINGS()
+
+
+// This is used below, though is currently disabled as documented below.
+struct IListNode : public eastl::intrusive_list_node{};
+
+int TestIterator_advance()
+{
+ int nErrorCount = 0;
+
+ {
+ // void advance(InputIterator& i, Distance n)
+ const int num_elements = 10;
+ int i;
+
+ eastl::vector<int> v;
+ for(i = 0; i < num_elements; i++)
+ v.push_back(i);
+
+ // test forward advancement
+ eastl::vector<int>::iterator it = v.begin();
+ for(i = 0; i < num_elements; i++)
+ {
+ EATEST_VERIFY(*it == v[i]);
+ eastl::advance(it, 1);
+ }
+
+ // test backwards advancement
+ eastl::vector<int>::iterator it2 = v.end();
+ i = num_elements - 1;
+ do
+ {
+ eastl::advance(it2, -1);
+ EATEST_VERIFY(*it2 == v[i]);
+ }
+ while(i-- != 0);
+ }
+
+ {
+ // void advance(InputIterator& i, Distance n)
+ eastl::list<int> intList;
+ intList.push_back(0);
+ intList.push_back(1);
+ intList.push_back(42);
+ intList.push_back(2);
+
+ eastl::list<int>::iterator it = intList.begin();
+ eastl::advance(it, intList.size());
+ EATEST_VERIFY(it == intList.end());
+
+ // Exercise advance with an signed Distance type.
+ it = intList.begin();
+ eastl::advance(it, (ssize_t)intList.size());
+ EATEST_VERIFY(it == intList.end());
+
+
+ eastl::slist<int> intSlist;
+ intSlist.push_front(0);
+ intSlist.push_front(1);
+ intSlist.push_front(42);
+ intSlist.push_front(2);
+
+ eastl::slist<int>::iterator its = intSlist.begin();
+ eastl::advance(its, intSlist.size());
+ EATEST_VERIFY(its == intSlist.end());
+
+ // Exercise advance with an signed Distance type.
+ its = intSlist.begin();
+ eastl::advance(its, (ssize_t)intSlist.size());
+ EATEST_VERIFY(its == intSlist.end());
+ }
+
+ {
+ // void next(InputIterator& i, Distance n)
+ eastl::vector<int> v;
+ v.push_back(0);
+ v.push_back(1);
+ v.push_back(42);
+ v.push_back(2);
+
+ eastl::vector<int>::iterator it = v.begin();
+ EATEST_VERIFY(*eastl::next(it, 0) == 0);
+ EATEST_VERIFY(*eastl::next(it /*testing the iterator distance default value*/) == 1);
+ EATEST_VERIFY(*eastl::next(it, 2) == 42);
+ }
+
+ {
+ // void prev(InputIterator& i, Distance n)
+ eastl::vector<int> v;
+ v.push_back(0);
+ v.push_back(1);
+ v.push_back(42);
+ v.push_back(2);
+
+ eastl::vector<int>::iterator it = v.end();
+ EATEST_VERIFY(*eastl::prev(it, 2) == 42);
+ EATEST_VERIFY(*eastl::prev(it /*testing the iterator distance default value*/) == 2);
+ }
+
+ return nErrorCount;
+}
+
+int TestIterator_moveIterator()
+{
+ int nErrorCount = 0;
+
+ {
+ eastl::vector<int> v = {0, 1, 42, 2};
+ const auto constBeginMoveIter = eastl::make_move_iterator(v.begin());
+
+ // operator++(int)
+ auto moveIter = constBeginMoveIter;
+ moveIter++; // the result of the expression is the incremented value, we need this test to read the existing state of the iterator.
+ EATEST_VERIFY(*moveIter != *constBeginMoveIter);
+
+ // operator--(int)
+ moveIter = constBeginMoveIter + 2; // points to '42'
+ moveIter--; // the result of the expression is the incremented value, we need this test to read the existing state of the iterator.
+ EATEST_VERIFY(*moveIter != *(constBeginMoveIter + 2));
+ }
+
+ return nErrorCount;
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// TestIterator
+//
+int TestIterator()
+{
+ int nErrorCount = 0;
+ nErrorCount += TestIterator_advance();
+ nErrorCount += TestIterator_moveIterator();
+
+ {
+ // reverse_iterator
+ // reverse_iterator<Iterator> make_reverse_iterator(Iterator mi)
+ {
+ eastl::vector<int> src;
+ for(int i = 0; i < 10; i++)
+ src.push_back(i); // src should become {0,1,2,3,4,5,6,7,8,9}
+
+ auto itr = eastl::make_reverse_iterator(src.end());
+ EATEST_VERIFY(*itr == 9); ++itr;
+ EATEST_VERIFY(*itr == 8); ++itr;
+ EATEST_VERIFY(*itr == 7); ++itr;
+ EATEST_VERIFY(*itr == 6); ++itr;
+ EATEST_VERIFY(*itr == 5); ++itr;
+ EATEST_VERIFY(*itr == 4); ++itr;
+ EATEST_VERIFY(*itr == 3); ++itr;
+ EATEST_VERIFY(*itr == 2); ++itr;
+ EATEST_VERIFY(*itr == 1); ++itr;
+ EATEST_VERIFY(*itr == 0); ++itr;
+ EATEST_VERIFY( itr == src.rend());
+ EATEST_VERIFY( itr == eastl::make_reverse_iterator(src.begin()));
+ }
+ }
+
+ {
+ // move_iterator
+ // move_iterator<Iterator> make_move_iterator(Iterator mi)
+ typedef eastl::vector<eastl::string> StringArray;
+
+ StringArray src;
+ for(eastl_size_t i = 0; i < 4; i++)
+ src.push_back(eastl::string(1, (char8_t)('0' + i))); // v should become {"0", "1", "2", "3"};
+
+ // Moves the values out of the string array and into the result.
+ StringArray dst(eastl::make_move_iterator(src.begin()), eastl::make_move_iterator(src.end()));
+
+ EATEST_VERIFY((src.size() == 4) && (src[0] == "") && (src[3] == ""));
+ EATEST_VERIFY((dst.size() == 4) && (dst[0] == "0") && (dst[3] == "3"));
+ }
+
+ {
+ // back_insert_iterator
+ // back_inserter
+ EA_CPP14_CONSTEXPR int n = 3;
+ eastl::vector<TestObject> v1, v2, v3;
+ v1.resize(n); v2.reserve(n); v3.reserve(n);
+ {
+ int64_t copyCtorCount0 = TestObject::sTOCopyCtorCount, moveCtorCount0 = TestObject::sTOMoveCtorCount;
+ eastl::copy(v1.begin(), v1.end(), eastl::back_inserter(v2));
+ EATEST_VERIFY(v1.size() == v2.size() && TestObject::sTOCopyCtorCount == (copyCtorCount0 + n) &&
+ TestObject::sTOMoveCtorCount == moveCtorCount0);
+ }
+ {
+ int64_t copyCtorCount0 = TestObject::sTOCopyCtorCount, moveCtorCount0 = TestObject::sTOMoveCtorCount;
+ eastl::move(v1.begin(), v1.end(), eastl::back_inserter(v3));
+ EATEST_VERIFY(v1.size() == v3.size() && TestObject::sTOCopyCtorCount == copyCtorCount0 &&
+ TestObject::sTOMoveCtorCount == (moveCtorCount0 + n));
+ }
+ }
+
+ {
+ // front_insert_iterator
+ // front_inserter
+ // To do.
+ }
+
+ {
+ // insert_iterator
+ // inserter
+ // To do.
+ }
+
+ {
+ // difference_type distance(InputIterator first, InputIterator last)
+ eastl::vector<int> intVector = {0, 1, 2, 3, 4, 5, 6, 7};
+ EATEST_VERIFY(eastl::distance(intVector.begin(), intVector.end()) == 8);
+ }
+
+
+ {
+ #if EASTL_BEGIN_END_ENABLED
+ // begin / end
+ // auto inline begin(Container& container) -> decltype(container.begin())
+ // auto inline end(Container& container) -> decltype(container.end())
+
+ eastl::vector<int> intVector;
+ eastl::vector<int>::iterator intVectorIterator = eastl::begin(intVector);
+ EATEST_VERIFY(intVectorIterator == eastl::end(intVector));
+
+ eastl::list<int> intList;
+ eastl::list<int>::iterator intListIterator = eastl::begin(intList);
+ EATEST_VERIFY(intListIterator == eastl::end(intList));
+
+ eastl::set<int> intSet;
+ eastl::set<int>::iterator intSetIterator = eastl::begin(intSet);
+ EATEST_VERIFY(intSetIterator == eastl::end(intSet));
+
+ eastl::array<int, 0> intArray;
+ eastl::array<int>::iterator intArrayIterator = eastl::begin(intArray);
+ EATEST_VERIFY(intArrayIterator == eastl::end(intArray));
+
+ eastl::intrusive_list<IListNode> intIList;
+ eastl::intrusive_list<IListNode>::iterator intIListIterator = eastl::begin(intIList);
+ EATEST_VERIFY(intIListIterator == eastl::end(intIList));
+
+ eastl::string8 str8;
+ eastl::string8::iterator string8Iterator = eastl::begin(str8);
+ EATEST_VERIFY(string8Iterator == eastl::end(str8));
+ #endif
+ }
+
+ // eastl::data
+ {
+ eastl::array<int, 0> intArray;
+ int* pIntArrayData = eastl::data(intArray);
+ EATEST_VERIFY(pIntArrayData == intArray.data());
+
+ eastl::vector<int> intVector;
+ int* pIntVectorData = eastl::data(intVector);
+ EATEST_VERIFY(pIntVectorData == intVector.data());
+
+ int intCArray[34];
+ int* pIntCArray = eastl::data(intCArray);
+ EATEST_VERIFY(pIntCArray == intCArray);
+
+ std::initializer_list<int> intInitList;
+ const int* pIntInitList = eastl::data(intInitList);
+ EATEST_VERIFY(pIntInitList == intInitList.begin());
+ }
+
+ // eastl::size
+ {
+ eastl::vector<int> intVector;
+ intVector.push_back();
+ intVector.push_back();
+ intVector.push_back();
+ EATEST_VERIFY(eastl::size(intVector) == 3);
+
+ int intCArray[34];
+ EATEST_VERIFY(eastl::size(intCArray) == 34);
+ static_assert(eastl::size(intCArray) == 34, "eastl::size failure");
+ }
+
+ // eastl::ssize
+ {
+ eastl::vector<int> intVector;
+ intVector.push_back();
+ intVector.push_back();
+ intVector.push_back();
+ EATEST_VERIFY(eastl::ssize(intVector) == (signed)3);
+
+ int intCArray[34];
+ EATEST_VERIFY(eastl::ssize(intCArray) == (signed)34);
+ static_assert(eastl::ssize(intCArray) == 34, "eastl::ssize failure");
+ }
+
+ // eastl::empty
+ {
+ eastl::vector<int> intVector;
+ EATEST_VERIFY(eastl::empty(intVector));
+ intVector.push_back();
+ EATEST_VERIFY(!eastl::empty(intVector));
+
+ std::initializer_list<int> intInitListEmpty;
+ EATEST_VERIFY(eastl::empty(intInitListEmpty));
+ EATEST_VERIFY(!eastl::empty({1, 2, 3, 4, 5, 6}));
+ }
+
+ // Range-based for loops
+ {
+ {
+ eastl::vector<int> v;
+ int I = 0;
+
+ v.push_back(0);
+ v.push_back(1);
+
+ for(int i : v)
+ EATEST_VERIFY(i == I++);
+ }
+
+ {
+ eastl::string s8;
+ char C = 'a';
+
+ s8.push_back('a');
+ s8.push_back('b');
+
+ for(char c : s8)
+ EATEST_VERIFY(c == C++);
+ }
+ }
+
+
+ {
+ // is_iterator_wrapper
+ static_assert((eastl::is_iterator_wrapper<void>::value == false), "is_iterator_wrapper failure");
+ static_assert((eastl::is_iterator_wrapper<int>::value == false), "is_iterator_wrapper failure");
+ static_assert((eastl::is_iterator_wrapper<int*>::value == false), "is_iterator_wrapper failure");
+ static_assert((eastl::is_iterator_wrapper<eastl::array<char>*>::value == false), "is_iterator_wrapper failure");
+ static_assert((eastl::is_iterator_wrapper<eastl::vector<char> >::value == false), "is_iterator_wrapper failure");
+ static_assert((eastl::is_iterator_wrapper<eastl::generic_iterator<int*> >::value == true), "is_iterator_wrapper failure");
+ static_assert((eastl::is_iterator_wrapper<eastl::move_iterator<eastl::array<int>::iterator> >::value == true), "is_iterator_wrapper failure");
+ }
+
+
+ {
+ // unwrap_iterator
+ int intArray[2];
+ int* pInt = eastl::unwrap_iterator(&intArray[0]);
+ intArray[0] = 17;
+ EATEST_VERIFY(*pInt == 17);
+ static_assert((eastl::is_same<decltype(eastl::unwrap_iterator(&intArray[0])), int*>::value == true), "unwrap_iterator failure");
+
+ eastl::generic_iterator<int*> giIntArray(intArray);
+ pInt = eastl::unwrap_iterator(giIntArray);
+ intArray[0] = 18;
+ EATEST_VERIFY(*pInt == 18);
+ static_assert((eastl::is_same<decltype(eastl::unwrap_iterator(giIntArray)), int*>::value == true), "unwrap_iterator failure");
+
+ eastl::vector<int> intVector(4, 19);
+ eastl::vector<int>::iterator itVector = eastl::unwrap_iterator(intVector.begin());
+ EATEST_VERIFY(*itVector == 19);
+ static_assert((eastl::is_same<decltype(eastl::unwrap_iterator(intVector.begin())), eastl::vector<int>::iterator>::value == true), "unwrap_iterator failure");
+
+ eastl::move_iterator<eastl::vector<int>::iterator> miIntVector(intVector.begin());
+ itVector = eastl::unwrap_iterator(miIntVector);
+ intVector[0] = 20;
+ EATEST_VERIFY(*itVector == 20);
+ static_assert((eastl::is_same<decltype(eastl::unwrap_iterator(miIntVector)), eastl::vector<int>::iterator>::value == true), "unwrap_iterator failure");
+ }
+
+ return nErrorCount;
+}
+
+
+
+
+
+
+
+
+
+
+
+