Create a new LightweightRingBuffer.h header file for the XPLAIN project to abstract...
[pub/lufa.git] / Projects / XPLAINBridge / Lib / LightweightRingBuff.h
diff --git a/Projects/XPLAINBridge/Lib/LightweightRingBuff.h b/Projects/XPLAINBridge/Lib/LightweightRingBuff.h
new file mode 100644 (file)
index 0000000..16e890c
--- /dev/null
@@ -0,0 +1,89 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2010.\r
+              \r
+  dean [at] fourwalledcubicle [dot] com\r
+      www.fourwalledcubicle.com\r
+*/\r
+\r
+/*\r
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *\r
+ *  Ultra lightweight ring buffer, for fast insertion/deletion.\r
+ */\r
\r
+#ifndef _ULW_RING_BUFF_H_\r
+#define _ULW_RING_BUFF_H_\r
+\r
+       /* Includes: */\r
+               #include <stdint.h>\r
+               #include <stdbool.h>\r
+\r
+       /* Defines: */\r
+               /** Size of each ring buffer, in bytes */\r
+               #define BUFFER_SIZE      128\r
+               \r
+               /** Type of data to store into the buffer */\r
+               #define RingBuff_Data_t  uint8_t\r
+\r
+       /* Type Defines: */\r
+               typedef struct\r
+               {\r
+                       RingBuff_Data_t  Buffer[BUFFER_SIZE];\r
+                       RingBuff_Data_t* In;\r
+                       RingBuff_Data_t* Out;\r
+               } RingBuff_t;\r
+       \r
+       /* Inline Functions: */\r
+               static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer)\r
+               {\r
+                       Buffer->In  = Buffer->Buffer;\r
+                       Buffer->Out = Buffer->Buffer;           \r
+               }\r
+               \r
+               static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)\r
+               {\r
+                       *Buffer->In = Data;\r
+               \r
+                       if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])\r
+                         Buffer->In = Buffer->Buffer;\r
+               }\r
+\r
+               static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)\r
+               {\r
+                       RingBuff_Data_t Data = *Buffer->Out;\r
+               \r
+                       if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])\r
+                         Buffer->Out = Buffer->Buffer;\r
+                         \r
+                       return Data;\r
+               }\r
+\r
+               static inline bool RingBuffer_Empty(RingBuff_t* const Buffer)\r
+               {\r
+                       return (Buffer->In == Buffer->Out);\r
+               }\r
+\r
+#endif\r
\ No newline at end of file