mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.5 KiB
150 lines
3.5 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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
|