151 lines
3.5 KiB
C++
151 lines
3.5 KiB
C++
//+-------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
//
|
||
// Copyright (C) Microsoft Corporation, 1990 - 1999
|
||
//
|
||
// File: linklist.cxx
|
||
//
|
||
//--------------------------------------------------------------------------
|
||
|
||
/* --------------------------------------------------------------------
|
||
|
||
Microsoft OS/2 LAN Manager
|
||
Copyright(c) Microsoft Corp., 1990
|
||
|
||
RPC Runtime - Written by Steven Zeck
|
||
|
||
|
||
This file contains the class implementation of linked list.
|
||
-------------------------------------------------------------------- */
|
||
|
||
|
||
#include <precomp.hxx>
|
||
#include <linklist.hxx>
|
||
|
||
|
||
// ** LinkItem class implementations ** //
|
||
|
||
void LinkItem::Remove ( // delete an LinkList from a list *^
|
||
LinkList& pLLHead // pointer to Head to Remove
|
||
// Removal of a Linked List item is easy with doubly linked lists.
|
||
)/*-----------------------------------------------------------------------*/
|
||
{
|
||
ASSERT(this && (void *)&pLLHead);
|
||
|
||
if (!pLIPrev)
|
||
pLLHead.pLIHead = pLINext; // LI at head of list
|
||
|
||
else
|
||
pLIPrev->pLINext = pLINext;
|
||
|
||
if (!pLINext)
|
||
pLLHead.pLITail = pLIPrev; // LI at tail of list
|
||
|
||
else
|
||
pLINext->pLIPrev = pLIPrev;
|
||
|
||
pLLHead.Assert();
|
||
}
|
||
|
||
|
||
// ** LinkList class implementations ** //
|
||
|
||
void LinkList::Add ( // Add a new node at the head of a list
|
||
LinkItem *pLInew // allocated Item to Add
|
||
|
||
// Add the newly allocated item to the front of the linked list.
|
||
)/*-----------------------------------------------------------------------*/
|
||
{
|
||
if ( this == 0 )
|
||
{
|
||
return;
|
||
}
|
||
|
||
this->Assert();
|
||
|
||
pLInew->pLINext = pLIHead; // old head is now Next
|
||
pLInew->pLIPrev = Nil;
|
||
pLIHead = pLInew; // new is now Head
|
||
|
||
if (!pLITail) // handle empty list
|
||
|
||
pLITail = pLInew;
|
||
else {
|
||
ASSERT(pLInew->pLINext);
|
||
pLInew->pLINext->pLIPrev = pLInew; // old head points back to new
|
||
}
|
||
}
|
||
|
||
void LinkList::Append ( // Append a new node at the end of a list
|
||
LinkItem *pLInew // allocated Item to Add
|
||
|
||
)/*-----------------------------------------------------------------------*/
|
||
{
|
||
if ( this == 0 )
|
||
{
|
||
return;
|
||
}
|
||
|
||
this->Assert();
|
||
|
||
// empty lists are just like Add
|
||
|
||
if (!pLITail) {
|
||
this->Add(pLInew);
|
||
return;
|
||
}
|
||
|
||
pLInew->pLINext = Nil; // new points back to old tail
|
||
pLInew->pLIPrev = pLITail;
|
||
|
||
pLITail->pLINext = pLInew; // old tail points forward to new
|
||
pLITail = pLInew; // tail is now new
|
||
}
|
||
|
||
#ifdef LDEBUG
|
||
|
||
void LinkList::Assert( // check consistency of the class
|
||
|
||
// First check the boundary conditions for the linked list root,
|
||
// then walk the list checking the backward/forward pointers. Finial
|
||
// invoke the virtural function to check the contents of each item.
|
||
)/*-----------------------------------------------------------------------*/
|
||
{
|
||
if (!pLIHead) // empty list
|
||
ASSERT(!pLITail);
|
||
|
||
if (!pLITail)
|
||
ASSERT(!pLIHead);
|
||
|
||
for (LinkItem *pLI = pLIHead; pLI; pLI = pLI->pLINext) {
|
||
|
||
// tail should point to end of list
|
||
|
||
if (pLI->pLINext == Nil)
|
||
ASSERT(pLITail == pLI);
|
||
|
||
// first in chain, should have NIL back pointer
|
||
|
||
if (pLI->pLIPrev == Nil)
|
||
ASSERT(pLIHead == pLI);
|
||
|
||
// check back pointer of next Item points here
|
||
|
||
if (pLI->pLINext)
|
||
ASSERT(pLI->pLINext->pLIPrev == pLI);
|
||
|
||
pLI->Assert(); // check any derived data
|
||
}
|
||
|
||
}
|
||
|
||
void LinkItem::Assert(
|
||
|
||
)/*-----------------------------------------------------------------------*/
|
||
{
|
||
return; // base class has no additional members, so return
|
||
}
|
||
|
||
#endif
|