184 lines
4.2 KiB
C
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__
|