// Copyright (c) 1999-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:
// CMStack.inl
//
//
#include <cmarkedstack.h>
/** Destructor.
It clears all marks.
*/
template <class T, TBool Owner>
inline CMarkedStack<T, Owner>::~CMarkedStack()
{
iMarks.Clear();
}
/** Marks the stack's head item.
@param aMarkType Mark type
*/
template <class T, TBool Owner>
void
inline CMarkedStack<T, Owner>::MarkL(TInt aMarkType)
{
TMarkPoint* point = new (ELeave) TMarkPoint(aMarkType, this->Count());
iMarks.PushL(point);
}
/** Removes all marks until a mark of the specified type is found.
@return Index of the stack item marked by the found mark
@param aMarkType Mark type
*/
template <class T, TBool Owner>
TInt
inline CMarkedStack<T, Owner>::RemoveMark(TInt aMarkType)
{
TMarkPoint* point = NULL;
do
{
delete point;
point = iMarks.Pop();
} while (point->iMarkType != aMarkType);
TInt stackIndex = point->iStackIndex;
delete point;
return stackIndex;
}
/** Pops and deletes items from the stack until the item marked with the specified mark type is at the head.
@param aMarkType Mark type
*/
template <class T, TBool Owner>
void
inline CMarkedStack<T, Owner>::DeleteToMark(TInt aMarkType)
{
TInt lastMark = RemoveMark(aMarkType);
while (this->Count() > lastMark)
delete this->Pop();
}
/** Pops items from the stack until the item marked with the specified mark type is at the head.
@param aMarkType Mark type
*/
template <class T, TBool Owner>
void
inline CMarkedStack<T, Owner>::ResetToMark(TInt aMarkType)
{
TInt lastMark = RemoveMark(aMarkType);
while (this->Count() > lastMark)
this->Pop();
}