/******************************COPYRIGHT NOTICE*******************************/
/*  (c) Centro de Regulacio Genomica                                                        */
/*  and                                                                                     */
/*  Cedric Notredame                                                                        */
/*  30 Nov 2019 - 10:22.                                                                    */
/*All rights reserved.                                                                      */
/*This file is part of T-COFFEE.                                                            */
/*                                                                                          */
/*    T-COFFEE is free software; you can redistribute it and/or modify                      */
/*    it under the terms of the GNU General Public License as published by                  */
/*    the Free Software Foundation; either version 2 of the License, or                     */
/*    (at your option) any later version.                                                   */
/*                                                                                          */
/*    T-COFFEE is distributed in the hope that it will be useful,                           */
/*    but WITHOUT ANY WARRANTY; without even the implied warranty of                        */
/*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                         */
/*    GNU General Public License for more details.                                          */
/*                                                                                          */
/*    You should have received a copy of the GNU General Public License                     */
/*    along with Foobar; if not, write to the Free Software                                 */
/*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA             */
/*...............................................                                           */
/*  If you need some more information                                                       */
/*  cedric.notredame@gmail.com                                                             */
/*...............................................                                           */
/******************************COPYRIGHT NOTICE*******************************/
#ifndef STACK_H_
#define STACK_H_

// #include "km_util.h"

typedef struct
{
	size_t size;
	size_t reserved;
	void **data;
	void *last;
} Stack;


/**
 * \brief Initializes the stack.
 * \return A pointer to a new stack.
 */
Stack*
Stack_init();

/**
 * \brief Adds a new element to the stack.
 * \param stack The stack to which the new element should be added.
 * \param data A pointer to the object to add.
 */
void
push(Stack *stack, void *data);

/**
 * \brief Return the first element on the stack (The last one added).
 * \param stack The stack.
 * \return A pointer ot the topmost element.
 */
void*
top(Stack *stack);

/**
 * \brief Removes the topmost element from the stack.
 *
 * \param stack The stack to delete.
 * \return Pointer to the element just removed from the stack.
 */
void *
pop(Stack *stack);

/**
 * \brief Deletes the stackit self and frees the memory it requires.
 * \param stack The stack to free.
 * \warning Elements still on the stack are not freed!
 */
void
delStack(Stack *stack);
#endif
