aboutsummaryrefslogtreecommitdiff
path: root/test/source/TestExtra.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/source/TestExtra.cpp')
-rw-r--r--test/source/TestExtra.cpp1554
1 files changed, 0 insertions, 1554 deletions
diff --git a/test/source/TestExtra.cpp b/test/source/TestExtra.cpp
deleted file mode 100644
index 52fbd62..0000000
--- a/test/source/TestExtra.cpp
+++ /dev/null
@@ -1,1554 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Copyright (c) Electronic Arts Inc. All rights reserved.
-/////////////////////////////////////////////////////////////////////////////
-
-
-/////////////////////////////////////////////////////////////////////////////
-// Test forward delcarations
-/////////////////////////////////////////////////////////////////////////////
-
-namespace eastl
-{
- class allocator;
-
- template <typename T, typename Allocator> class basic_string;
- typedef basic_string<char, allocator> local_string8; // collides with eastl::string8 in bulkbuilds
-
- template <typename T> struct local_less {};
-
- static void UseForwardDeclaredString(local_string8*)
- {
- }
-
-
- template <typename T, typename Allocator> class vector;
- typedef vector<char, allocator> vector8;
-
- static void UseForwardDeclaredVector(vector8*)
- {
- }
-
-
- template <typename Value, typename Hash, typename Predicate, typename Allocator, bool bCacheHashCode> class hash_set;
- typedef hash_set<char, char, local_less<char>, allocator, false> hash_set8;
-
- static void UseForwardDeclaredHashSet(hash_set8*)
- {
- }
-
-
- template <typename Key, typename T, typename Compare, typename Allocator> class map;
- typedef map<char, char, local_less<char>, allocator> map8;
-
- static void UseForwardDeclaredMap(map8*)
- {
- }
-}
-
-
-#include "EASTLTest.h"
-#include <EASTL/functional.h>
-#include <EASTL/utility.h>
-#include <EASTL/memory.h>
-#include <EASTL/allocator.h>
-#include <EASTL/allocator_malloc.h>
-#include <EASTL/fixed_allocator.h>
-#include <EASTL/intrusive_list.h>
-#include <EASTL/numeric.h>
-#include <EASTL/queue.h>
-#include <EASTL/priority_queue.h>
-#include <EASTL/stack.h>
-#include <EASTL/heap.h>
-#include <EASTL/vector.h>
-#include <EASTL/deque.h>
-#include <EASTL/list.h>
-#include <EASTL/map.h>
-#include <EASTL/string.h>
-#include <EASTL/hash_set.h>
-#include <EASTL/random.h>
-#include <EASTL/bit.h>
-#include <EASTL/core_allocator_adapter.h>
-#include <EASTL/bonus/call_traits.h>
-#include <EASTL/bonus/compressed_pair.h>
-#include <EASTL/bonus/adaptors.h>
-#include <EAStdC/EAAlignment.h>
-#include <EAStdC/EAMemory.h>
-#include <EAStdC/EAString.h>
-
-#ifdef _MSC_VER
- #pragma warning(push, 0)
-#endif
-
-#include <stdio.h>
-#include <string.h>
-
-#ifndef EA_COMPILER_NO_STANDARD_CPP_LIBRARY
- #include <algorithm>
- #include <utility>
- #include <stack>
- #include <queue>
- #include <vector>
- #include <deque>
- #include <math.h>
-#endif
-
-#if defined(_MSC_VER)
- #pragma warning(pop)
-#endif
-
-
-
-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; }
- };
-
- bool operator<(const IntNode& a, const IntNode& b)
- { return a.mX < b.mX; }
-}
-
-
-
-
-
-
-struct TestClass
-{
- mutable int mX;
-
- TestClass() : mX(37) { }
-
- void Increment()
- {
- mX++;
- }
-
- void IncrementConst() const
- {
- mX++;
- }
-
- int MultiplyBy(int x)
- {
- return mX * x;
- }
-
- int MultiplyByConst(int x) const
- {
- return mX * x;
- }
-};
-
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-// TestForwardDeclarations
-//
-static int TestForwardDeclarations()
-{
- int nErrorCount = 0;
-
- eastl::local_string8 s8;
- UseForwardDeclaredString(&s8);
-
- eastl::vector8 v8;
- UseForwardDeclaredVector(&v8);
-
- eastl::hash_set8 h8;
- UseForwardDeclaredHashSet(&h8);
-
- eastl::map8 m8;
- UseForwardDeclaredMap(&m8);
-
- return nErrorCount;
-}
-
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-// fixed_pool_reference
-//
-struct fixed_pool_reference
-{
-public:
- fixed_pool_reference(const char* = NULL)
- {
- mpFixedPool = NULL;
- }
-
- fixed_pool_reference(eastl::fixed_pool& fixedPool)
- {
- mpFixedPool = &fixedPool;
- }
-
- fixed_pool_reference(const fixed_pool_reference& x)
- {
- mpFixedPool = x.mpFixedPool;
- }
-
- fixed_pool_reference& operator=(const fixed_pool_reference& x)
- {
- mpFixedPool = x.mpFixedPool;
- return *this;
- }
-
- void* allocate(size_t /*n*/, int /*flags*/ = 0)
- {
- return mpFixedPool->allocate();
- }
-
- void* allocate(size_t /*n*/, size_t /*alignment*/, size_t /*offset*/, int /*flags*/ = 0)
- {
- return mpFixedPool->allocate();
- }
-
- void deallocate(void* p, size_t /*n*/)
- {
- return mpFixedPool->deallocate(p);
- }
-
- const char* get_name() const
- {
- return "fixed_pool_reference";
- }
-
- void set_name(const char* /*pName*/)
- {
- }
-
-protected:
- friend bool operator==(const fixed_pool_reference& a, const fixed_pool_reference& b);
- friend bool operator!=(const fixed_pool_reference& a, const fixed_pool_reference& b);
-
- eastl::fixed_pool* mpFixedPool;
-};
-
-
-inline bool operator==(const fixed_pool_reference& a, const fixed_pool_reference& b)
-{
- return (a.mpFixedPool == b.mpFixedPool);
-}
-
-inline bool operator!=(const fixed_pool_reference& a, const fixed_pool_reference& b)
-{
- return (a.mpFixedPool != b.mpFixedPool);
-}
-
-
-
-
-
-// Template instantations.
-// These tell the compiler to compile all the functions for the given class.
-template class eastl::queue<int, deque<int> >;
-template class eastl::queue<Align64, deque<Align64> >;
-template class eastl::queue<TestObject, list<TestObject> >;
-//template class eastl::queue<IntNode, intrusive_list<IntNode> >;// This test has been disabled as of the addition of initializer_list support to eastl::queue. initializer_lists have const nodes, which is incompatible with intrusive_list. You can use eastl::queue<IntNode, intrusive_list<IntNode> > as long as you don't use initializer_list with it. The problem with this line of code is that it forces compilation of the entire class.
-
-
-///////////////////////////////////////////////////////////////////////////////
-// TestQueue
-//
-static int TestQueue()
-{
- int nErrorCount = 0;
-
- {
- // Exercise IntNode.
- IntNode x, y;
- EATEST_VERIFY((x < y) || !(x < y) || ((int)x < (int)y));
- }
-
- TestObject::Reset();
-
- {
- // queue(const Sequence& x = Sequence());
- queue<TestObject, list<TestObject>> toListQueue;
- queue<TestObject, list<TestObject>> toListQueue2;
-
-
- // global operators
- EATEST_VERIFY( (toListQueue == toListQueue2));
- EATEST_VERIFY(!(toListQueue != toListQueue2));
- EATEST_VERIFY( (toListQueue <= toListQueue2));
- EATEST_VERIFY( (toListQueue >= toListQueue2));
- EATEST_VERIFY(!(toListQueue < toListQueue2));
- EATEST_VERIFY(!(toListQueue > toListQueue2));
-
- // bool empty() const;
- // size_type size() const;
- EATEST_VERIFY(toListQueue.empty());
- EATEST_VERIFY(toListQueue.size() == 0);
-
-
- // void push(const value_type& value);
- // reference front();
- // const_reference front() const;
- // reference back();
- // const_reference back() const;
- toListQueue.push(TestObject(0));
- EATEST_VERIFY(toListQueue.front() == TestObject(0));
- EATEST_VERIFY(toListQueue.back() == TestObject(0));
-
- toListQueue.push(TestObject(1));
- EATEST_VERIFY(toListQueue.front() == TestObject(0));
- EATEST_VERIFY(toListQueue.back() == TestObject(1));
-
- toListQueue.push(TestObject(2));
- EATEST_VERIFY(toListQueue.front() == TestObject(0));
- EATEST_VERIFY(toListQueue.back() == TestObject(2));
- EATEST_VERIFY(!toListQueue.empty());
- EATEST_VERIFY(toListQueue.size() == 3);
-
-
- // void pop();
- toListQueue.pop();
- EATEST_VERIFY(toListQueue.front() == TestObject(1));
- EATEST_VERIFY(toListQueue.back() == TestObject(2));
-
- toListQueue.pop();
- EATEST_VERIFY(toListQueue.front() == TestObject(2));
- EATEST_VERIFY(toListQueue.back() == TestObject(2));
-
- toListQueue.pop();
- EATEST_VERIFY(toListQueue.empty());
- EATEST_VERIFY(toListQueue.size() == 0);
-
-
- // decltype(auto) emplace(Args&&... args);
- toListQueue.emplace(1);
- EATEST_VERIFY(!toListQueue.empty());
- EATEST_VERIFY(toListQueue.front() == TestObject(1));
- EATEST_VERIFY(toListQueue.size() == 1);
-
-
- // container_type& get_container();
- // const container_type& get_container() const;
- list<TestObject>& ref = toListQueue.get_container();
- EATEST_VERIFY(ref.size() == toListQueue.size());
-
-
- // queue(std::initializer_list<value_type> ilist);
- queue<int> intQueue = { 3, 4, 5 };
- EATEST_VERIFY(intQueue.size() == 3);
- EATEST_VERIFY(intQueue.front() == 3);
- intQueue.pop();
- EATEST_VERIFY(intQueue.front() == 4);
- intQueue.pop();
- EATEST_VERIFY(intQueue.front() == 5);
- }
-
-#if defined(EA_COMPILER_HAS_THREE_WAY_COMPARISON)
- {
- // queue(const Sequence& x = Sequence());
- queue<TestObject, list<TestObject>> toListQueue;
- queue<TestObject, list<TestObject>> toListQueue2;
-
-
- // global operators
- EATEST_VERIFY( ((toListQueue <=> toListQueue2) == 0));
- EATEST_VERIFY(!((toListQueue <=> toListQueue2) != 0));
- EATEST_VERIFY( ((toListQueue <=> toListQueue2) <= 0));
- EATEST_VERIFY( ((toListQueue <=> toListQueue2) >= 0));
- EATEST_VERIFY(!((toListQueue <=> toListQueue2) < 0));
- EATEST_VERIFY(!((toListQueue <=> toListQueue2) > 0));
-
- // bool empty() const;
- // size_type size() const;
- EATEST_VERIFY(toListQueue.empty());
- EATEST_VERIFY(toListQueue.size() == 0);
-
- // Verify toListQueue > toListQueue2
- toListQueue.push(TestObject(0));
- toListQueue.push(TestObject(1));
- toListQueue2.push(TestObject(0));
-
- EATEST_VERIFY(!((toListQueue <=> toListQueue2) == 0));
- EATEST_VERIFY( ((toListQueue <=> toListQueue2) != 0));
- EATEST_VERIFY( ((toListQueue <=> toListQueue2) >= 0));
- EATEST_VERIFY(!((toListQueue <=> toListQueue2) <= 0));
- EATEST_VERIFY( ((toListQueue <=> toListQueue2) > 0));
- EATEST_VERIFY(!((toListQueue <=> toListQueue2) < 0));
-
- // Verify toListQueue2 > toListQueue by element size
- toListQueue2.push(TestObject(3));
- EATEST_VERIFY(!((toListQueue <=> toListQueue2) == 0));
- EATEST_VERIFY( ((toListQueue <=> toListQueue2) != 0));
- EATEST_VERIFY( ((toListQueue <=> toListQueue2) <= 0));
- EATEST_VERIFY(!((toListQueue <=> toListQueue2) >= 0));
- EATEST_VERIFY( ((toListQueue <=> toListQueue2) < 0));
- EATEST_VERIFY(!((toListQueue <=> toListQueue2) > 0));
-
- queue<TestObject, list<TestObject>> toListQueue3;
- queue<TestObject, list<TestObject>> toListQueue4;
-
- for (int i = 0; i < 10; i++)
- {
- toListQueue3.push(TestObject(i));
- if (i < 5)
- toListQueue4.push(TestObject(i));
- }
-
- // Verify toListQueue4 is a strict subset of toListQueue3
- EATEST_VERIFY(!((toListQueue3 <=> toListQueue4) == 0));
- EATEST_VERIFY( ((toListQueue3 <=> toListQueue4) != 0));
- EATEST_VERIFY( ((toListQueue3 <=> toListQueue4) >= 0));
- EATEST_VERIFY(!((toListQueue3 <=> toListQueue4) <= 0));
- EATEST_VERIFY( ((toListQueue3 <=> toListQueue4) > 0));
- EATEST_VERIFY(!((toListQueue3 <=> toListQueue4) < 0));
-
- // Verify that even thoughn toListQueue4 has a smaller size, it's lexicographically larger
- toListQueue4.push(TestObject(11));
- EATEST_VERIFY(!((toListQueue3 <=> toListQueue4) == 0));
- EATEST_VERIFY( ((toListQueue3 <=> toListQueue4) != 0));
- EATEST_VERIFY( ((toListQueue3 <=> toListQueue4) <= 0));
- EATEST_VERIFY(!((toListQueue3 <=> toListQueue4) >= 0));
- EATEST_VERIFY( ((toListQueue3 <=> toListQueue4) < 0));
- EATEST_VERIFY(!((toListQueue3 <=> toListQueue4) > 0));
-
- }
-
- {
- queue<TestObject, list<TestObject>> toListQueue1;
- queue<TestObject, list<TestObject>> toListQueue2;
- queue<TestObject, list<TestObject>> toListQueue3;
-
- for (int i = 0; i < 10; i++)
- {
- toListQueue1.push(TestObject(i));
- toListQueue2.push(TestObject(9-i));
- if (i < 5)
- toListQueue3.push(TestObject(i));
- }
-
- struct weak_ordering_queue
- {
- queue<TestObject, list<TestObject>> queue;
- inline std::weak_ordering operator<=>(const weak_ordering_queue& b) const { return queue <=> b.queue; }
- };
-
- EATEST_VERIFY(synth_three_way{}(weak_ordering_queue{toListQueue1}, weak_ordering_queue{toListQueue2}) == std::weak_ordering::less);
- EATEST_VERIFY(synth_three_way{}(weak_ordering_queue{toListQueue3}, weak_ordering_queue{toListQueue1}) == std::weak_ordering::less);
- EATEST_VERIFY(synth_three_way{}(weak_ordering_queue{toListQueue2}, weak_ordering_queue{toListQueue1}) == std::weak_ordering::greater);
- EATEST_VERIFY(synth_three_way{}(weak_ordering_queue{toListQueue2}, weak_ordering_queue{toListQueue3}) == std::weak_ordering::greater);
- EATEST_VERIFY(synth_three_way{}(weak_ordering_queue{toListQueue1}, weak_ordering_queue{toListQueue1}) == std::weak_ordering::equivalent);
- }
- #endif
-
- {
- vector<TestObject> toVector;
- for(int i = 0; i < 100; i++)
- toVector.push_back(TestObject(i));
-
- // template <class Allocator>
- // queue(this_type&& x, const Allocator& allocator, typename eastl::enable_if<eastl::uses_allocator<container_type, Allocator>::value>::type* = NULL);
- //
- // explicit queue(container_type&& x);
- //
- // void push(value_type&& x);
-
- queue<TestObject, vector<TestObject> > toQ_0;
- queue<TestObject, vector<TestObject> > toQ_A(eastl::move(toQ_0), toQ_0.get_container().get_allocator()); // It would be better if we also tested an alternative allocator.
- EATEST_VERIFY(toQ_A.size() == 0);
- toQ_A.push(TestObject(1000));
- EATEST_VERIFY(toQ_A.size() == 1);
-
- queue<TestObject, vector<TestObject> > toQ_B(eastl::move(toQ_A), toQ_A.get_container().get_allocator()); // It would be better if we also tested an alternative allocator.
- EATEST_VERIFY((toQ_B.size() == 1) && toQ_A.empty());
-
- eastl::vector<TestObject> toVectorM(toVector);
- queue<TestObject, vector<TestObject> > toQ_C(eastl::move(toVectorM));
- EATEST_VERIFY((toQ_C.size() == toVector.size()) && toVectorM.empty());
-
- // template <class... Args>
- // void emplace_back(Args&&... args);
-
- queue<TestObject, vector<TestObject> > toQ_D;
- toQ_D.emplace(0, 1, 2);
- EATEST_VERIFY(toQ_D.size() == 1) && (toQ_D.back() == TestObject(0, 1, 2));
- }
-
-
- { // Test std namespace elements contained in queue
- #ifndef EA_COMPILER_NO_STANDARD_CPP_LIBRARY
- eastl::queue< std::pair<int, int> > stlQueue;
- stlQueue.push(std::make_pair(1, 1));
- EATEST_VERIFY(stlQueue.size() == 1);
- #endif
- }
-
-
- EATEST_VERIFY(TestObject::IsClear());
- TestObject::Reset();
-
-
- return nErrorCount;
-}
-
-
-
-
-
-
-// Template instantations.
-// These tell the compiler to compile all the functions for the given class.
-template class eastl::priority_queue<int, vector<int> >;
-template class eastl::priority_queue<Align64, deque<Align64> >;
-template class eastl::priority_queue<TestObject, vector<TestObject> >;
-template class eastl::priority_queue<float, vector<float>, less<float> >;
-
-
-///////////////////////////////////////////////////////////////////////////////
-// TestPriorityQueue
-//
-static int TestPriorityQueue()
-{
- int nErrorCount = 0;
-
- EASTLTest_Rand rng(EA::UnitTest::GetRandSeed());
-
- TestObject::Reset();
-
- {
- less<TestObject> toLess;
-
- vector<TestObject> toVector;
- for(int i = 0; i < 100; i++)
- toVector.push_back(TestObject(i));
- random_shuffle(toVector.begin(), toVector.end(), rng);
-
- list<TestObject> toList;
- for(eastl_size_t j = 0; j < 100; j++)
- toList.push_back(toVector[j]);
-
-
- // priority_queue(const Compare& compare = Compare(), const Sequence& x = Sequence());
- // template <typename InputIterator>
- // priority_queue(InputIterator first, InputIterator last, const Compare& compare = Compare(), const Sequence& x = Sequence());
- priority_queue<TestObject, vector<TestObject> > toPQ;
- priority_queue<TestObject, vector<TestObject> > toPQV(toLess, toVector);
- priority_queue<TestObject, vector<TestObject> > toPQL(toList.begin(), toList.end());
-
- EATEST_VERIFY(toPQ.empty());
- EATEST_VERIFY(toPQ.size() == 0);
-
- EATEST_VERIFY(!toPQV.empty());
- EATEST_VERIFY( toPQV.size() == toVector.size());
-
- EATEST_VERIFY(!toPQL.empty());
- EATEST_VERIFY( toPQL.size() == toList.size());
-
-
- // global operators
- EATEST_VERIFY( (toPQ != toPQL));
- EATEST_VERIFY( (toPQV == toPQL));
- EATEST_VERIFY(!(toPQV != toPQL));
- EATEST_VERIFY( (toPQV <= toPQL));
- EATEST_VERIFY( (toPQV >= toPQL));
- EATEST_VERIFY(!(toPQV < toPQL));
- EATEST_VERIFY(!(toPQV > toPQL));
-
-
- // container_type& get_container();
- // const container_type& get_container() const;
- vector<TestObject>& ref = toPQL.get_container();
- EATEST_VERIFY(ref.size() == toPQL.size());
- EATEST_VERIFY(is_heap(ref.begin(), ref.end()));
-
- // bool validate() const;
- EATEST_VERIFY(toPQL.validate());
- // To consider: Verify that validate detects an invalid heap.
- // Testing this might be an issue if the validation function actively complains in some way.
-
-
- // const_reference top() const;
- // void pop();
- const TestObject& to1 = toPQL.top();
- EATEST_VERIFY(to1 == TestObject(99));
-
- toPQL.pop();
- EATEST_VERIFY(!toPQL.empty());
- EATEST_VERIFY( toPQL.size() == toList.size() - 1);
- EATEST_VERIFY(to1 == TestObject(98));
- EATEST_VERIFY(is_heap(ref.begin(), ref.end()));
-
-
- // void push(const value_type& value);
- toPQL.push(TestObject(1000));
- EATEST_VERIFY(toPQL.size() == toList.size());
- const TestObject& to2 = toPQL.top();
- EATEST_VERIFY(to2 == TestObject(1000));
- toPQL.pop();
- const TestObject& to3 = toPQL.top();
- EATEST_VERIFY(to3 == TestObject(98));
- EATEST_VERIFY(is_heap(ref.begin(), ref.end()));
-
-
- // void change(size_type n);
- TestObject& to4 = ref[50];
- to4 = TestObject(2000);
- toPQL.change(50);
- const TestObject& to5 = toPQL.top();
- EATEST_VERIFY(to5 == TestObject(2000));
- EATEST_VERIFY(is_heap(ref.begin(), ref.end()));
-
-
- // void remove(size_type n);
- TestObject to6 = ref[20];
- toPQL.remove(20);
- EATEST_VERIFY( toPQL.size() == toList.size() - 2);
- TestObject& to7 = ref[20];
- EATEST_VERIFY(!(to6 == to7));
- EATEST_VERIFY(is_heap(ref.begin(), ref.end()));
-
-
- // priority_queue(std::initializer_list<value_type> ilist, const compare_type& compare = compare_type());
- #if !defined(EA_COMPILER_NO_INITIALIZER_LISTS)
- priority_queue<int, vector<int> > intPQ = { 3, 4, 5 };
- EATEST_VERIFY(intPQ.size() == 3);
- EATEST_VERIFY(intPQ.top() == 5);
- intPQ.pop();
- EATEST_VERIFY(intPQ.top() == 4);
- intPQ.pop();
- EATEST_VERIFY(intPQ.top() == 3);
- #endif
- }
-
- {
- vector<TestObject> toVector;
- for(int i = 0; i < 100; i++)
- toVector.push_back(TestObject(i));
-
- // template <class Allocator>
- // priority_queue(this_type&& x, const Allocator& allocator, typename eastl::enable_if<eastl::uses_allocator<container_type, Allocator>::value>::type* = NULL);
- //
- // explicit priority_queue(const compare_type& compare, container_type&& x);
- //
- // template <class InputIterator>
- // priority_queue(InputIterator first, InputIterator last, const compare_type& compare, container_type&& x);
- //
- // void push(value_type&& x);
-
- priority_queue<TestObject, vector<TestObject> > toPQ_0;
- priority_queue<TestObject, vector<TestObject> > toPQ_A(toPQ_0.get_container().begin(), toPQ_0.get_container().begin(), eastl::less<TestObject>(), toPQ_0.get_container());
- EATEST_VERIFY(toPQ_A.size() == 0);
- toPQ_A.push(TestObject(1000));
- EATEST_VERIFY(toPQ_A.size() == 1);
-
- priority_queue<TestObject, vector<TestObject> > toPQ_B(eastl::move(toPQ_A), toPQ_A.get_container().get_allocator()); // It would be better if we also tested an alternative allocator.
- EATEST_VERIFY((toPQ_B.size() == 1) && toPQ_A.empty());
-
- eastl::vector<TestObject> toVectorM(toVector);
- priority_queue<TestObject, vector<TestObject> > toPQ_C(eastl::less<TestObject>(), eastl::move(toVectorM));
- EATEST_VERIFY((toPQ_C.size() == toVector.size()) && toVectorM.empty());
-
- // template <class... Args>
- // void emplace(Args&&... args);
- priority_queue<TestObject, vector<TestObject> > toPQ_D;
- toPQ_D.emplace(0, 1, 2);
- EATEST_VERIFY(toPQ_D.size() == 1) && (toPQ_D.top() == TestObject(0, 1, 2));
- }
-
-
- EATEST_VERIFY(TestObject::IsClear());
- TestObject::Reset();
-
-
- return nErrorCount;
-}
-
-
-
-
-
-
-// Template instantations.
-// These tell the compiler to compile all the functions for the given class.
-template class eastl::stack<int, vector<int> >;
-template class eastl::stack<Align64, list<Align64> >;
-template class eastl::stack<TestObject, vector<TestObject> >;
-//template class eastl::stack<IntNode, intrusive_list<IntNode> >; // This test has been disabled as of the addition of initializer_list support to eastl::stack. initializer_lists have const nodes, which is incompatible with intrusive_list. You can use eastl::stack<IntNode, intrusive_list<IntNode> > as long as you don't use initializer_list with it. The problem with this line of code is that it forces compilation of the entire class.
-
-
-///////////////////////////////////////////////////////////////////////////////
-// TestStack
-//
-static int TestStack()
-{
- int nErrorCount = 0;
-
- TestObject::Reset();
-
- {
- // stack(const Sequence& x = Sequence());
- stack<TestObject, list<TestObject> > toListStack;
- stack<TestObject, list<TestObject> > toListStack2;
-
-
- // bool empty() const;
- // size_type size() const;
- EATEST_VERIFY(toListStack.empty());
- EATEST_VERIFY(toListStack.size() == 0);
-
-
- // global operators
- EATEST_VERIFY( (toListStack == toListStack2));
- EATEST_VERIFY(!(toListStack != toListStack2));
- EATEST_VERIFY( (toListStack <= toListStack2));
- EATEST_VERIFY( (toListStack >= toListStack2));
- EATEST_VERIFY(!(toListStack < toListStack2));
- EATEST_VERIFY(!(toListStack > toListStack2));
-
- // void push(const value_type& value);
- // reference top();
- // const_reference top() const;
- toListStack.push(TestObject(0));
- EATEST_VERIFY(toListStack.top() == TestObject(0));
-
- toListStack.push(TestObject(1));
- EATEST_VERIFY(toListStack.top() == TestObject(1));
-
- toListStack.push(TestObject(2));
- EATEST_VERIFY( toListStack.top() == TestObject(2));
- EATEST_VERIFY(!toListStack.empty());
- EATEST_VERIFY( toListStack.size() == 3);
-
- // void pop();
- toListStack.pop();
- EATEST_VERIFY(toListStack.top() == TestObject(1));
-
- toListStack.pop();
- EATEST_VERIFY(toListStack.top() == TestObject(0));
-
- toListStack.pop();
- EATEST_VERIFY(toListStack.empty());
- EATEST_VERIFY(toListStack.size() == 0);
-
-
- // container_type& get_container();
- // const container_type& get_container() const;
- list<TestObject>& ref = toListStack.get_container();
- EATEST_VERIFY(ref.size() == toListStack.size());
-
-
- // stack(std::initializer_list<value_type> ilist);
- #if !defined(EA_COMPILER_NO_INITIALIZER_LISTS)
- stack<int> intStack = { 3, 4, 5 };
- EATEST_VERIFY(intStack.size() == 3);
- EATEST_VERIFY(intStack.top() == 5);
- intStack.pop();
- EATEST_VERIFY(intStack.top() == 4);
- intStack.pop();
- EATEST_VERIFY(intStack.top() == 3);
- #endif
- }
-
-#if defined(EA_COMPILER_HAS_THREE_WAY_COMPARISON)
- {
- // stack(const Sequence& x = Sequence());
- stack<TestObject, list<TestObject> > toListStack;
- stack<TestObject, list<TestObject> > toListStack2;
-
- // bool empty() const;
- // size_type size() const;
- EATEST_VERIFY(toListStack.empty());
- EATEST_VERIFY(toListStack.size() == 0);
-
-
- // global operators
- EATEST_VERIFY( ((toListStack <=> toListStack2) == 0));
- EATEST_VERIFY(!((toListStack <=> toListStack2) != 0));
- EATEST_VERIFY( ((toListStack <=> toListStack2) <= 0));
- EATEST_VERIFY( ((toListStack <=> toListStack2) >= 0));
- EATEST_VERIFY(!((toListStack <=> toListStack2) < 0));
- EATEST_VERIFY(!((toListStack <=> toListStack2) > 0));
-
- toListStack.push(TestObject(0));
- toListStack.push(TestObject(1));
- toListStack2.push(TestObject(0));
-
- EATEST_VERIFY(!((toListStack <=> toListStack2) == 0));
- EATEST_VERIFY( ((toListStack <=> toListStack2) != 0));
- EATEST_VERIFY( ((toListStack <=> toListStack2) >= 0));
- EATEST_VERIFY(!((toListStack <=> toListStack2) <= 0));
- EATEST_VERIFY( ((toListStack <=> toListStack2) > 0));
- EATEST_VERIFY(!((toListStack <=> toListStack2) < 0));
-
- // Verify toListStack2 > toListStack by element size
- toListStack2.push(TestObject(3));
- EATEST_VERIFY(!((toListStack <=> toListStack2) == 0));
- EATEST_VERIFY( ((toListStack <=> toListStack2) != 0));
- EATEST_VERIFY( ((toListStack <=> toListStack2) <= 0));
- EATEST_VERIFY(!((toListStack <=> toListStack2) >= 0));
- EATEST_VERIFY( ((toListStack <=> toListStack2) < 0));
- EATEST_VERIFY(!((toListStack <=> toListStack2) > 0));
-
- stack<TestObject, list<TestObject> > toListStack3;
- stack<TestObject, list<TestObject> > toListStack4;
-
- for (int i = 0; i < 10; i++)
- {
- toListStack3.push(TestObject(i));
- if (i < 5)
- toListStack4.push(TestObject(i));
- }
-
- // Verify toListStack4 is a strict subset of toListStack3
- EATEST_VERIFY(!((toListStack3 <=> toListStack4) == 0));
- EATEST_VERIFY( ((toListStack3 <=> toListStack4) != 0));
- EATEST_VERIFY( ((toListStack3 <=> toListStack4) >= 0));
- EATEST_VERIFY(!((toListStack3 <=> toListStack4) <= 0));
- EATEST_VERIFY( ((toListStack3 <=> toListStack4) > 0));
- EATEST_VERIFY(!((toListStack3 <=> toListStack4) < 0));
-
- // Verify that even thoughn toListQueue4 has a smaller size, it's lexicographically larger
- toListStack4.push(TestObject(11));
- EATEST_VERIFY(!((toListStack3 <=> toListStack4) == 0));
- EATEST_VERIFY( ((toListStack3 <=> toListStack4) != 0));
- EATEST_VERIFY( ((toListStack3 <=> toListStack4) <= 0));
- EATEST_VERIFY(!((toListStack3 <=> toListStack4) >= 0));
- EATEST_VERIFY( ((toListStack3 <=> toListStack4) < 0));
- EATEST_VERIFY(!((toListStack3 <=> toListStack4) > 0));
- }
-
- {
- stack<TestObject, list<TestObject> > toListStack1;
- stack<TestObject, list<TestObject> > toListStack2;
- stack<TestObject, list<TestObject> > toListStack3;
-
- for (int i = 0; i < 10; i++)
- {
- toListStack1.push(TestObject(i));
- toListStack2.push(TestObject(9-i));
- if (i < 5)
- toListStack3.push(TestObject(i));
- }
-
- struct weak_ordering_stack
- {
- stack<TestObject, list<TestObject> > stack;
- inline std::weak_ordering operator<=>(const weak_ordering_stack& b) const { return stack <=> b.stack; }
- };
-
- EATEST_VERIFY(synth_three_way{}(weak_ordering_stack{toListStack1}, weak_ordering_stack{toListStack2}) == std::weak_ordering::less);
- EATEST_VERIFY(synth_three_way{}(weak_ordering_stack{toListStack3}, weak_ordering_stack{toListStack1}) == std::weak_ordering::less);
- EATEST_VERIFY(synth_three_way{}(weak_ordering_stack{toListStack2}, weak_ordering_stack{toListStack1}) == std::weak_ordering::greater);
- EATEST_VERIFY(synth_three_way{}(weak_ordering_stack{toListStack2}, weak_ordering_stack{toListStack3}) == std::weak_ordering::greater);
- EATEST_VERIFY(synth_three_way{}(weak_ordering_stack{toListStack1}, weak_ordering_stack{toListStack1}) == std::weak_ordering::equivalent);
- }
-#endif
-
-
- {
- vector<TestObject> toVector;
- for(int i = 0; i < 100; i++)
- toVector.push_back(TestObject(i));
-
- // template <class Allocator>
- // stack(this_type&& x, const Allocator& allocator, typename eastl::enable_if<eastl::uses_allocator<container_type, Allocator>::value>::type* = NULL);
- //
- // explicit stack(container_type&& x);
- //
- // void push(value_type&& x);
- stack<TestObject, vector<TestObject> > toS_0;
- stack<TestObject, vector<TestObject> > toS_A(eastl::move(toS_0), toS_0.get_container().get_allocator()); // It would be better if we also tested an alternative allocator.
- EATEST_VERIFY(toS_A.size() == 0);
- toS_A.push(TestObject(1000));
- EATEST_VERIFY(toS_A.size() == 1);
-
- stack<TestObject, vector<TestObject> > toS_B(eastl::move(toS_A), toS_A.get_container().get_allocator()); // It would be better if we also tested an alternative allocator.
- EATEST_VERIFY((toS_B.size() == 1) && toS_A.empty());
-
- eastl::vector<TestObject> toVectorM(toVector);
- stack<TestObject, vector<TestObject> > toS_C(eastl::move(toVectorM));
- EATEST_VERIFY((toS_C.size() == toVector.size()) && toVectorM.empty());
-
- {
- // template <class... Args>
- // void emplace_back(Args&&... args);
- stack<TestObject, vector<TestObject>> toS_D;
- toS_D.emplace_back(0, 1, 2);
- EATEST_VERIFY(toS_D.size() == 1) && (toS_D.top() == TestObject(0, 1, 2));
- }
-
- {
- // template <class... Args>
- // decltype(auto) emplace(Args&&... args);
- stack<TestObject, vector<TestObject>> toS_D;
- auto it = toS_D.emplace(0, 1, 2);
- EATEST_VERIFY(toS_D.size() == 1) && (toS_D.top() == TestObject(0, 1, 2));
- EATEST_VERIFY(it == TestObject(0, 1, 2));
- }
- }
-
-
- EATEST_VERIFY(TestObject::IsClear());
- TestObject::Reset();
-
-
- return nErrorCount;
-}
-
-
-
-
-
-struct Size0
-{
- // Empty
-};
-
-struct Size4
-{
- uint32_t m32;
-};
-
-
-///////////////////////////////////////////////////////////////////////////////
-// TestCompressedPair
-//
-static int TestCompressedPair()
-{
- int nErrorCount = 0;
-
- compressed_pair<Size0, Size0> cp00;
- compressed_pair<Size0, Size4> cp04;
- compressed_pair<Size4, Size0> cp40;
- compressed_pair<Size4, Size4> cp44;
-
- EATEST_VERIFY(sizeof(cp00) <= 4);
- EATEST_VERIFY(sizeof(cp04) <= 4);
- EATEST_VERIFY(sizeof(cp40) <= 4);
- EATEST_VERIFY(sizeof(cp44) <= 8);
-
- return nErrorCount;
-}
-
-
-
-
-
-
-template <typename T>
-struct CallTraitsContainer
-{
- typedef typename eastl::call_traits<T>::param_type param_type;
- typedef typename eastl::call_traits<T>::reference reference;
- typedef typename eastl::call_traits<T>::const_reference const_reference;
- typedef typename eastl::call_traits<T>::value_type result_type;
- typedef T value_type;
-
-public:
- value_type mValue;
-
-
- CallTraitsContainer() { }
- CallTraitsContainer(param_type p) : mValue(p) { }
-
- CallTraitsContainer<T>& operator=(const CallTraitsContainer<T>&) { } // Defined simply to prevent possible compiler warnings.
-
- result_type value() { return mValue; }
-
- reference get() { return mValue; }
- const_reference const_get() const { return mValue; }
-
- void call(param_type p){ }
-};
-
-
-///////////////////////////////////////////////////////////////////////////////
-// TestCallTraits
-//
-static int TestCallTraits()
-{
- int nErrorCount = 0;
-
- CallTraitsContainer<int> ctcInt;
- CallTraitsContainer<int*> ctcIntPtr;
- CallTraitsContainer<int&> ctcVoid(nErrorCount);
- CallTraitsContainer<int[3]> ctcIntArray;
-
- char buffer[128];
- sprintf(buffer, "%p %p %p %p", &ctcInt, &ctcIntPtr, &ctcVoid, &ctcIntArray);
-
- return nErrorCount;
-}
-
-
-static int AccumulateMultiply(int x, int y)
-{
- return (x * y);
-}
-
-static eastl::string AccumulateString(eastl::string s, int x)
-{
- s += '0' + static_cast<char>(x);
- return s;
-}
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-// TestNumeric
-//
-static int TestNumeric()
-{
- int nErrorCount = 0;
-
- //template <typename InputIterator, typename T>
- //T accumulate(InputIterator first, InputIterator last, T init);
- eastl::vector<int> v(5, 0);
- eastl::generate(v.begin(), v.end(), GenerateIncrementalIntegers<int>(1));
-
- int sum = eastl::accumulate(v.begin(), v.end(), 100);
- EATEST_VERIFY(sum == (100 + 1 + 2 + 3 + 4 + 5));
-
-
- // template <typename InputIterator, typename T, typename BinaryOperation>
- //T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);
-
- eastl::generate(v.begin(), v.end(), GenerateIncrementalIntegers<int>(1));
- int product = eastl::accumulate(v.begin(), v.end(), 100, AccumulateMultiply);
- EATEST_VERIFY(product == (100 * 1 * 2 * 3 * 4 * 5));
-
- eastl::generate(v.begin(), v.end(), GenerateIncrementalIntegers<int>(1));
- eastl::string s = eastl::accumulate(v.begin(), v.end(), eastl::string("0"), AccumulateString);
- EATEST_VERIFY(s == "012345");
-
-
- //template <typename InputIterator1, typename InputIterator2, typename T>
- //T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init);
- // To do.
-
- //template <typename InputIterator1, typename InputIterator2, typename T, typename BinaryOperation1, typename BinaryOperation2>
- //T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2)
- // To do.
-
- //template <typename InputIterator, typename OutputIterator>
- //OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result);
- // To do.
-
- //template <typename InputIterator, typename OutputIterator, typename BinaryOperation>
- //OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);
- // To do.
-
- return nErrorCount;
-}
-
-#if defined(EA_COMPILER_CPP20_ENABLED)
-template <typename T>
-static constexpr int SignedIntMidpoint()
-{
- int nErrorCount = 0;
-
- EATEST_VERIFY(eastl::midpoint(T(0), T(0)) == T(0));
- EATEST_VERIFY(eastl::midpoint(T(0), T(2)) == T(1));
- EATEST_VERIFY(eastl::midpoint(T(0), T(4)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(0), T(8)) == T(4));
- EATEST_VERIFY(eastl::midpoint(T(2), T(0)) == T(1));
- EATEST_VERIFY(eastl::midpoint(T(4), T(0)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(8), T(0)) == T(4));
-
- EATEST_VERIFY(eastl::midpoint(T(1), T(1)) == T(1));
- EATEST_VERIFY(eastl::midpoint(T(1), T(3)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(3), T(1)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(2), T(6)) == T(4));
- EATEST_VERIFY(eastl::midpoint(T(6), T(2)) == T(4));
-
- EATEST_VERIFY(eastl::midpoint(T(-1), T(-1)) == T(-1));
- EATEST_VERIFY(eastl::midpoint(T(-1), T(-3)) == T(-2));
- EATEST_VERIFY(eastl::midpoint(T(-3), T(-1)) == T(-2));
- EATEST_VERIFY(eastl::midpoint(T(-2), T(-6)) == T(-4));
- EATEST_VERIFY(eastl::midpoint(T(-6), T(-2)) == T(-4));
-
- EATEST_VERIFY(eastl::midpoint(T(-0), T(0)) == T(0));
- EATEST_VERIFY(eastl::midpoint(T(0), T(-0)) == T(0));
- EATEST_VERIFY(eastl::midpoint(T(-0), T(-0)) == T(0));
- EATEST_VERIFY(eastl::midpoint(T(-1), T(1)) == T(0));
- EATEST_VERIFY(eastl::midpoint(T(-10), T(10)) == T(0));
- EATEST_VERIFY(eastl::midpoint(T(-3), T(7)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(-7), T(3)) == T(-2));
- EATEST_VERIFY(eastl::midpoint(T(-2), T(6)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(-6), T(2)) == T(-2));
- EATEST_VERIFY(eastl::midpoint(T(2), T(-6)) == T(-2));
- EATEST_VERIFY(eastl::midpoint(T(6), T(-2)) == T(2));
-
- // If an odd sum, midpoint should round towards the LHS operand.
- EATEST_VERIFY(eastl::midpoint(T(0), T(5)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(5), T(0)) == T(3));
- EATEST_VERIFY(eastl::midpoint(T(1), T(4)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(4), T(1)) == T(3));
- EATEST_VERIFY(eastl::midpoint(T(7), T(10)) == T(8));
- EATEST_VERIFY(eastl::midpoint(T(10), T(7)) == T(9));
- EATEST_VERIFY(eastl::midpoint(T(-1), T(2)) == T(0));
- EATEST_VERIFY(eastl::midpoint(T(2), T(-1)) == T(1));
- EATEST_VERIFY(eastl::midpoint(T(-5), T(4)) == T(-1));
- EATEST_VERIFY(eastl::midpoint(T(4), T(-5)) == T(0));
-
- // Test absolute limits
- constexpr T MIN = eastl::numeric_limits<T>::min();
- constexpr T MAX = eastl::numeric_limits<T>::max();
-
- EATEST_VERIFY(eastl::midpoint(MIN, MIN) == MIN);
- EATEST_VERIFY(eastl::midpoint(MAX, MAX) == MAX);
- EATEST_VERIFY(eastl::midpoint(MIN, MAX) == T(-1));
- EATEST_VERIFY(eastl::midpoint(MAX, MIN) == T(0));
- EATEST_VERIFY(eastl::midpoint(MIN, T(0)) == MIN / 2);
- EATEST_VERIFY(eastl::midpoint(T(0), MIN) == MIN / 2);
- EATEST_VERIFY(eastl::midpoint(MAX, T(0)) == (MAX / 2) + 1);
- EATEST_VERIFY(eastl::midpoint(T(0), MAX) == (MAX / 2));
-
- EATEST_VERIFY(eastl::midpoint(MIN, T(10)) == (MIN / 2) + 5);
- EATEST_VERIFY(eastl::midpoint(T(10), MIN) == (MIN / 2) + 5);
- EATEST_VERIFY(eastl::midpoint(MAX, T(10)) == (MAX / 2) + 5 + 1);
- EATEST_VERIFY(eastl::midpoint(T(10), MAX) == (MAX / 2) + 5);
- EATEST_VERIFY(eastl::midpoint(MIN, T(-10)) == (MIN / 2) - 5);
- EATEST_VERIFY(eastl::midpoint(T(-10), MIN) == (MIN / 2) - 5);
- EATEST_VERIFY(eastl::midpoint(MAX, T(-10)) == (MAX / 2) - 5 + 1);
- EATEST_VERIFY(eastl::midpoint(T(-10), MAX) == (MAX / 2) - 5);
-
- return nErrorCount;
-}
-
-template <typename T>
-static constexpr int UnsignedIntMidpoint()
-{
- int nErrorCount = 0;
-
- EATEST_VERIFY(eastl::midpoint(T(0), T(0)) == T(0));
- EATEST_VERIFY(eastl::midpoint(T(0), T(2)) == T(1));
- EATEST_VERIFY(eastl::midpoint(T(0), T(4)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(0), T(8)) == T(4));
- EATEST_VERIFY(eastl::midpoint(T(2), T(0)) == T(1));
- EATEST_VERIFY(eastl::midpoint(T(4), T(0)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(8), T(0)) == T(4));
-
- EATEST_VERIFY(eastl::midpoint(T(1), T(1)) == T(1));
- EATEST_VERIFY(eastl::midpoint(T(1), T(3)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(3), T(1)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(2), T(6)) == T(4));
- EATEST_VERIFY(eastl::midpoint(T(6), T(2)) == T(4));
-
- // If an odd sum, midpoint should round towards the LHS operand.
- EATEST_VERIFY(eastl::midpoint(T(0), T(5)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(5), T(0)) == T(3));
- EATEST_VERIFY(eastl::midpoint(T(1), T(4)) == T(2));
- EATEST_VERIFY(eastl::midpoint(T(4), T(1)) == T(3));
- EATEST_VERIFY(eastl::midpoint(T(7), T(10)) == T(8));
- EATEST_VERIFY(eastl::midpoint(T(10), T(7)) == T(9));
-
- // Test absolute limits
- constexpr T MIN = eastl::numeric_limits<T>::min();
- constexpr T MAX = eastl::numeric_limits<T>::max();
-
- EATEST_VERIFY(eastl::midpoint(MIN, MIN) == MIN);
- EATEST_VERIFY(eastl::midpoint(MAX, MAX) == MAX);
- EATEST_VERIFY(eastl::midpoint(MIN, MAX) == MAX / 2);
- EATEST_VERIFY(eastl::midpoint(MAX, MIN) == (MAX / 2) + 1);
- EATEST_VERIFY(eastl::midpoint(MIN, T(0)) == T(0));
- EATEST_VERIFY(eastl::midpoint(T(0), MIN) == T(0));
-
- EATEST_VERIFY(eastl::midpoint(MIN, T(10)) == (MIN / 2) + 5);
- EATEST_VERIFY(eastl::midpoint(T(10), MIN) == (MIN / 2) + 5);
- EATEST_VERIFY(eastl::midpoint(MAX, T(10)) == (MAX / 2) + 5 + 1);
- EATEST_VERIFY(eastl::midpoint(T(10), MAX) == (MAX / 2) + 5);
-
- return nErrorCount;
-}
-
-template <typename T>
-static constexpr int FloatMidpoint()
-{
- // for use with floats, double, long doubles.
- int nErrorCount = 0;
- EATEST_VERIFY(eastl::midpoint(T(0.0), T(0.0)) == T(0.0));
- EATEST_VERIFY(eastl::midpoint(T(0.0), T(2.0)) == T(1.0));
- EATEST_VERIFY(eastl::midpoint(T(0.0), T(4.0)) == T(2.0));
- EATEST_VERIFY(eastl::midpoint(T(2.0), T(0.0)) == T(1.0));
- EATEST_VERIFY(eastl::midpoint(T(4.0), T(0.0)) == T(2.0));
-
- EATEST_VERIFY(eastl::midpoint(T(0.5), T(0.5)) == T(0.5));
- EATEST_VERIFY(eastl::midpoint(T(0.0), T(0.5)) == T(0.25));
- EATEST_VERIFY(eastl::midpoint(T(0.5), T(0.0)) == T(0.25));
- EATEST_VERIFY(eastl::midpoint(T(0.5), T(1.0)) == T(0.75));
- EATEST_VERIFY(eastl::midpoint(T(1.0), T(0.5)) == T(0.75));
-
- EATEST_VERIFY(eastl::midpoint(T(-0.0), T(0.0)) == T(0.0));
- EATEST_VERIFY(eastl::midpoint(T(0.0), T(-0.0)) == T(0.0));
- EATEST_VERIFY(eastl::midpoint(T(-0.0), T(-0.0)) == T(0.0));
- EATEST_VERIFY(eastl::midpoint(T(-1.0), T(2.0)) == T(0.5));
- EATEST_VERIFY(eastl::midpoint(T(-2.0), T(1)) == T(-0.5));
- EATEST_VERIFY(eastl::midpoint(T(-3.0), T(6.0)) == T(1.5));
- EATEST_VERIFY(eastl::midpoint(T(-6.0), T(3.0)) == T(-1.5));
-
- // Test absolute limits
- const T MIN = eastl::numeric_limits<T>::min();
- const T MAX = eastl::numeric_limits<T>::max();
-
- EATEST_VERIFY(eastl::midpoint(MIN, MIN) == MIN);
- EATEST_VERIFY(eastl::midpoint(MAX, MAX) == MAX);
- EATEST_VERIFY(eastl::midpoint(MIN, MAX) == MAX / 2);
- EATEST_VERIFY(eastl::midpoint(MAX, MIN) == MAX / 2);
- EATEST_VERIFY(eastl::midpoint(-MAX, MIN) == -MAX / 2);
-
- EATEST_VERIFY(eastl::midpoint(MIN, T(9.0)) == T(4.5));
- EATEST_VERIFY(eastl::midpoint(MIN, T(-9.0)) == T(-4.5));
- EATEST_VERIFY(eastl::midpoint(T(9.0), MIN) == T(4.5));
- EATEST_VERIFY(eastl::midpoint(T(-9.0), MIN) == T(-4.5));
- EATEST_VERIFY(eastl::midpoint(MAX, T(9.0)) == MAX / 2 + T(4.5));
- EATEST_VERIFY(eastl::midpoint(MAX, T(-9.0)) == MAX / 2 - T(4.5));
- EATEST_VERIFY(eastl::midpoint(T(9.0), MAX) == MAX / 2 + T(4.5));
- EATEST_VERIFY(eastl::midpoint(T(-9.0), MAX) == MAX / 2 - T(4.5));
-
- return nErrorCount;
-}
-
-template <typename T>
-static constexpr int PointerMidpoint()
-{
- int nErrorCount = 0;
-
- const T ARR[100] = {};
-
- EATEST_VERIFY(eastl::midpoint(ARR, ARR) == ARR);
- EATEST_VERIFY(eastl::midpoint(ARR, ARR + 100) == ARR + 50);
- EATEST_VERIFY(eastl::midpoint(ARR + 100, ARR) == ARR + 50);
- EATEST_VERIFY(eastl::midpoint(ARR, ARR + 25) == ARR + 12);
- EATEST_VERIFY(eastl::midpoint(ARR + 25, ARR) == ARR + 13);
- EATEST_VERIFY(eastl::midpoint(ARR, ARR + 13) == ARR + 6);
- EATEST_VERIFY(eastl::midpoint(ARR + 13, ARR) == ARR + 7);
- EATEST_VERIFY(eastl::midpoint(ARR + 50, ARR + 100) == ARR + 75);
- EATEST_VERIFY(eastl::midpoint(ARR + 100, ARR + 50) == ARR + 75);
-
- return nErrorCount;
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// TestMidpoint
-//
-static int TestMidpoint()
-{
- int nErrorCount = 0;
-
- // template <typename T>
- // constexpr eastl::enable_if_t<eastl::is_arithmetic_v<T> && !eastl::is_same_v<eastl::remove_cv_t<T>, bool>, T>
- // midpoint(const T lhs, const T rhs) EA_NOEXCEPT
- nErrorCount += SignedIntMidpoint<int>();
- nErrorCount += SignedIntMidpoint<char>();
- nErrorCount += SignedIntMidpoint<short>();
- nErrorCount += SignedIntMidpoint<long>();
- nErrorCount += SignedIntMidpoint<long long>();
-
- nErrorCount += UnsignedIntMidpoint<unsigned int>();
- nErrorCount += UnsignedIntMidpoint<unsigned char>();
- nErrorCount += UnsignedIntMidpoint<unsigned short>();
- nErrorCount += UnsignedIntMidpoint<unsigned long>();
- nErrorCount += UnsignedIntMidpoint<unsigned long long>();
-
- nErrorCount += FloatMidpoint<float>();
- nErrorCount += FloatMidpoint<double>();
- nErrorCount += FloatMidpoint<long double>();
-
- // template <typename T>
- // constexpr eastl::enable_if_t<eastl::is_object_v<T>, const T*> midpoint(const T* lhs, const T* rhs)
- nErrorCount += PointerMidpoint<int>();
- nErrorCount += PointerMidpoint<char>();
- nErrorCount += PointerMidpoint<short>();
- nErrorCount += PointerMidpoint<float>();
- nErrorCount += PointerMidpoint<double>();
- nErrorCount += PointerMidpoint<long double>();
-
- return nErrorCount;
-}
-
-
-template <typename T>
-static constexpr int FloatLerp()
-{
- int nErrorCount = 0;
-
- EATEST_VERIFY(eastl::lerp(T(0.0), T(0.0), T(0.0)) == T(0.0));
- EATEST_VERIFY(eastl::lerp(T(1.0), T(0.0), T(0.0)) == T(1.0));
- EATEST_VERIFY(eastl::lerp(T(-1.0), T(0.0), T(0.0)) == T(-1.0));
- EATEST_VERIFY(eastl::lerp(T(0.0), T(1.0), T(0.0)) == T(0.0));
- EATEST_VERIFY(eastl::lerp(T(0.0), T(-1.0), T(0.0)) == T(0.0));
- EATEST_VERIFY(eastl::lerp(T(-1.0), T(1.0), T(1.0)) == T(1.0));
- EATEST_VERIFY(eastl::lerp(T(1.0), T(-1.0), T(1.0)) == T(-1.0));
- EATEST_VERIFY(eastl::lerp(T(-1.0), T(1.0), T(0.5)) == T(0.0));
- EATEST_VERIFY(eastl::lerp(T(1.0), T(-1.0), T(0.5)) == T(0.0));
- EATEST_VERIFY(eastl::lerp(T(5.0), T(5.0), T(0.5)) == T(5.0));
- EATEST_VERIFY(eastl::lerp(T(-5.0), T(-5.0), T(0.5)) == T(-5.0));
- EATEST_VERIFY(eastl::lerp(T(1.0), T(2.0), T(1.0)) == T(2.0));
- EATEST_VERIFY(eastl::lerp(T(2.0), T(1.0), T(1.0)) == T(1.0));
- EATEST_VERIFY(eastl::lerp(T(1.0), T(2.0), T(1.0)) == T(2.0));
- EATEST_VERIFY(eastl::lerp(T(1.0), T(2.0), T(2.0)) == T(3.0));
- EATEST_VERIFY(eastl::lerp(T(2.0), T(1.0), T(2.0)) == T(0.0));
- EATEST_VERIFY(eastl::lerp(T(1.0), T(-2.0), T(2.0)) == T(-5.0));
- EATEST_VERIFY(eastl::lerp(T(-1.0), T(2.0), T(2.0)) == T(5.0));
- EATEST_VERIFY(eastl::lerp(T(-1.5), T(1.5), T(0.75)) == T(0.75));
- EATEST_VERIFY(eastl::lerp(T(0.125), T(1.75), T(0.25)) == T(0.53125));
- EATEST_VERIFY(eastl::lerp(T(-0.125), T(-1.75), T(0.5)) == T(-0.9375));
- EATEST_VERIFY(eastl::lerp(T(-0.125), T(1.5), T(2.5)) == T(3.9375));
-
- return nErrorCount;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// TestLerp
-//
-static int TestLerp()
-{
- int nErrorCount = 0;
-
- // template <class T>
- // constexpr T lerp(const T a, const T b, const T t) EA_NOEXCEPT
- nErrorCount += FloatLerp<float>();
- nErrorCount += FloatLerp<double>();
- nErrorCount += FloatLerp<long double>();
-
- return nErrorCount;
-}
-#endif
-
-
-///////////////////////////////////////////////////////////////////////////////
-// TestAdaptors
-//
-static int TestAdaptors()
-{
- int nErrorCount = 0;
-
- // reverse lvalue container
- {
- int int_data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
- eastl::vector<int> original(begin(int_data), end(int_data));
-
- eastl::vector<int> reversed;
- for(auto& e : eastl::reverse(original))
- reversed.push_back(e);
-
- eastl::reverse(begin(original), end(original));
- EATEST_VERIFY(reversed == original);
- }
-
- // reverse const lvalue container
- {
- int int_data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
- const eastl::vector<int> original(begin(int_data), end(int_data));
-
- eastl::vector<int> reversed;
- for(auto& e : eastl::reverse(original))
- reversed.push_back(e);
-
- eastl::vector<int> reversed_original(original);
- eastl::reverse(begin(reversed_original), end(reversed_original));
- EATEST_VERIFY(reversed == reversed_original);
- }
-
- // reverse rvalue container
- {
- int int_data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
- eastl::vector<int> original(begin(int_data), end(int_data));
-
- eastl::vector<int> reversed;
- for (auto& e : eastl::reverse(eastl::vector<int>(original)))
- reversed.push_back(e);
-
- eastl::reverse(begin(original), end(original));
- EATEST_VERIFY(reversed == original);
- }
-
- return nErrorCount;
-}
-
-#if defined(EA_COMPILER_CPP20_ENABLED)
-template <typename T>
-int TestHasSingleBit()
-{
- int nErrorCount = 0;
-
- VERIFY(eastl::has_single_bit(T(0)) == false);
- VERIFY(eastl::has_single_bit(T(1)) == true);
- VERIFY(eastl::has_single_bit(T(2)) == true);
- VERIFY(eastl::has_single_bit(T(3)) == false);
-
- VERIFY(eastl::has_single_bit(eastl::numeric_limits<T>::min()) == false);
- VERIFY(eastl::has_single_bit(eastl::numeric_limits<T>::max()) == false);
-
- for (int i = 4; i < eastl::numeric_limits<T>::digits; i++)
- {
- T power_of_two = static_cast<T>(T(1U) << i);
- VERIFY(eastl::has_single_bit(power_of_two));
- VERIFY(eastl::has_single_bit(static_cast<T>(power_of_two - 1)) == false);
- }
-
- return nErrorCount;
-}
-
-template <typename T>
-static int TestBitCeil()
-{
- int nErrorCount = 0;
-
- VERIFY(eastl::bit_ceil(T(0)) == T(1));
- VERIFY(eastl::bit_ceil(T(1)) == T(1));
- VERIFY(eastl::bit_ceil(T(2)) == T(2));
- VERIFY(eastl::bit_ceil(T(3)) == T(4));
-
- EA_CONSTEXPR auto DIGITS = eastl::numeric_limits<T>::digits;
- EA_CONSTEXPR auto MIN = eastl::numeric_limits<T>::min();
- EA_CONSTEXPR auto MAX = static_cast<T>(T(1) << (DIGITS - 1));
-
- VERIFY(eastl::bit_ceil(MAX) == MAX);
- VERIFY(eastl::bit_ceil(static_cast<T>(MAX - 1)) == MAX);
- VERIFY(eastl::bit_ceil(MIN) == T(1));
-
- for (int i = 4; i < eastl::numeric_limits<T>::digits; i++)
- {
- T power_of_two = static_cast<T>(T(1U) << i);
- VERIFY(eastl::bit_ceil(power_of_two) == power_of_two);
- VERIFY(eastl::bit_ceil(static_cast<T>(power_of_two - 1)) == power_of_two);
- }
-
- return nErrorCount;
-}
-
-template <typename T>
-static int TestBitFloor()
-{
- int nErrorCount = 0;
- VERIFY(eastl::bit_floor(T(0)) == T(0));
- VERIFY(eastl::bit_floor(T(1)) == T(1));
- VERIFY(eastl::bit_floor(T(2)) == T(2));
- VERIFY(eastl::bit_floor(T(3)) == T(2));
-
- EA_CONSTEXPR auto DIGITS = eastl::numeric_limits<T>::digits;
- EA_CONSTEXPR auto MIN = eastl::numeric_limits<T>::min();
- EA_CONSTEXPR auto MAX = eastl::numeric_limits<T>::max();
-
- VERIFY(eastl::bit_floor(MAX) == T(1) << (DIGITS - 1));
- VERIFY(eastl::bit_floor(MIN) == T(0));
-
- for (int i = 4; i < eastl::numeric_limits<T>::digits; i++)
- {
- T power_of_two = static_cast<T>(T(1U) << i);
- VERIFY(eastl::bit_floor(power_of_two) == power_of_two);
- VERIFY(eastl::bit_floor(static_cast<T>(power_of_two + 1)) == power_of_two);
- }
- return nErrorCount;
-}
-
-template <typename T>
-static int TestBitWidth()
-{
- int nErrorCount = 0;
-
- VERIFY(eastl::bit_width(T(0)) == T(0));
- VERIFY(eastl::bit_width(T(1)) == T(1));
- VERIFY(eastl::bit_width(T(2)) == T(2));
- VERIFY(eastl::bit_width(T(3)) == T(2));
-
- EA_CONSTEXPR auto DIGITS = eastl::numeric_limits<T>::digits;
- EA_CONSTEXPR auto MIN = eastl::numeric_limits<T>::min();
- EA_CONSTEXPR auto MAX = eastl::numeric_limits<T>::max();
-
- VERIFY(eastl::bit_width(MIN) == 0);
- VERIFY(eastl::bit_width(MAX) == DIGITS);
-
- for (int i = 4; i < eastl::numeric_limits<T>::digits; i++)
- {
- T power_of_two = static_cast<T>(T(1U) << i);
- VERIFY(eastl::bit_width(power_of_two) == static_cast<T>(i + 1));
- }
-
- return nErrorCount;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// TestPowerofTwo
-//
-static int TestPowerOfTwo()
-{
- int nErrorCount = 0;
- nErrorCount += TestHasSingleBit<unsigned int>();
- nErrorCount += TestHasSingleBit<unsigned char>();
- nErrorCount += TestHasSingleBit<unsigned short>();
- nErrorCount += TestHasSingleBit<unsigned long>();
- nErrorCount += TestHasSingleBit<unsigned long long>();
-
- nErrorCount += TestBitCeil<unsigned int>();
- nErrorCount += TestBitCeil<unsigned char>();
- nErrorCount += TestBitCeil<unsigned short>();
- nErrorCount += TestBitCeil<unsigned long>();
- nErrorCount += TestBitCeil<unsigned long long>();
-
- nErrorCount += TestBitFloor<unsigned int>();
- nErrorCount += TestBitFloor<unsigned char>();
- nErrorCount += TestBitFloor<unsigned short>();
- nErrorCount += TestBitFloor<unsigned long>();
- nErrorCount += TestBitFloor<unsigned long long>();
-
- nErrorCount += TestBitWidth<unsigned int>();
- nErrorCount += TestBitWidth<unsigned char>();
- nErrorCount += TestBitWidth<unsigned short>();
- nErrorCount += TestBitWidth<unsigned long>();
- nErrorCount += TestBitWidth<unsigned long long>();
-
- return nErrorCount;
-}
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-// TestExtra
-//
-int TestExtra()
-{
- int nErrorCount = 0;
-
- nErrorCount += TestForwardDeclarations();
- nErrorCount += TestQueue();
- nErrorCount += TestPriorityQueue();
- nErrorCount += TestStack();
- nErrorCount += TestCompressedPair();
- nErrorCount += TestCallTraits();
- nErrorCount += TestNumeric();
- nErrorCount += TestAdaptors();
-#if defined(EA_COMPILER_CPP20_ENABLED)
- nErrorCount += TestMidpoint();
- nErrorCount += TestLerp();
- nErrorCount += TestPowerOfTwo();
-#endif
-
- return nErrorCount;
-}
-
-
-
-
-
-
-
-
-
-
-
-