*/\r
\r
/** \file\r
- * \brief Lightweight ring buffer, for fast insertion/deletion of bytes.\r
+ * \brief Lightweight ring (circular) buffer, for fast insertion/deletion of bytes.\r
*\r
* Lightweight ring buffer, for fast insertion/deletion. Multiple buffers can be created of\r
* different sizes to suit different needs.\r
/* Includes: */\r
#include "../../Common/Common.h"\r
\r
+ /* Enable C linkage for C++ Compilers: */\r
+ #if defined(__cplusplus)\r
+ extern "C" {\r
+ #endif\r
+\r
/* Type Defines: */\r
/** \brief Ring Buffer Management Structure.\r
*\r
* \param[out] Size Maximum number of bytes that can be stored in the underlying data array.\r
*/\r
static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size)\r
+ ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);\r
+ static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size)\r
{\r
GCC_FORCE_POINTER_ACCESS(Buffer);\r
\r
SetGlobalInterruptMask(CurrentGlobalInt);\r
}\r
\r
- /** Retrieves the minimum number of bytes stored in a particular buffer. This value is computed\r
- * by entering an atomic lock on the buffer while the IN and OUT locations are fetched, so that\r
- * the buffer cannot be modified while the computation takes place. This value should be cached\r
- * when reading out the contents of the buffer, so that as small a time as possible is spent\r
- * in an atomic lock.\r
+ /** Retrieves the current number of bytes stored in a particular buffer. This value is computed\r
+ * by entering an atomic lock on the buffer, so that the buffer cannot be modified while the\r
+ * computation takes place. This value should be cached when reading out the contents of the buffer,\r
+ * so that as small a time as possible is spent in an atomic lock.\r
*\r
* \note The value returned by this function is guaranteed to only be the minimum number of bytes\r
- * stored in the given buffer; this value may change as other threads write new data and so\r
+ * stored in the given buffer; this value may change as other threads write new data, thus\r
* the returned number should be used only to determine how many successive reads may safely\r
* be performed on the buffer.\r
*\r
* \param[in] Buffer Pointer to a ring buffer structure whose count is to be computed.\r
+ *\r
+ * \return Number of bytes currently stored in the buffer.\r
*/\r
+ static inline uint16_t RingBuffer_GetCount(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);\r
static inline uint16_t RingBuffer_GetCount(RingBuffer_t* const Buffer)\r
{\r
uint16_t Count;\r
return Count;\r
}\r
\r
- /** Atomically determines if the specified ring buffer contains any free space. This should\r
- * be tested before storing data to the buffer, to ensure that no data is lost due to a\r
- * buffer overrun.\r
+ /** Retrieves the free space in a particular buffer. This value is computed by entering an atomic lock\r
+ * on the buffer, so that the buffer cannot be modified while the computation takes place.\r
*\r
- * \param[in,out] Buffer Pointer to a ring buffer structure to insert into.\r
+ * \note The value returned by this function is guaranteed to only be the maximum number of bytes\r
+ * free in the given buffer; this value may change as other threads write new data, thus\r
+ * the returned number should be used only to determine how many successive writes may safely\r
+ * be performed on the buffer when there is a single writer thread.\r
*\r
- * \return Boolean \c true if the buffer contains no free space, false otherwise.\r
+ * \param[in] Buffer Pointer to a ring buffer structure whose free count is to be computed.\r
+ *\r
+ * \return Number of free bytes in the buffer.\r
*/\r
- static inline bool RingBuffer_IsFull(RingBuffer_t* const Buffer)\r
+ static inline uint16_t RingBuffer_GetFreeCount(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);\r
+ static inline uint16_t RingBuffer_GetFreeCount(RingBuffer_t* const Buffer)\r
{\r
- return (RingBuffer_GetCount(Buffer) == Buffer->Size);\r
+ return (Buffer->Size - RingBuffer_GetCount(Buffer));\r
}\r
\r
/** Atomically determines if the specified ring buffer contains any data. This should\r
*\r
* \return Boolean \c true if the buffer contains no free space, false otherwise.\r
*/\r
+ static inline bool RingBuffer_IsEmpty(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);\r
static inline bool RingBuffer_IsEmpty(RingBuffer_t* const Buffer)\r
{\r
return (RingBuffer_GetCount(Buffer) == 0);\r
}\r
\r
+ /** Atomically determines if the specified ring buffer contains any free space. This should\r
+ * be tested before storing data to the buffer, to ensure that no data is lost due to a\r
+ * buffer overrun.\r
+ *\r
+ * \param[in,out] Buffer Pointer to a ring buffer structure to insert into.\r
+ *\r
+ * \return Boolean \c true if the buffer contains no free space, false otherwise.\r
+ */\r
+ static inline bool RingBuffer_IsFull(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);\r
+ static inline bool RingBuffer_IsFull(RingBuffer_t* const Buffer)\r
+ {\r
+ return (RingBuffer_GetCount(Buffer) == Buffer->Size);\r
+ }\r
+\r
/** Inserts an element into the ring buffer.\r
*\r
* \note Only one execution thread (main program thread or an ISR) may insert into a single buffer\r
* \param[in,out] Buffer Pointer to a ring buffer structure to insert into.\r
* \param[in] Data Data element to insert into the buffer.\r
*/\r
- static inline void RingBuffer_Insert(RingBuffer_t* Buffer,\r
- const uint8_t Data)\r
+ static inline void RingBuffer_Insert(RingBuffer_t* Buffer, const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);\r
+ static inline void RingBuffer_Insert(RingBuffer_t* Buffer, const uint8_t Data)\r
{\r
GCC_FORCE_POINTER_ACCESS(Buffer);\r
\r
*\r
* \return Next data element stored in the buffer.\r
*/\r
+ static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer) ATTR_NON_NULL_PTR_ARG(1);\r
static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer)\r
{\r
GCC_FORCE_POINTER_ACCESS(Buffer);\r
*\r
* \return Next data element stored in the buffer.\r
*/\r
+ static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);\r
static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer)\r
{\r
return *Buffer->Out;\r
}\r
\r
+ /* Disable C linkage for C++ Compilers: */\r
+ #if defined(__cplusplus)\r
+ }\r
+ #endif\r
+\r
#endif\r
\r
/** @} */\r