/*
* Copyright (c) 2000 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: 
*
*/


#ifndef __CSTACKDEPRECATED_INL__
#define __CSTACKDEPRECATED_INL__

// constants
const TInt KStackGranularity=32;

enum TCStackPanic
	{
	ECStackErrStackIsEmpty,
	ECStackDeleteWhenNotOwner,
	ECStackPopsWhenOwner
	};

_LIT(KCStackPanicName, "CStackDeprecated");

inline void Panic(TCStackPanic aPanic)
	{
	User::Panic(KCStackPanicName, aPanic);
	}

//
// CStack
//

template <class T, TBool StackOwnsEntry>
inline CStackDeprecated<T, StackOwnsEntry>::CStackDeprecated()
: CArrayPtrSeg<T>(KStackGranularity)
	{
	this->Reset();
	}

template <class T, TBool StackOwnsEntry>
inline CStackDeprecated<T, StackOwnsEntry>::~CStackDeprecated()
	{ 
	Clear();
	}

template <class T, TBool StackOwnsEntry>
inline void CStackDeprecated<T, StackOwnsEntry>::Clear() 
	{ 
	if (StackOwnsEntry) 
		this->ResetAndDestroy(); 
	else 
		this->Reset(); 
	}

template <class T, TBool StackOwnsEntry>
inline TBool CStackDeprecated<T, StackOwnsEntry>::IsEmpty() const 
	{ 
	return this->Count()==0;
	}

template <class T, TBool StackOwnsEntry>
inline void CStackDeprecated<T, StackOwnsEntry>::PushL(T* aItem) 
	{
	if (StackOwnsEntry)
		CleanupStack::PushL(aItem); 
	this->AppendL(aItem); 
	if (StackOwnsEntry)
		CleanupStack::Pop();
	}

template <class T, TBool StackOwnsEntry>
inline T* CStackDeprecated<T, StackOwnsEntry>::Pop() 
	{
	__ASSERT_DEBUG(!IsEmpty(), Panic(ECStackErrStackIsEmpty));
	T* item=Head(); 
	this->Delete(this->Count()-1);
	return item;
	}

template <class T, TBool StackOwnsEntry>
inline T* CStackDeprecated<T, StackOwnsEntry>::Head() const 
	{
	__ASSERT_DEBUG(!IsEmpty(), Panic(ECStackErrStackIsEmpty));
	return this->At(this->Count()-1);
	}

template <class T, TBool StackOwnsEntry>
inline T* CStackDeprecated<T, StackOwnsEntry>::Last() const 
	{
	__ASSERT_DEBUG(!IsEmpty(), Panic(ECStackErrStackIsEmpty));
	return this->At(0);
	}
	

#endif // __CSTACKDEPRECATED_INL__
