networksecurity/ipsec/ipsec6/src/circular.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networksecurity/ipsec/ipsec6/src/circular.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,121 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// circular.cpp - Basic circluar list for IPSEC
+// @internalComponent	for IPSEC
+//
+
+#include "circular.h"
+
+RCircularList::RCircularList()
+	/**
+	* Constructor.
+	*
+	* Ensure that the element is always a member of list,
+	* and link to self.
+	*/
+	{
+	iPrev = this;
+	iNext = this;
+	}
+	
+RCircularList::~RCircularList()
+	/**
+	* Destructor.
+	*
+	* Implicit detach.
+	*/
+	{
+	Detach();
+	}
+
+RCircularList::RCircularList(RCircularList &aList)
+	/**
+	* Constructor.
+	*
+	* Construct a circular list that includes this element
+	* and all elements, except the "head", from another
+	* circular list.
+	*
+	* @param aList The head of the other list.
+	*/
+	{
+	if (aList.iNext == &aList)
+		{
+		// The aList only contains self, nothing to steal.
+		iPrev = this;
+		iNext = this;
+		}
+	else
+		{
+		// Steal the list from aList (except aList self)
+		iPrev = aList.iPrev;
+		iNext = aList.iNext;
+		iNext->iPrev = this;
+		iPrev->iNext = this;
+
+		// Leave the aList alone in its own list.
+		aList.iNext = &aList;
+		aList.iPrev = &aList;
+		}
+	}
+
+	
+void RCircularList::Attach(RCircularList &aList)
+	/**
+	* Move an element from another list to this list.
+	*
+	* Place the new element after this.
+	*
+	* @param aList The element to move	
+	*/
+	{
+	aList.Detach();
+	aList.iPrev = this;
+	aList.iNext = iNext;
+	iNext->iPrev = &aList;
+	iNext = &aList;
+	}
+
+void RCircularList::Detach()
+	/**
+	* Remove this from whatever list it is.
+	*
+	* This element will be alone in it's own circular list.
+	*/
+	{
+	// Remove element from the old list
+	iPrev->iNext = iNext;
+	iNext->iPrev = iPrev;
+	// Link to self
+	iNext = this;
+	iPrev = this;
+	}
+	
+
+
+RCircularList* TCircularListIter::operator++(TInt)
+	/**
+	* Return the next element in the list or NULL.
+	*
+	* @return The next element or NULL.
+	*/
+	{
+	RCircularList *ptr = iNext;
+	if (ptr == &iMark)
+		return NULL;
+	
+	iNext = ptr->iNext;
+	return ptr;
+	}
+