aboutsummaryrefslogtreecommitdiff
path: root/test/source/TestIntrusiveList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/source/TestIntrusiveList.cpp')
-rw-r--r--test/source/TestIntrusiveList.cpp403
1 files changed, 0 insertions, 403 deletions
diff --git a/test/source/TestIntrusiveList.cpp b/test/source/TestIntrusiveList.cpp
deleted file mode 100644
index 60b2378..0000000
--- a/test/source/TestIntrusiveList.cpp
+++ /dev/null
@@ -1,403 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Copyright (c) Electronic Arts Inc. All rights reserved.
-/////////////////////////////////////////////////////////////////////////////
-
-
-#include "EASTLTest.h"
-#include <EASTL/intrusive_list.h>
-#include <EABase/eabase.h>
-
-EA_DISABLE_ALL_VC_WARNINGS()
-#include <stdio.h>
-#include <stdarg.h>
-#include <stddef.h>
-
-#ifndef EA_COMPILER_NO_STANDARD_CPP_LIBRARY
- #include <string>
-#endif
-EA_RESTORE_ALL_VC_WARNINGS()
-
-using namespace eastl;
-
-
-namespace
-{
-
- /// IntNode
- ///
- /// Test intrusive_list node.
- ///
- struct IntNode : public eastl::intrusive_list_node
- {
- int mX;
-
- IntNode(int x = 0)
- : mX(x) { }
-
- operator int() const
- { return mX; }
- };
-
-
- /// ListInit
- ///
- /// Utility class for setting up a list.
- ///
- class ListInit
- {
- public:
- ListInit(intrusive_list<IntNode>& container, IntNode* pNodeArray)
- : mpContainer(&container), mpNodeArray(pNodeArray)
- {
- mpContainer->clear();
- }
-
- ListInit& operator+=(int x)
- {
- mpNodeArray->mX = x;
- mpContainer->push_back(*mpNodeArray++);
- return *this;
- }
-
- ListInit& operator,(int x)
- {
- mpNodeArray->mX = x;
- mpContainer->push_back(*mpNodeArray++);
- return *this;
- }
-
- protected:
- intrusive_list<IntNode>* mpContainer;
- IntNode* mpNodeArray;
- };
-
-} // namespace
-
-
-
-
-// Template instantations.
-// These tell the compiler to compile all the functions for the given class.
-template class eastl::intrusive_list<IntNode>;
-
-
-
-int TestIntrusiveList()
-{
- int nErrorCount = 0;
- int i;
-
- {
- // Verify that intrusive_list_node is a POD, at least when EASTL_VALIDATE_INTRUSIVE_LIST is disabled.
- #if !EASTL_VALIDATE_INTRUSIVE_LIST
- // is_pod doesn't currently detect structs as PODs, even though it should.
- // This is due to limitations in C++.
- // VERIFY(eastl::is_pod<eastl::intrusive_list_node>::value);
-
- const size_t offset = offsetof(intrusive_list_node, mpPrev);
- VERIFY(offset == sizeof(intrusive_list_node*));
- #endif
- }
-
- {
- IntNode nodes[20];
-
- intrusive_list<IntNode> ilist;
-
- // Enforce that the intrusive_list copy ctor is visible. If it is not,
- // then the class is not a POD type as it is supposed to be.
- delete new intrusive_list<IntNode>(ilist);
-
- #ifndef __GNUC__ // GCC warns on this, though strictly specaking it is allowed to.
- // Enforce that offsetof() can be used with an intrusive_list in a struct;
- // it requires a POD type. Some compilers will flag warnings or even errors
- // when this is violated.
- struct Test {
- intrusive_list<IntNode> m;
- };
- (void)offsetof(Test, m);
- #endif
-
- // begin / end
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "ctor()", -1));
-
-
- // push_back
- ListInit(ilist, nodes) += 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "push_back()", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1));
-
-
- // iterator / begin
- intrusive_list<IntNode>::iterator it = ilist.begin();
- VERIFY(it->mX == 0);
- ++it;
- VERIFY(it->mX == 1);
- ++it;
- VERIFY(it->mX == 2);
- ++it;
- VERIFY(it->mX == 3);
-
-
- // const_iterator / begin
- const intrusive_list<IntNode> cilist;
- intrusive_list<IntNode>::const_iterator cit;
- for(cit = cilist.begin(); cit != cilist.end(); ++cit)
- VERIFY(cit == cilist.end()); // This is guaranteed to be false.
-
-
- // reverse_iterator / rbegin
- intrusive_list<IntNode>::reverse_iterator itr = ilist.rbegin();
- VERIFY(itr->mX == 9);
- ++itr;
- VERIFY(itr->mX == 8);
- ++itr;
- VERIFY(itr->mX == 7);
- ++itr;
- VERIFY(itr->mX == 6);
-
-
- // iterator++/--
- {
- intrusive_list<IntNode>::iterator it1(ilist.begin());
- intrusive_list<IntNode>::iterator it2(ilist.begin());
-
- ++it1;
- ++it2;
- if ((it1 != it2++) || (++it1 != it2))
- VERIFY(!"[iterator::increment] fail\n");
-
- if ((it1 != it2--) || (--it1 != it2))
- VERIFY(!"[iterator::decrement] fail\n");
- }
-
-
- // clear / empty
- VERIFY(!ilist.empty());
-
- ilist.clear();
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "clear()", -1));
- VERIFY(ilist.empty());
-
-
- // splice
- ListInit(ilist, nodes) += 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
-
- ilist.splice(++ilist.begin(), ilist, --ilist.end());
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "splice(single)", 0, 9, 1, 2, 3, 4, 5, 6, 7, 8, -1));
-
- intrusive_list<IntNode> ilist2;
- ListInit(ilist2, nodes+10) += 10, 11, 12, 13, 14, 15, 16, 17, 18, 19;
-
- ilist.splice(++++ilist.begin(), ilist2);
- VERIFY(VerifySequence(ilist2.begin(), ilist2.end(), int(), "splice(whole)", -1));
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "splice(whole)", 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, -1));
-
- ilist.splice(ilist.begin(), ilist, ++++ilist.begin(), ----ilist.end());
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "splice(range)", 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 0, 9, 7, 8, -1));
-
- ilist.clear();
- ilist.swap(ilist2);
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "swap(empty)", -1));
- VERIFY(VerifySequence(ilist2.begin(), ilist2.end(), int(), "swap(empty)", -1));
-
- ilist2.push_back(nodes[0]);
- ilist.splice(ilist.begin(), ilist2);
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "splice(single)", 0, -1));
- VERIFY(VerifySequence(ilist2.begin(), ilist2.end(), int(), "splice(single)", -1));
-
-
- // splice(single) -- evil case (splice at or right after current position)
- ListInit(ilist, nodes) += 0, 1, 2, 3, 4;
- ilist.splice(++++ilist.begin(), *++++ilist.begin());
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "splice(single)", 0, 1, 2, 3, 4, -1));
- ilist.splice(++++++ilist.begin(), *++++ilist.begin());
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "splice(single)", 0, 1, 2, 3, 4, -1));
-
-
- // splice(range) -- evil case (splice right after current position)
- ListInit(ilist, nodes) += 0, 1, 2, 3, 4;
- ilist.splice(++++ilist.begin(), ilist, ++ilist.begin(), ++++ilist.begin());
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "splice(range)", 0, 1, 2, 3, 4, -1));
-
-
- // push_front / push_back
- ilist.clear();
- ilist2.clear();
- for(i = 4; i >= 0; --i)
- ilist.push_front(nodes[i]);
- for(i = 5; i < 10; ++i)
- ilist2.push_back(nodes[i]);
-
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "push_front()", 0, 1, 2, 3, 4, -1));
- VERIFY(VerifySequence(ilist2.begin(), ilist2.end(), int(), "push_back()", 5, 6, 7, 8, 9, -1));
-
- for(i = 4; i >= 0; --i)
- {
- ilist.pop_front();
- ilist2.pop_back();
- }
-
- VERIFY(ilist.empty() && ilist2.empty());
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "pop_front()", -1));
- VERIFY(VerifySequence(ilist2.begin(), ilist2.end(), int(), "pop_back()", -1));
-
-
- // contains / locate
- for(i = 0; i < 5; ++i)
- ilist.push_back(nodes[i]);
-
- VERIFY( ilist.contains(nodes[2]));
- VERIFY(!ilist.contains(nodes[7]));
-
- it = ilist.locate(nodes[3]);
- VERIFY(it->mX == 3);
-
- it = ilist.locate(nodes[8]);
- VERIFY(it == ilist.end());
-
-
- // reverse
- ilist.reverse();
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "push_front()", 4, 3, 2, 1, 0, -1));
-
-
- // validate / validate_iterator
- VERIFY(ilist.validate());
- it = ilist.locate(nodes[3]);
- VERIFY((ilist.validate_iterator(it) & (isf_valid | isf_can_dereference)) != 0);
- VERIFY( ilist.validate_iterator(intrusive_list<IntNode>::iterator(NULL)) == isf_none);
-
-
- // swap()
- ilist.swap(ilist2);
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "swap()", -1));
- VERIFY(VerifySequence(ilist2.begin(), ilist2.end(), int(), "swap()", 4, 3, 2, 1, 0, -1));
-
-
- // erase()
- ListInit(ilist2, nodes) += 0, 1, 2, 3, 4;
- ListInit(ilist, nodes+5) += 5, 6, 7, 8, 9;
- ilist.erase(++++ilist.begin());
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "erase(single)", 5, 6, 8, 9, -1));
-
- ilist.erase(ilist.begin(), ilist.end());
- VERIFY(VerifySequence(ilist.begin(), ilist.end(), int(), "erase(all)", -1));
-
- ilist2.erase(++ilist2.begin(), ----ilist2.end());
- VERIFY(VerifySequence(ilist2.begin(), ilist2.end(), int(), "erase(range)", 0, 3, 4, -1));
-
-
- // size
- VERIFY(ilist2.size() == 3);
-
-
- // pop_front / pop_back
- ilist2.pop_front();
- VERIFY(VerifySequence(ilist2.begin(), ilist2.end(), int(), "pop_front()", 3, 4, -1));
-
- ilist2.pop_back();
- VERIFY(VerifySequence(ilist2.begin(), ilist2.end(), int(), "pop_back()", 3, -1));
- }
-
-
- {
- // Test copy construction and assignment.
- // The following *should* not compile.
-
- intrusive_list<IntNode> ilist1;
- intrusive_list<IntNode> ilist2(ilist1);
- ilist1 = ilist2;
- }
-
-
- {
- // void sort()
- // void sort(Compare compare)
-
- const int kSize = 10;
- IntNode nodes[kSize];
-
- intrusive_list<IntNode> listEmpty;
- listEmpty.sort();
- VERIFY(VerifySequence(listEmpty.begin(), listEmpty.end(), int(), "list::sort", -1));
-
- intrusive_list<IntNode> list1;
- ListInit(list1, nodes) += 1;
- list1.sort();
- VERIFY(VerifySequence(list1.begin(), list1.end(), int(), "list::sort", 1, -1));
- list1.clear();
-
- intrusive_list<IntNode> list4;
- ListInit(list4, nodes) += 1, 9, 2, 3;
- list4.sort();
- VERIFY(VerifySequence(list4.begin(), list4.end(), int(), "list::sort", 1, 2, 3, 9, -1));
- list4.clear();
-
- intrusive_list<IntNode> listA;
- ListInit(listA, nodes) += 1, 9, 2, 3, 5, 7, 4, 6, 8, 0;
- listA.sort();
- VERIFY(VerifySequence(listA.begin(), listA.end(), int(), "list::sort", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1));
- listA.clear();
-
- intrusive_list<IntNode> listB;
- ListInit(listB, nodes) += 1, 9, 2, 3, 5, 7, 4, 6, 8, 0;
- listB.sort(eastl::less<int>());
- VERIFY(VerifySequence(listB.begin(), listB.end(), int(), "list::sort", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1));
- listB.clear();
- }
-
-
- {
- // void merge(this_type& x);
- // void merge(this_type& x, Compare compare);
-
- const int kSize = 8;
- IntNode nodesA[kSize];
- IntNode nodesB[kSize];
-
- intrusive_list<IntNode> listA;
- ListInit(listA, nodesA) += 1, 2, 3, 4, 4, 5, 9, 9;
-
- intrusive_list<IntNode> listB;
- ListInit(listB, nodesB) += 1, 2, 3, 4, 4, 5, 9, 9;
-
- listA.merge(listB);
- VERIFY(VerifySequence(listA.begin(), listA.end(), int(), "list::merge", 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 9, 9, 9, 9, -1));
- VERIFY(VerifySequence(listB.begin(), listB.end(), int(), "list::merge", -1));
- }
-
-
- {
- // void unique();
- // void unique(BinaryPredicate);
-
- const int kSize = 8;
- IntNode nodesA[kSize];
- IntNode nodesB[kSize];
-
- intrusive_list<IntNode> listA;
- ListInit(listA, nodesA) += 1, 2, 3, 4, 4, 5, 9, 9;
- listA.unique();
- VERIFY(VerifySequence(listA.begin(), listA.end(), int(), "list::unique", 1, 2, 3, 4, 5, 9, -1));
-
- intrusive_list<IntNode> listB;
- ListInit(listB, nodesB) += 1, 2, 3, 4, 4, 5, 9, 9;
- listB.unique(eastl::equal_to<int>());
- VERIFY(VerifySequence(listA.begin(), listA.end(), int(), "list::unique", 1, 2, 3, 4, 5, 9, -1));
- }
-
-
- return nErrorCount;
-}
-
-
-
-
-
-
-
-
-
-
-
-