mirror of
https://github.com/grumpycoders/pcsx-redux.git
synced 2025-04-02 10:41:54 -04:00
207 lines
5.6 KiB
C++
207 lines
5.6 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (c) Electronic Arts Inc. All rights reserved.
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "EASTLTest.h"
|
|
#include "TestSet.h"
|
|
#include <EASTL/fixed_set.h>
|
|
|
|
EA_DISABLE_ALL_VC_WARNINGS()
|
|
#ifndef EA_COMPILER_NO_STANDARD_CPP_LIBRARY
|
|
#include <set>
|
|
#endif
|
|
EA_RESTORE_ALL_VC_WARNINGS()
|
|
|
|
using namespace eastl;
|
|
|
|
|
|
// Template instantations.
|
|
// These tell the compiler to compile all the functions for the given class.
|
|
template class eastl::fixed_set <int, 1>;
|
|
template class eastl::fixed_multiset<float, 1>;
|
|
template class eastl::fixed_set <Align64, 1>;
|
|
template class eastl::fixed_multiset<TestObject, 1>;
|
|
|
|
|
|
template class eastl::fixed_set <int, 1, true, eastl::less<int>, MallocAllocator>;
|
|
template class eastl::fixed_multiset<float, 1, true, eastl::less<float>, MallocAllocator>;
|
|
template class eastl::fixed_set <Align64, 1, true, eastl::less<Align64>, MallocAllocator>;
|
|
template class eastl::fixed_multiset<TestObject, 1, true, eastl::less<TestObject>, MallocAllocator>;
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// typedefs
|
|
//
|
|
const eastl_size_t kContainerSize = 1000;
|
|
|
|
typedef eastl::fixed_set<int, kContainerSize> VS1;
|
|
typedef eastl::fixed_set<TestObject, kContainerSize> VS4;
|
|
typedef eastl::fixed_multiset<int, kContainerSize> VMS1;
|
|
typedef eastl::fixed_multiset<TestObject, kContainerSize> VMS4;
|
|
|
|
#ifndef EA_COMPILER_NO_STANDARD_CPP_LIBRARY
|
|
typedef std::set<int> VS3;
|
|
typedef std::set<TestObject> VS6;
|
|
typedef std::multiset<int> VMS3;
|
|
typedef std::multiset<TestObject> VMS6;
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
EA_DISABLE_VC_WARNING(6262)
|
|
int TestFixedSet()
|
|
{
|
|
int nErrorCount = 0;
|
|
|
|
#ifndef EA_COMPILER_NO_STANDARD_CPP_LIBRARY
|
|
{ // Test construction
|
|
nErrorCount += TestSetConstruction<VS1, VS3, false>();
|
|
nErrorCount += TestSetConstruction<VS4, VS6, false>();
|
|
|
|
nErrorCount += TestSetConstruction<VMS1, VMS3, true>();
|
|
nErrorCount += TestSetConstruction<VMS4, VMS6, true>();
|
|
}
|
|
|
|
|
|
{ // Test mutating functionality.
|
|
nErrorCount += TestSetMutation<VS1, VS3, false>();
|
|
nErrorCount += TestSetMutation<VS4, VS6, false>();
|
|
|
|
nErrorCount += TestSetMutation<VMS1, VMS3, true>();
|
|
nErrorCount += TestSetMutation<VMS4, VMS6, true>();
|
|
}
|
|
#endif // EA_COMPILER_NO_STANDARD_CPP_LIBRARY
|
|
|
|
|
|
{ // Test searching functionality.
|
|
nErrorCount += TestSetSearch<VS1, false>();
|
|
nErrorCount += TestSetSearch<VS4, false>();
|
|
|
|
nErrorCount += TestSetSearch<VMS1, true>();
|
|
nErrorCount += TestSetSearch<VMS4, true>();
|
|
}
|
|
|
|
|
|
{
|
|
// C++11 emplace and related functionality
|
|
nErrorCount += TestSetCpp11<eastl::fixed_set<TestObject, 32> >();
|
|
|
|
nErrorCount += TestMultisetCpp11<eastl::fixed_multiset<TestObject, 32> >();
|
|
}
|
|
|
|
|
|
{ // Test functionality specific to fixed size containers.
|
|
|
|
VS1 vs1;
|
|
VMS1 vms1;
|
|
|
|
VERIFY(vs1.max_size() == kContainerSize);
|
|
VERIFY(vms1.max_size() == kContainerSize);
|
|
}
|
|
|
|
|
|
{
|
|
// Test version *without* pool overflow.
|
|
typedef eastl::fixed_set<int, 100, false> FixedSetFalse;
|
|
FixedSetFalse fixedSet;
|
|
|
|
fixedSet.insert(FixedSetFalse::value_type(0));
|
|
VERIFY(fixedSet.size() == 1);
|
|
|
|
fixedSet.clear();
|
|
VERIFY(fixedSet.size() == 0);
|
|
|
|
for(int i = 0; fixedSet.size() < 100; i++)
|
|
fixedSet.insert(FixedSetFalse::value_type(i));
|
|
VERIFY(fixedSet.size() == 100);
|
|
|
|
// Verify that we allocated enough space for exactly N items.
|
|
// It's possible that due to alignments, there might be room for N + 1.
|
|
FixedSetFalse::allocator_type& allocator = fixedSet.get_allocator();
|
|
void* pResult = allocator.allocate(sizeof(FixedSetFalse::node_type));
|
|
if(pResult)
|
|
{
|
|
pResult = allocator.allocate(sizeof(FixedSetFalse::node_type));
|
|
VERIFY(pResult == NULL);
|
|
}
|
|
}
|
|
|
|
|
|
{
|
|
// Test version *with* pool overflow.
|
|
typedef eastl::fixed_set<int, 100, true> FixedSetTrue;
|
|
FixedSetTrue fixedSet;
|
|
|
|
fixedSet.insert(FixedSetTrue::value_type(0));
|
|
VERIFY(fixedSet.size() == 1);
|
|
|
|
fixedSet.clear();
|
|
VERIFY(fixedSet.size() == 0);
|
|
|
|
for(int i = 0; fixedSet.size() < 100; i++)
|
|
fixedSet.insert(FixedSetTrue::value_type(i));
|
|
VERIFY(fixedSet.size() == 100);
|
|
|
|
FixedSetTrue::allocator_type& allocator = fixedSet.get_allocator();
|
|
void* pResult = allocator.allocate(sizeof(FixedSetTrue::node_type));
|
|
VERIFY(pResult != NULL);
|
|
allocator.deallocate(pResult, sizeof(FixedSetTrue::node_type));
|
|
|
|
// get_overflow_allocator / set_overflow_allocator
|
|
// This is a weak test which should be improved.
|
|
EASTLAllocatorType a = fixedSet.get_allocator().get_overflow_allocator();
|
|
fixedSet.get_allocator().set_overflow_allocator(a);
|
|
}
|
|
|
|
{
|
|
// Test fixed set with overflow and alignment requirements.
|
|
typedef fixed_set<Align64, 1, true> FixedSetWithAlignment;
|
|
typedef fixed_multiset<Align64, 1, true> FixedMultiSetWithAlignment;
|
|
|
|
FixedSetWithAlignment fs;
|
|
FixedMultiSetWithAlignment fms;
|
|
|
|
Align64 a; a.mX = 1;
|
|
Align64 b; b.mX = 2;
|
|
Align64 c; c.mX = 3;
|
|
Align64 d; d.mX = 4;
|
|
Align64 e; e.mX = 5;
|
|
|
|
fs.insert(a);
|
|
fs.insert(b);
|
|
fs.insert(c);
|
|
fs.insert(d);
|
|
fs.insert(e);
|
|
for (FixedSetWithAlignment::const_iterator it = fs.begin(); it != fs.end(); ++it)
|
|
{
|
|
const Align64* ptr = &(*it);
|
|
EATEST_VERIFY((uint64_t)ptr % EASTL_ALIGN_OF(Align64) == 0);
|
|
}
|
|
fms.insert(a);
|
|
fms.insert(b);
|
|
fms.insert(c);
|
|
fms.insert(d);
|
|
fms.insert(e);
|
|
for (FixedMultiSetWithAlignment::const_iterator it = fms.begin(); it != fms.end(); ++it)
|
|
{
|
|
const Align64* ptr = &(*it);
|
|
EATEST_VERIFY((uint64_t)ptr % EASTL_ALIGN_OF(Align64) == 0);
|
|
}
|
|
}
|
|
return nErrorCount;
|
|
}
|
|
EA_RESTORE_VC_WARNING()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|