windows-nt/Source/XPSP1/NT/com/rpc/ndrmem/linklist.cxx

151 lines
3.5 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
//
// 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