windows-nt/Source/XPSP1/NT/multimedia/directx/dplay/dpnathlp/common/classbilink.h
2020-09-26 16:20:57 +08:00

184 lines
4.2 KiB
C++

/*==========================================================================
*
* Copyright (C) 1998-1999 Microsoft Corporation. All Rights Reserved.
*
* File: ClassBilink.h
* Content: Class-based bilink
*
*
* History:
* Date By Reason
* ==== == ======
* 09/17/99 jtk Derived from bilink.c
* 08/15/00 masonb Changed assert to DNASSERT and added DNASSERT(this)
*
***************************************************************************/
#ifndef __CLASS_BILINK_H__
#define __CLASS_BILINK_H__
#include "dndbg.h"
#undef DPF_SUBCOMP
#define DPF_SUBCOMP DN_SUBCOMP_COMMON
//**********************************************************************
// Constant definitions
//**********************************************************************
//**********************************************************************
// Macro definitions
//**********************************************************************
#ifndef CONTAINING_OBJECT
#define CONTAINING_OBJECT(address, type, field) ((type *)( \
(PCHAR)(address) - \
(UINT_PTR)(&((type *)0)->field)))
#endif // CONTAINING_OBJECT
//**********************************************************************
// Structure definitions
//**********************************************************************
//**********************************************************************
// Variable definitions
//**********************************************************************
//**********************************************************************
// Function Prototypes
//**********************************************************************
//**********************************************************************
// Class definitions
//**********************************************************************
class CBilink
{
public:
CBilink(){};
~CBilink(){};
#undef DPF_MODNAME
#define DPF_MODNAME "CBilink::Initialize"
void Initialize( void )
{
DNASSERT( this != NULL );
m_pNext = this;
m_pPrev = this;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CBilink::GetNext"
CBilink *GetNext( void ) const
{
DNASSERT( this != NULL );
return m_pNext;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CBilink::GetPrev"
CBilink *GetPrev( void ) const
{
DNASSERT( this != NULL );
return m_pPrev;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CBilink::IsEmpty"
BOOL IsEmpty( void ) const
{
DNASSERT( this != NULL );
DNASSERT( m_pNext != NULL );
if ( ( m_pNext == m_pPrev ) &&
( m_pNext == this ) )
{
return TRUE;
}
return FALSE;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CBilink::IsListMember"
BOOL IsListMember( const CBilink *const pList ) const
{
CBilink * pTemp;
DNASSERT( this != NULL );
DNASSERT( pList != NULL );
pTemp = pList->GetNext();
while ( pTemp != pList )
{
if ( pTemp == this )
{
return TRUE;
}
pTemp = pTemp->GetNext();
}
return FALSE;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CBilink::InsertAfter"
void InsertAfter( CBilink* const pList )
{
DNASSERT( this != NULL );
DNASSERT( pList->m_pNext != NULL );
DNASSERT( pList->m_pPrev != NULL );
DNASSERT( !IsListMember( pList ) );
DNASSERT( IsEmpty() );
m_pNext = pList->m_pNext;
m_pPrev = pList;
pList->m_pNext->m_pPrev = this;
pList->m_pNext = this;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CBilink::InsertBefore"
void InsertBefore( CBilink* const pList )
{
DNASSERT( this != NULL );
DNASSERT( pList->m_pNext != NULL );
DNASSERT( pList->m_pPrev != NULL );
DNASSERT( !IsListMember( pList ) );
DNASSERT( IsEmpty() );
m_pNext = pList;
m_pPrev = pList->m_pPrev;
pList->m_pPrev->m_pNext = this;
pList->m_pPrev = this;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CBilink::RemoveFromList"
void RemoveFromList( void )
{
DNASSERT( this != NULL );
DNASSERT( m_pNext != NULL );
DNASSERT( m_pPrev != NULL );
DNASSERT( m_pNext->m_pPrev == this );
DNASSERT( m_pPrev->m_pNext == this );
m_pNext->m_pPrev = m_pPrev;
m_pPrev->m_pNext = m_pNext;
Initialize();
}
private:
CBilink *m_pNext;
CBilink *m_pPrev;
};
#undef DPF_MODNAME
#undef DPF_SUBCOMP
#endif // __CLASS_BILINK_H__