/*******************************************************************************
*                   Copyright 2003, Marvell Semiconductor Israel LTD.          *
* THIS CODE CONTAINS CONFIDENTIAL INFORMATION OF MARVELL.                      *
* NO RIGHTS ARE GRANTED HEREIN UNDER ANY PATENT, MASK WORK RIGHT OR COPYRIGHT  *
* OF MARVELL OR ANY THIRD PARTY. MARVELL RESERVES THE RIGHT AT ITS SOLE        *
* DISCRETION TO REQUEST THAT THIS CODE BE IMMEDIATELY RETURNED TO MARVELL.     *
* THIS CODE IS PROVIDED "AS IS". MARVELL MAKES NO WARRANTIES, EXPRESSED,       *
* IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, COMPLETENESS OR PERFORMANCE.   *
*                                                                              *
* MARVELL COMPRISES MARVELL TECHNOLOGY GROUP LTD. (MTGL) AND ITS SUBSIDIARIES, *
* MARVELL INTERNATIONAL LTD. (MIL), MARVELL TECHNOLOGY, INC. (MTI), MARVELL    *
* SEMICONDUCTOR, INC. (MSI), MARVELL ASIA PTE LTD. (MAPL), MARVELL JAPAN K.K.  *
* (MJKK), MARVELL SEMICONDUCTOR ISRAEL LTD (MSIL).                             *
********************************************************************************
* mvStack.h - Header File for :
*
* FILENAME:    $Workfile: mvStack.h $
* LAST UPDATE: $Modtime:  $
*
* DESCRIPTION:
*     This file defines simple Stack (LIFO) functionality.
*
*******************************************************************************/

#ifndef __mvStack_h__
#define __mvStack_h__

/* includes */
#include "mvTypes.h"

/* defines  */

/* typedefs */
/* Data structure describes general purpose Stack */
typedef struct {
	int stackIdx;
	int numOfElements;
	MV_U32 *stackElements;
} MV_STACK;

static INLINE MV_BOOL mvStackIsFull(void *stackHndl)
{
	MV_STACK *pStack = (MV_STACK *) stackHndl;

	if (pStack->stackIdx == pStack->numOfElements)
		return MV_TRUE;

	return MV_FALSE;
}

static INLINE MV_BOOL mvStackIsEmpty(void *stackHndl)
{
	MV_STACK *pStack = (MV_STACK *) stackHndl;

	if (pStack->stackIdx == 0)
		return MV_TRUE;

	return MV_FALSE;
}

/* Purpose: Push new element to stack
 * Inputs:
 *	- void* 	stackHndl 	- Stack handle as returned by "mvStackCreate()" function.
 *	- MV_U32	value		- New element.
 *
 * Return: MV_STATUS  	MV_FULL - Failure. Stack is full.
 *						MV_OK   - Success. Element is put to stack.
 */
static INLINE void mvStackPush(void *stackHndl, MV_U32 value)
{
	MV_STACK *pStack = (MV_STACK *) stackHndl;

#ifdef MV_RT_DEBUG
	if (pStack->stackIdx == pStack->numOfElements) {
		mvOsPrintf("mvStackPush: Stack is FULL\n");
		return;
	}
#endif /* MV_RT_DEBUG */

	pStack->stackElements[pStack->stackIdx] = value;
	pStack->stackIdx++;
}

/* Purpose: Pop element from the top of stack and copy it to "pValue"
 * Inputs:
 *	- void* 	stackHndl 	- Stack handle as returned by "mvStackCreate()" function.
 *	- MV_U32	value		- Element in the top of stack.
 *
 * Return: MV_STATUS  	MV_EMPTY - Failure. Stack is empty.
 *						MV_OK    - Success. Element is removed from the stack and
 *									copied to pValue argument
 */
static INLINE MV_U32 mvStackPop(void *stackHndl)
{
	MV_STACK *pStack = (MV_STACK *) stackHndl;

#ifdef MV_RT_DEBUG
	if (pStack->stackIdx == 0) {
		mvOsPrintf("mvStackPop: Stack is EMPTY\n");
		return 0;
	}
#endif /* MV_RT_DEBUG */

	pStack->stackIdx--;
	return pStack->stackElements[pStack->stackIdx];
}

static INLINE int mvStackIndex(void *stackHndl)
{
	MV_STACK *pStack = (MV_STACK *) stackHndl;

	return pStack->stackIdx;
}

static INLINE int mvStackFreeElements(void *stackHndl)
{
	MV_STACK *pStack = (MV_STACK *) stackHndl;

	return (pStack->numOfElements - pStack->stackIdx);
}

/* mvStack.h API list */

/* Create new Stack */
void *mvStackCreate(int numOfElements);

/* Delete existing stack */
MV_STATUS mvStackDelete(void *stackHndl);

/* Print status of the stack */
void mvStackStatus(void *stackHndl, MV_BOOL isPrintElements);

#endif /* __mvStack_h__ */
