csgo-2018-source/thirdparty/quickhull/qhList.inl
2021-07-24 21:11:47 -07:00

201 lines
4.6 KiB
C++

//--------------------------------------------------------------------------------------------------
// qhList.inl
//
// Copyright(C) 2011 by D. Gregorius. All rights reserved.
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
// qhListNode
//--------------------------------------------------------------------------------------------------
template < typename T > inline
void qhInsert( T* Node, T* Where )
{
QH_ASSERT( !qhInList( Node ) && qhInList( Where ) );
Node->Prev = Where->Prev;
Node->Next = Where;
Node->Prev->Next = Node;
Node->Next->Prev = Node;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
void qhRemove( T* Node )
{
QH_ASSERT( qhInList( Node ) );
Node->Prev->Next = Node->Next;
Node->Next->Prev = Node->Prev;
Node->Prev = NULL;
Node->Next = NULL;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
bool qhInList( T* Node )
{
return Node->Prev != NULL && Node->Next != NULL;
}
//--------------------------------------------------------------------------------------------------
// qhList
//--------------------------------------------------------------------------------------------------
template < typename T > inline
qhList< T >::qhList( void )
{
mHead.Prev = &mHead;
mHead.Next = &mHead;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
int qhList< T >::Size( void ) const
{
int Count = 0;
for ( const T* Node = Begin(); Node != End(); Node = Node->Next )
{
Count++;
}
return Count;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
bool qhList< T >::Empty( void ) const
{
return mHead.Next == &mHead;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
void qhList< T >::Clear( void )
{
mHead.Prev = &mHead;
mHead.Next = &mHead;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
void qhList< T >::PushFront( T* Node )
{
qhInsert( Node, mHead.Next );
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
void qhList< T >::PopFront( void )
{
QH_ASSERT( !Empty() );
T* Node = mHead.Next;
qhRemove( Node );
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
void qhList< T >::PushBack( T* Node )
{
qhInsert( Node, mHead.Prev );
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
void qhList< T >::PopBack( void )
{
QH_ASSERT( !Empty() );
T* Node = mHead.Prev;
qhRemove( Node );
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
void qhList< T >::Insert( T* Node, T* Where )
{
qhInsert( Node, Where );
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
void qhList< T >::Remove( T* Node )
{
qhRemove( Node );
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
int qhList< T >::IndexOf( const T* Node ) const
{
int Index = 0;
for ( const T* First = Begin(); First != End(); First = First->Next )
{
if ( First == Node )
{
return Index;
}
Index++;
}
return -1;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
T* qhList< T >::Begin( void )
{
return mHead.Next;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
const T* qhList< T >::Begin( void ) const
{
return mHead.Next;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
T* qhList< T >::End( void )
{
return &mHead;
}
//--------------------------------------------------------------------------------------------------
template < typename T > inline
const T* qhList< T >::End( void ) const
{
return &mHead;
}