// Author: Sychov. A / 12/2020
#ifndef QUEUE_EX_H
#define QUEUE_EX_H

#ifdef __cplusplus
extern "C" {
#endif

#include "app/queue/queue.h"


///
/// \brief Initialize a queue linking the user buffer
/// \param self Pointer to the queue.
/// \param buffer Pointer to the user buffer to be used as storage
/// \param capacity Capacity of the user buffer storage
/// \return QUEUE_RC_NOERROR if no error or error code.
///
static inline int queue_init(queue_t * self, void * buffer, int16_t capacity )
{
    if( RINGBUF_RC_NO_ERROR == ringbuf_init( self, buffer, capacity ) )
    {
        return QUEUE_RC_NOERROR;
    }

    return QUEUE_RC_INIT_ERROR;
}


///
/// \brief Placing a dummy record to the end of the queue with specified size
/// \param self Pointer to the queue.
/// \param record Pointer to the record struct to place.
/// \param payload Pointer to the trailing data payload following the record struct
/// \details The record struct must specify the whole record size including the payload size
/// in @record.size, while the @record.payload must specify only the payload size (@payload)
/// \return QUEUE_RC_NOERROR if no error or error code.
///
int queue_pushback_payload(queue_t * self, queue_record_t * record, const void * payload );

///
/// \brief Getting a part of record with the payload from the queue without extracting.
/// \param self Pointer to the record queue.
/// \param record Pointer to the record to store.
/// \param recordBufferSize Size of the struct to store a part of record (minimum is sizeof(record))
/// \param payload Pointer to the payload to store.
/// \param payloadBufferSize Size of the buffer to store a part of payload.
/// \return Size of the peeked record on success, error code otherwise.
///
int queue_peek_payload(const queue_t * self, queue_record_t * record, int16_t recordBufferSize, void * payload, int16_t payloadBufferSize );

///
/// \brief Getting a part of record from the queue without extracting.
/// \param self Pointer to the record queue.
/// \param record Pointer to the record to store.
/// \param size Size of the struct to store a part of record.
/// \return Size of the peeked record on success, error code otherwise.
///
int queue_peek_n(const queue_t * self, queue_record_t * record, int16_t partSize);

#ifdef __cplusplus
}
#endif

#endif // QUEUE_EX_H
