///////////////////////////////////////////////////////////////////////////// // Copyright (c) Electronic Arts Inc. All rights reserved. ///////////////////////////////////////////////////////////////////////////// #include "EASTLTest.h" #include #include #include using namespace eastl; // Template instantations. // These tell the compiler to compile all the functions for the given class. template class eastl::list; template class eastl::list; template class eastl::list; template class eastl::list; // template class eastl::list>; int TestList() { int nErrorCount = 0; // list(); { eastl::list l; VERIFY(l.size() == 0); VERIFY(l.empty()); VERIFY(l.validate()); VERIFY(l.begin() == l.end()); } // list(const allocator_type& allocator); { MallocAllocator::reset_all(); MallocAllocator mallocator; { eastl::list l(mallocator); VERIFY(l.get_allocator() == mallocator); l.push_front(42); VERIFY(MallocAllocator::mAllocCountAll != 0); } VERIFY(MallocAllocator::mAllocCountAll == MallocAllocator::mFreeCountAll); } // explicit list(size_type n, const allocator_type& allocator = EASTL_LIST_DEFAULT_ALLOCATOR); { const int test_size = 42; eastl::list l(test_size); VERIFY(!l.empty()); VERIFY(l.size() == test_size); VERIFY(l.validate()); VERIFY(eastl::all_of(l.begin(), l.end(), [](int e) { return e == 0; })); } // list(size_type n, const value_type& value, const allocator_type& allocator = EASTL_LIST_DEFAULT_ALLOCATOR); { const int test_size = 42; const int test_val = 435; eastl::list l(42, test_val); VERIFY(!l.empty()); VERIFY(l.size() == test_size); VERIFY(l.validate()); VERIFY(eastl::all_of(l.begin(), l.end(), [=](int e) { return e == test_val; })); } // list(const this_type& x); { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list b(a); VERIFY(a == b); VERIFY(a.validate()); VERIFY(a.size() == b.size()); VERIFY(b.validate()); } // list(const this_type& x, const allocator_type& allocator); { MallocAllocator mallocator; eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list b(a, mallocator); VERIFY(a == b); VERIFY(a.validate()); VERIFY(a.size() == b.size()); VERIFY(b.validate()); VERIFY(a.get_allocator() == b.get_allocator()); } // list(this_type&& x); // list(this_type&&, const allocator_type&); { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; VERIFY(!a.empty()); VERIFY(a.size() == 10); VERIFY(a.validate()); eastl::list b(eastl::move(a)); VERIFY(a.empty()); VERIFY(!b.empty()); VERIFY(a.size() == 0); VERIFY(b.size() == 10); VERIFY(a != b); VERIFY(a.size() != b.size()); VERIFY(a.validate()); VERIFY(b.validate()); } // list(std::initializer_list ilist, const allocator_type& allocator = EASTL_LIST_DEFAULT_ALLOCATOR); { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::for_each(a.begin(), a.end(), [&](int e) { static int inc = 0; VERIFY(inc++ == e); }); } // list(InputIterator first, InputIterator last); { eastl::list ref = {3, 4, 5, 6, 7}; eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto start = a.begin(); eastl::advance(start, 3); auto end = start; eastl::advance(end, 5); eastl::list b(start, end); VERIFY(b == ref); VERIFY(a.validate()); VERIFY(b.validate()); VERIFY(a.size() == 10); VERIFY(b.size() == 5); VERIFY(!b.empty()); VERIFY(!a.empty()); } // this_type& operator=(const this_type& x); // this_type& operator=(std::initializer_list ilist); // this_type& operator=(this_type&& x); { const eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list b = a; VERIFY(a.validate()); VERIFY(b.validate()); VERIFY(a.size() == 10); VERIFY(b.size() == 10); VERIFY(!a.empty()); VERIFY(!b.empty()); VERIFY(b == a); eastl::list c = eastl::move(b); VERIFY(b.empty()); VERIFY(c == a); VERIFY(c.size() == 10); VERIFY(c.validate()); } // void swap(this_type& x); { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list b = {}; VERIFY(a.validate()); VERIFY(b.validate()); VERIFY(!a.empty()); VERIFY(b.empty()); b.swap(a); VERIFY(a.validate()); VERIFY(b.validate()); VERIFY(a.empty()); VERIFY(!b.empty()); } // void assign(size_type n, const value_type& value); { eastl::list ref = {42, 42, 42, 42}; eastl::list a = {0, 1, 2, 3}; a.assign(4, 42); VERIFY(a == ref); VERIFY(a.validate()); VERIFY(!a.empty()); VERIFY(a.size() == 4); } // void assign(InputIterator first, InputIterator last); { eastl::list ref = eastl::list{3, 4, 5, 6, 7}; eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list b; auto start = a.begin(); eastl::advance(start, 3); auto end = start; eastl::advance(end, 5); b.assign(start, end); VERIFY(b == ref); VERIFY(a.validate()); VERIFY(b.validate()); VERIFY(a.size() == 10); VERIFY(b.size() == 5); VERIFY(!b.empty()); VERIFY(!a.empty()); } // void assign(std::initializer_list ilist); { eastl::list ref = eastl::list{3, 4, 5, 6, 7}; eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list b; auto start = a.begin(); eastl::advance(start, 3); auto end = start; eastl::advance(end, 5); b.assign(start, end); VERIFY(b == ref); VERIFY(a.validate()); VERIFY(b.validate()); VERIFY(a.size() == 10); VERIFY(b.size() == 5); VERIFY(!b.empty()); VERIFY(!a.empty()); } // iterator begin() // const_iterator begin() const // const_iterator cbegin() const // iterator end() // const_iterator end() const // const_iterator cend() const { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; { static int inc = 0; auto iter = a.begin(); while(iter != a.end()) { VERIFY(*iter++ == inc++); } } { static int inc = 0; auto iter = a.cbegin(); while(iter != a.cend()) { VERIFY(*iter++ == inc++); } } } // reverse_iterator rbegin() // const_reverse_iterator rbegin() const // const_reverse_iterator crbegin() const // reverse_iterator rend() // const_reverse_iterator rend() const // const_reverse_iterator crend() const { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; { static int inc = 9; auto iter = a.rbegin(); while(iter != a.rend()) { VERIFY(*iter == inc--); iter++; } } { static int inc = 9; auto iter = a.crbegin(); while(iter != a.crend()) { VERIFY(*iter == inc--); iter++; } } } // bool empty() const { { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; VERIFY(!a.empty()); } { eastl::list a = {}; VERIFY(a.empty()); } } // size_type size() const { { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; VERIFY(a.size() == 10); } { eastl::list a = {0, 1, 2, 3, 4}; VERIFY(a.size() == 5); } { eastl::list a = {0, 1}; VERIFY(a.size() == 2); } { eastl::list a = {}; VERIFY(a.size() == 0); } } // void resize(size_type n, const value_type& value); // void resize(size_type n); { { eastl::list a; a.resize(10); VERIFY(a.size() == 10); VERIFY(!a.empty()); VERIFY(eastl::all_of(a.begin(), a.end(), [](int i) { return i == 0; })); } { eastl::list a; a.resize(10, 42); VERIFY(a.size() == 10); VERIFY(!a.empty()); VERIFY(eastl::all_of(a.begin(), a.end(), [](int i) { return i == 42; })); } } // reference front(); // const_reference front() const; { { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; VERIFY(a.front() == 0); a.front() = 42; VERIFY(a.front() == 42); } { const eastl::list a = {5, 6, 7, 8, 9}; VERIFY(a.front() == 5); } { eastl::list a = {9}; VERIFY(a.front() == 9); a.front() = 42; VERIFY(a.front() == 42); } } // reference back(); // const_reference back() const; { { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; VERIFY(a.back() == 9); a.back() = 42; VERIFY(a.back() == 42); } { const eastl::list a = {5, 6, 7, 8, 9}; VERIFY(a.back() == 9); } { eastl::list a = {9}; VERIFY(a.back() == 9); a.back() = 42; VERIFY(a.back() == 42); } } // void emplace_front(Args&&... args); // void emplace_front(value_type&& value); // void emplace_front(const value_type& value); { eastl::list ref = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; eastl::list a; for(int i = 0; i < 10; i++) a.emplace_front(i); VERIFY(a == ref); } // template // void emplace_back(Args&&... args); // void emplace_back(value_type&& value); // void emplace_back(const value_type& value); { { eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a; for(int i = 0; i < 10; i++) a.emplace_back(i); VERIFY(a == ref); } { struct A { A() : mValue(0) {} A(int in) : mValue(in) {} int mValue; bool operator==(const A& other) const { return mValue == other.mValue; } }; { eastl::list ref = {{1}, {2}, {3}}; eastl::list a; a.emplace_back(1); a.emplace_back(2); a.emplace_back(3); VERIFY(a == ref); } { eastl::list ref = {{1}, {2}, {3}}; eastl::list a; a.emplace_back(A(1)); a.emplace_back(A(2)); a.emplace_back(A(3)); VERIFY(a == ref); } { eastl::list ref = {{1}, {2}, {3}}; eastl::list a; A a1(1); A a2(2); A a3(3); a.emplace_back(a1); a.emplace_back(a2); a.emplace_back(a3); VERIFY(a == ref); } } } // void push_front(const value_type& value); // void push_front(value_type&& x); // reference push_front(); { { eastl::list ref = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; eastl::list a; for(int i = 0; i < 10; i++) a.push_front(i); VERIFY(a == ref); } { eastl::list a; auto& front_ref = a.push_front(); front_ref = 42; VERIFY(a.front() == 42); } } // void* push_front_uninitialized(); { eastl::list a; for (unsigned i = 0; i < 100; i++) { VERIFY(a.push_front_uninitialized() != nullptr); VERIFY(a.size() == (i + 1)); } } // void push_back(const value_type& value); // void push_back(value_type&& x); { { eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a; for(int i = 0; i < 10; i++) a.push_back(i); VERIFY(a == ref); } { struct A { int mValue; }; eastl::list a; a.push_back(A{42}); VERIFY(a.back().mValue == 42); } } // reference push_back(); { eastl::list a; auto& back_ref = a.push_back(); back_ref = 42; VERIFY(a.back() == 42); } // void* push_back_uninitialized(); { eastl::list a; for (unsigned int i = 0; i < 100; i++) { VERIFY(a.push_back_uninitialized() != nullptr); VERIFY(a.size() == (i + 1)); } } // void pop_front(); { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; for(unsigned i = 0; i < 10; i++) { VERIFY(unsigned(a.front()) == i); a.pop_front(); } } // void pop_back(); { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; for(unsigned i = 0; i < 10; i++) { VERIFY(unsigned(a.back()) == (9 - i)); a.pop_back(); } } // iterator emplace(const_iterator position, Args&&... args); // iterator emplace(const_iterator position, value_type&& value); // iterator emplace(const_iterator position, const value_type& value); { eastl::list ref = {0, 1, 2, 3, 4, 42, 5, 6, 7, 8, 9}; eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto insert_pos = a.begin(); eastl::advance(insert_pos, 5); a.emplace(insert_pos, 42); VERIFY(a == ref); } // iterator insert(const_iterator position); // iterator insert(const_iterator position, const value_type& value); // iterator insert(const_iterator position, value_type&& x); { eastl::list ref = {0, 1, 2, 3, 4, 42, 5, 6, 7, 8, 9}; eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto insert_pos = a.begin(); eastl::advance(insert_pos, 5); a.insert(insert_pos, 42); VERIFY(a == ref); } // void insert(const_iterator position, size_type n, const value_type& value); { eastl::list ref = {0, 1, 2, 3, 4, 42, 42, 42, 42, 5, 6, 7, 8, 9}; eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto insert_pos = a.begin(); eastl::advance(insert_pos, 5); auto result = a.insert(insert_pos, 4, 42); VERIFY(a == ref); VERIFY(*result == 42); VERIFY(*(--result) == 4); } // void insert(const_iterator position, InputIterator first, InputIterator last); { eastl::list to_insert = {42, 42, 42, 42}; eastl::list ref = {0, 1, 2, 3, 4, 42, 42, 42, 42, 5, 6, 7, 8, 9}; eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto insert_pos = a.begin(); eastl::advance(insert_pos, 5); auto result = a.insert(insert_pos, to_insert.begin(), to_insert.end()); VERIFY(a == ref); VERIFY(*result == 42); VERIFY(*(--result) == 4); } // iterator insert(const_iterator position, std::initializer_list ilist); { eastl::list ref = {0, 1, 2, 3, 4, 42, 42, 42, 42, 5, 6, 7, 8, 9}; eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto insert_pos = a.begin(); eastl::advance(insert_pos, 5); a.insert(insert_pos, {42, 42, 42, 42}); VERIFY(a == ref); } // iterator erase(const_iterator position); { eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a = {0, 1, 2, 3, 4, 42, 5, 6, 7, 8, 9}; auto erase_pos = a.begin(); eastl::advance(erase_pos, 5); auto iter_after_removed = a.erase(erase_pos); VERIFY(*iter_after_removed == 5); VERIFY(a == ref); } // iterator erase(const_iterator first, const_iterator last); { eastl::list a = {0, 1, 2, 3, 4, 42, 42, 42, 42, 5, 6, 7, 8, 9}; eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto erase_begin = a.begin(); eastl::advance(erase_begin, 5); auto erase_end = erase_begin; eastl::advance(erase_end, 4); a.erase(erase_begin, erase_end); VERIFY(a == ref); } // reverse_iterator erase(const_reverse_iterator position); { eastl::list a = {0, 1, 2, 3, 4, 42, 5, 6, 7, 8, 9}; eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto erase_rbegin = a.rbegin(); eastl::advance(erase_rbegin, 5); auto iter_after_remove = a.erase(erase_rbegin); VERIFY(*iter_after_remove == 4); VERIFY(a == ref); } // reverse_iterator erase(const_reverse_iterator first, const_reverse_iterator last); { eastl::list a = {0, 1, 2, 3, 4, 42, 42, 42, 42, 5, 6, 7, 8, 9}; eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto erase_crbegin = a.crbegin(); auto erase_crend = a.crbegin(); eastl::advance(erase_crbegin, 4); eastl::advance(erase_crend, 8); auto iter_after_removed = a.erase(erase_crbegin, erase_crend); VERIFY(*iter_after_removed == 4); VERIFY(a == ref); } // void clear() { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; a.clear(); VERIFY(a.empty()); VERIFY(a.size() == 0); } // void reset_lose_memory() { typedef eastl::list IntList; typedef IntList::node_type IntListNode; const size_t kBufferCount = 10; IntListNode buffer1[kBufferCount]; IntList intList1; const size_t kAlignOfIntListNode = EA_ALIGN_OF(IntListNode); intList1.get_allocator().init(buffer1, sizeof(buffer1), sizeof(IntListNode), kAlignOfIntListNode); intList1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; VERIFY(!intList1.empty()); VERIFY(intList1.size() == 10); intList1.reset_lose_memory(); VERIFY(intList1.empty()); VERIFY(intList1.size() == 0); } // void remove(const T& x); { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list ref = {0, 1, 2, 3, 5, 6, 7, 8, 9}; a.remove(4); VERIFY(a == ref); } // void remove_if(Predicate); { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list ref = {0, 1, 2, 3, 5, 6, 7, 8, 9}; a.remove_if([](int e) { return e == 4; }); VERIFY(a == ref); } // void reverse() { eastl::list a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list ref = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; a.reverse(); VERIFY(a == ref); } // void splice(const_iterator position, this_type& x); { const eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a1 = {0, 1, 2, 3, 4}; eastl::list a2 = {5, 6, 7, 8, 9}; eastl::list a; a.splice(a.begin(), a2); a.splice(a.begin(), a1); VERIFY(a == ref); VERIFY(a1.empty()); VERIFY(a2.empty()); } // void splice(const_iterator position, this_type& x, const_iterator i); { const eastl::list ref = {0, 5}; eastl::list a1 = {-1, -1, 0}; eastl::list a2 = {-1, -1, 5}; auto a1_begin = a1.begin(); auto a2_begin = a2.begin(); eastl::advance(a1_begin, 2); eastl::advance(a2_begin, 2); eastl::list a; a.splice(a.begin(), a2, a2_begin); a.splice(a.begin(), a1, a1_begin); VERIFY(a == ref); VERIFY(!a1.empty()); VERIFY(!a2.empty()); } // void splice(const_iterator position, this_type& x, const_iterator first, const_iterator last); { const eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a1 = {-1, -1, 0, 1, 2, 3, 4, -1, -1}; eastl::list a2 = {-1, -1, 5, 6, 7, 8, 9, -1, -1}; auto a1_begin = a1.begin(); auto a2_begin = a2.begin(); auto a1_end = a1.end(); auto a2_end = a2.end(); eastl::advance(a1_begin, 2); eastl::advance(a2_begin, 2); eastl::advance(a1_end, -2); eastl::advance(a2_end, -2); eastl::list a; a.splice(a.begin(), a2, a2_begin, a2_end); a.splice(a.begin(), a1, a1_begin, a1_end); const eastl::list rref = {-1, -1, -1, -1}; // post splice reference list VERIFY(a == ref); VERIFY(a1 == rref); VERIFY(a2 == rref); } // void splice(const_iterator position, this_type&& x); { const eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a1 = {0, 1, 2, 3, 4}; eastl::list a2 = {5, 6, 7, 8, 9}; eastl::list a; a.splice(a.begin(), eastl::move(a2)); a.splice(a.begin(), eastl::move(a1)); VERIFY(a == ref); VERIFY(a1.empty()); VERIFY(a2.empty()); } // void splice(const_iterator position, this_type&& x, const_iterator i); { const eastl::list ref = {0, 5}; eastl::list a1 = {-1, -1, 0}; eastl::list a2 = {-1, -1, 5}; auto a1_begin = a1.begin(); auto a2_begin = a2.begin(); eastl::advance(a1_begin, 2); eastl::advance(a2_begin, 2); eastl::list a; a.splice(a.begin(), eastl::move(a2), a2_begin); a.splice(a.begin(), eastl::move(a1), a1_begin); VERIFY(a == ref); VERIFY(!a1.empty()); VERIFY(!a2.empty()); } // void splice(const_iterator position, this_type&& x, const_iterator first, const_iterator last); { const eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a1 = {-1, -1, 0, 1, 2, 3, 4, -1, -1}; eastl::list a2 = {-1, -1, 5, 6, 7, 8, 9, -1, -1}; auto a1_begin = a1.begin(); auto a2_begin = a2.begin(); auto a1_end = a1.end(); auto a2_end = a2.end(); eastl::advance(a1_begin, 2); eastl::advance(a2_begin, 2); eastl::advance(a1_end, -2); eastl::advance(a2_end, -2); eastl::list a; a.splice(a.begin(), eastl::move(a2), a2_begin, a2_end); a.splice(a.begin(), eastl::move(a1), a1_begin, a1_end); const eastl::list rref = {-1, -1, -1, -1}; // post splice reference list VERIFY(a == ref); VERIFY(a1 == rref); VERIFY(a2 == rref); } // void merge(this_type& x); // void merge(this_type&& x); // void merge(this_type& x, Compare compare); { eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a1 = {0, 1, 2, 3, 4}; eastl::list a2 = {5, 6, 7, 8, 9}; a1.merge(a2); VERIFY(a1 == ref); } // void merge(this_type&& x, Compare compare); { eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a1 = {0, 1, 2, 3, 4}; eastl::list a2 = {5, 6, 7, 8, 9}; a1.merge(a2, [](int lhs, int rhs) { return lhs < rhs; }); VERIFY(a1 == ref); } // void unique(); { eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9}; a.unique(); VERIFY(a == ref); } // void unique(BinaryPredicate); { static bool bBreakComparison; struct A { int mValue; bool operator==(const A& other) const { return bBreakComparison ? false : mValue == other.mValue; } }; eastl::list ref = {{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}}; eastl::list a = {{0}, {0}, {0}, {0}, {0}, {0}, {1}, {2}, {2}, {2}, {2}, {3}, {4}, {5}, {5}, {5}, {5}, {5}, {6}, {7}, {7}, {7}, {7}, {8}, {9}, {9}, {9}}; bBreakComparison = true; a.unique(); // noop because broken comparison operator VERIFY(a != ref); a.unique([](const A& lhs, const A& rhs) { return lhs.mValue == rhs.mValue; }); bBreakComparison = false; VERIFY(a == ref); } // void sort(); { eastl::list ref = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::list a = {9, 4, 5, 3, 1, 0, 6, 2, 7, 8}; a.sort(); VERIFY(a == ref); } // void sort(Compare compare); { struct A { int mValue; bool operator==(const A& other) const { return mValue == other.mValue; } }; eastl::list ref = {{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}}; eastl::list a = {{1}, {0}, {2}, {9}, {4}, {5}, {6}, {7}, {3}, {8}}; a.sort([](const A& lhs, const A& rhs) { return lhs.mValue < rhs.mValue; }); VERIFY(a == ref); } { // Test empty base-class optimization struct UnemptyDummyAllocator : eastl::dummy_allocator { int foo; }; typedef eastl::list list1; typedef eastl::list list2; EATEST_VERIFY(sizeof(list1) < sizeof(list2)); } { // Test erase / erase_if { eastl::list l = {1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::erase(l, 3); eastl::erase(l, 5); eastl::erase(l, 7); VERIFY((l == eastl::list{1, 2, 4, 6, 8, 9})); } { eastl::list l = {1, 2, 3, 4, 5, 6, 7, 8, 9}; eastl::erase_if(l, [](auto i) { return i % 2 == 0; }); VERIFY((l == eastl::list{1, 3, 5, 7, 9})); } } return nErrorCount; }