/* vim: set tabstop=4 expandtab shiftwidth=4 softtabstop=4: */

/**
 * \file stack_private.h
 *
 * \brief Private header for the Stack abstract data type.
 *
 * In this implementation, the Stack abstract data type is implemented as a
 * singly-linked list.
 * The `push` operation simply adds elements to the front of the list, while the
 * `pop` operation removes elements from the front of the list.
 * The `top` operation returns the element stored in the front of the list.
 *
 * \author Your Name
 *
 * \copyright 2015 University of Piemonte Orientale, Computer Science Institute
 *
 *  This file is part of UPOalglib.
 *
 *  UPOalglib 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 3 of the License, or
 *  (at your option) any later version.
 *
 *  UPOalglib 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 UPOalglib.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef UPO_STACK_PRIVATE_H
#define UPO_STACK_PRIVATE_H


#include <stddef.h>
#include <upo/stack.h>


/** \brief Defines the structure of each node of the singly-linked list implementing the stack. */
struct upo_stack_node_s
{
    void *data; /**< User-provided data. */
    struct upo_stack_node_s *next; /**< Pointer to the next node in the list. */
};
/** \brief Defines the type of a list node. */
typedef struct upo_stack_node_s upo_stack_node_t;

/** \brief Defines the structure of the list implementing the stack. */
struct upo_stack_s
{
    upo_stack_node_t *top; /**< The front of the list. */
    size_t size; /**< The size of the list. This field allows to guarantee a constant complexity for the `size` operation. */
};


#endif /* UPO_STACK_PRIVATE_H */