bintools/rcomp/src/LINKLIST.CPP
changeset 0 044383f39525
--- /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 <stdlib.h>
+#include <assert.h>
+#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);
+	}