97 lines
3.1 KiB
C++
97 lines
3.1 KiB
C++
|
|
#include "cbase.h"
|
|
|
|
#include "vjolt_objectpairhash.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
static std::pair< void *, void * > CreateSortedPair( void *pObject0, void *pObject1 )
|
|
{
|
|
return std::make_pair(
|
|
pObject0 <= pObject1 ? pObject0 : pObject1,
|
|
pObject0 <= pObject1 ? pObject1 : pObject0 );
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
JoltPhysicsObjectPairHash::JoltPhysicsObjectPairHash()
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
void JoltPhysicsObjectPairHash::AddObjectPair( void *pObject0, void *pObject1 )
|
|
{
|
|
auto pair = CreateSortedPair( pObject0, pObject1 );
|
|
|
|
if ( IsObjectPairInHash( pObject0, pObject1 ) )
|
|
return;
|
|
|
|
m_PairHashes[ GetHashArrayIndex( PointerHasher{}( pair ) ) ].emplace( pair );
|
|
m_ObjectHashes[ GetHashArrayIndex( std::hash< void* >()( pObject0 ) ) ].emplace( pair );
|
|
m_ObjectHashes[ GetHashArrayIndex( std::hash< void* >()( pObject1 ) ) ].emplace( pair );
|
|
m_Objects.emplace( pObject0 );
|
|
m_Objects.emplace( pObject1 );
|
|
}
|
|
|
|
void JoltPhysicsObjectPairHash::RemoveObjectPair( void *pObject0, void *pObject1 )
|
|
{
|
|
auto pair = CreateSortedPair( pObject0, pObject1 );
|
|
|
|
if ( !IsObjectPairInHash( pObject0, pObject1 ) )
|
|
return;
|
|
|
|
m_PairHashes[ GetHashArrayIndex( PointerHasher{}( pair ) ) ].erase( pair );
|
|
m_ObjectHashes[ GetHashArrayIndex( std::hash< void* >()( pObject0 ) ) ].erase( pair );
|
|
m_ObjectHashes[ GetHashArrayIndex( std::hash< void* >()( pObject1 ) ) ].erase( pair );
|
|
m_Objects.erase( pObject0 );
|
|
m_Objects.erase( pObject1 );
|
|
}
|
|
|
|
bool JoltPhysicsObjectPairHash::IsObjectPairInHash( void *pObject0, void *pObject1 )
|
|
{
|
|
auto pair = CreateSortedPair( pObject0, pObject1 );
|
|
return Contains( m_PairHashes[GetHashArrayIndex( PointerHasher{}( pair ) )], pair );
|
|
}
|
|
|
|
void JoltPhysicsObjectPairHash::RemoveAllPairsForObject( void *pObject0 )
|
|
{
|
|
auto &objectHashes = m_ObjectHashes[ GetHashArrayIndex( std::hash< void* >()( pObject0 ) ) ];
|
|
|
|
for ( auto it = objectHashes.begin(); it != objectHashes.end(); )
|
|
{
|
|
auto pair = *it++;
|
|
|
|
RemoveObjectPair( pair.first, pair.second );
|
|
}
|
|
}
|
|
|
|
bool JoltPhysicsObjectPairHash::IsObjectInHash( void *pObject0 )
|
|
{
|
|
return Contains( m_Objects, pObject0 );
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
int JoltPhysicsObjectPairHash::GetPairCountForObject( void *pObject0 )
|
|
{
|
|
return int( m_Objects.count( pObject0 ) );
|
|
}
|
|
|
|
int JoltPhysicsObjectPairHash::GetPairListForObject( void *pObject0, int nMaxCount, void **ppObjectList )
|
|
{
|
|
auto& objectHashes = m_ObjectHashes[GetHashArrayIndex( std::hash< void* >()( pObject0 ) )];
|
|
|
|
int nCount = 0;
|
|
for ( auto it = objectHashes.begin(); it != objectHashes.end() && nCount < nMaxCount; ++it, ++nCount )
|
|
{
|
|
auto pair = *it;
|
|
ppObjectList[ nCount ] = pair.second != pObject0 ? pair.second : pair.first;
|
|
}
|
|
|
|
return nCount;
|
|
}
|