a

Dependencies:   mbed mbed-rtos

include/Queue/queue.inl

Committer:
alexpirciu
Date:
2019-03-28
Revision:
1:ceee5a608e7c

File content as of revision 1:ceee5a608e7c:

/**
  ******************************************************************************
  * @file    Queue.inl
  * @author  RBRO/PJ-IU
  * @version V1.0.0
  * @date    day-month-year
  * @brief   This file contains the class definition for the queue
  *          functionality. Inlin eimplementation.
  ******************************************************************************
 */

/** @brief  Queue Class constructor
 *
 *  Constructor method
 *
 *  
 */
template <class T, unsigned int N>
CQueue<T,N>::CQueue()
    : m_buffer()
    , m_start(0)
    , m_end(N-1)
    , m_size(0)
{
}

/** @brief  Queue Class destructor
 *
 *  Destructor method
 *
 *  
 */
template <class T, unsigned int N>
CQueue<T,N>::~CQueue()
{
}

/** @brief  Is full method
 *
 *  
 *  @return    True if Queue FULL
 */
template <class T, unsigned int N>
bool CQueue<T,N>::isFull()
{
    return (m_start + 1)%N == m_end;
}

/** @brief  Is empty method
 *
 *  
 *  @return    True if Queue EMPTY
 */
template <class T, unsigned int N>
bool CQueue<T,N>::isEmpty()
{
    return (m_end + 1)%N == m_start;
}

/** @brief  Peek method
 *
 *  
 *  @return    Value on top of queue
 */
template <class T, unsigned int N>
T CQueue<T,N>::peek()
{
    return m_buffer[(m_end+1) % N];
}

/** @brief  Pop method
 * 
 *  Method for removing the item on top of the queue and returning it
 *
 *  
 *  @return    Element at top of the queue
 */
template <class T, unsigned int N>
T CQueue<T,N>::pop()
{
    if(!isEmpty())
    {
        m_end = (m_end+1) % N;
        T l_char = m_buffer[m_end];
        m_size--;
        return l_char;
    }
    else
    {
        return 0;
    }
}

/** @brief  Push method
 * 
 *  Method for inserting an item on top of the queue
 *
 *  @param f_char    element to be added to the queue
 *  @return    None
 */
template <class T, unsigned int N>
void CQueue<T,N>::push(T& f_char)
{
    if (!isFull())
    {
        m_buffer[m_start] = f_char;
        m_start = (m_start+1) % N; 
        m_size++;           
    }
}

/** @brief  Push method
 * 
 *  Method for inserting a sequence of items on top of the queue
 *
 *  @param f_char    pointer to element to be added to the queue
 *  @param f_len     number of elements to be added
 *  @return    None
 */
template <class T, unsigned int N>
inline void CQueue<T,N>::push(T *f_char, unsigned int f_len)
{
    for ( unsigned int l_idx = 0; l_idx < f_len; ++l_idx)
    {
        push(f_char[l_idx]);
    }
}

/** @brief  Get size method
 * 
 *  Returns the size of the queue
 *
 *  
 *  @return    Queue size
 */
template <class T, unsigned int N>
unsigned int CQueue<T,N>::getSize()
{
    return m_size;
}

/** @brief  Empty queue method
 *
 *  
 *  @return    None
 */
template <class T, unsigned int N>
inline void CQueue<T,N>::empty()
{
    m_start = 0;
    m_end = N-1;
    m_size = 0;
}