flatUSB/utils/gen_queue.h
2024-04-08 19:25:47 +02:00

73 lines
1.6 KiB
C

#ifndef CORE_USB_UTILS_GE_QUEUE
#define CORE_USB_UTILS_GE_QUEUE
#include <stdbool.h>
#include <stdint.h>
/**
* Generic Queue.
*/
typedef struct {
uint32_t writeIdx; ///< Next block to write
uint32_t readIdx; ///< Next block to read
uint32_t length; ///< Size of circular buffer
uint32_t elemSize; ///< Element size
uint8_t elements[]; ///< Array of packets
} Queue;
/**
* Create Queue.
* @param length length of circular buffer
* @param elemSize element size
* @param mem backing memory, should be DWORD-aligned!
* @return pointer to Queue instance OR NULL on failure
*/
Queue *q_create(uint32_t length, uint32_t elemSize, uint8_t *mem);
/**
* Create Queue based on storage type.
*/
#define Q_CREATE_T(length, T, mem) q_create((length), sizeof(T), (mem))
/**
* @brief Calculate required memory size for allocating a new queue fitting
* length elements of type T.
*/
#define Q_REQ_MEM_SIZE_T(length, T) (sizeof(Queue) + (length * sizeof(T)))
/**
* Clear circular buffer.
* @param q pointer to Queue
*/
void q_clear(Queue *q);
/**
* Get number of available elements.
* @param q pointer to Queue
* @return number of available elements
*/
uint32_t q_avail(const Queue *q);
/**
* Push element to the Queue.
* @param q pointer to Queue
* @param raw pointer to raw packet
* @return true on success, false on failure (e.g.: queue full)
*/
bool q_push(Queue *q, const void *src);
/**
* Get top element.
* @param q pointer to Queue
* @return top element (COPY, NOT POINTER!)
*/
void q_top(Queue *q, void *dest);
/**
* Pop top element.
* @param q pointer to Queue
*/
void q_pop(Queue *q);
#endif /* CORE_USB_UTILS_GE_QUEUE */