201 lines
4.6 KiB
C++
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;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|