diff -r 000000000000 -r 044383f39525 bintools/rcomp/src/LINKLIST.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bintools/rcomp/src/LINKLIST.CPP Tue Oct 27 16:36:35 2009 +0000 @@ -0,0 +1,152 @@ +/* +* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include +#include "LINKLIST.H" + +// LinkedListIterator + +LinkedListIterator::LinkedListIterator(ListItem* aItem): + iCurrentItem(aItem) + {} + +LinkedListIterator::LinkedListIterator(const LinkedList& aList): + iCurrentItem(aList.iHead) + {} + +ListItem* LinkedListIterator::operator() () + { + ListItem* p = iCurrentItem; + if(iCurrentItem) + iCurrentItem = iCurrentItem->iNext; + return p; + } + +void LinkedListIterator::Reset() + { + iCurrentItem = iList->iHead; + } + +// ListItem + +ListItem::ListItem(): + iNext(NULL) + {} + +ListItem::~ListItem() + {} + +// LinkedList + +LinkedList::LinkedList(): + iHead(NULL), + iTail(NULL) + {} + +LinkedList::~LinkedList() + {} + +void LinkedList::AddToHead(ListItem* aNewItem) + { + if(iHead) + aNewItem->iNext = iHead; + else + iTail = aNewItem; + iHead = aNewItem; + } + +void LinkedList::AddToTail(ListItem* aNewItem) + { + if(iTail) + iTail->iNext = aNewItem; + else + iHead = aNewItem; + iTail = aNewItem; + } + +void LinkedList::DeleteAll() + { + ListItem* item = iHead; + while(item) + { + ListItem* p = item; + item=item->iNext; + delete p; + } + iHead = NULL; + iTail = NULL; + } + +void LinkedList::AddAfter(ListItem* aExistingItem,ListItem* aNewItem) + { + if(aExistingItem==NULL) + AddToHead(aNewItem); + else if(aExistingItem == iTail) + AddToTail(aNewItem); + else + { + aNewItem->iNext = aExistingItem->iNext; + aExistingItem->iNext = aNewItem; + } + } + +ListItem* LinkedList::Previous(ListItem* aItem) + { + assert(aItem != NULL); + assert(iHead != NULL); + ListItem* p = iHead; + if(p == aItem) + return NULL; + while(p->iNext != aItem && p->iNext != NULL) + p = p->iNext; + assert(p->iNext == aItem); + return p; + } + +void LinkedList::RemoveItem(ListItem* aItem) + { + assert(aItem != NULL); + assert(iHead != NULL); + // If item to remove is at head of list. + if (iHead == aItem) + { + if(iTail == aItem) // Item being removed is only item in list + iTail = NULL; + iHead = aItem->iNext; + return; + } + // Search through the list for the item. + ListItem* p = iHead; + while( p && (p->iNext!=aItem)) + p = p->iNext; + assert(p!=NULL); + if (iTail == p->iNext) + iTail = p; + p->iNext = p->iNext->iNext; + } + +ListItem* LinkedList::TailItem() + { + return iTail; + } + +int LinkedList::IsEmpty() + { + return(iHead==NULL); + }