00001
00011 #ifndef _RING_BUFFER_H
00012 #define _RING_BUFFER_H
00013
00026 #define RING_BUFFER_NEW(struct_name, size, type, ...) \
00027 struct struct_name { \
00028 type queue[size]; \
00029 uint8_t start; \
00030 uint8_t end; \
00031 uint8_t buffer_size; \
00032 } __VA_ARGS__
00033
00034
00041 #define RING_BUFFER_INIT(buf, size) \
00042 do { \
00043 (buf).buffer_size = size; \
00044 } while(0)
00045
00046
00051 #define RING_BUFFER_CLEAR(buf) \
00052 do { \
00053 (buf).start = 0; \
00054 (buf).end = 0; \
00055 } while (0)
00056
00061 #define RING_BUFFER_EMPTY(buf) ((buf).start == (buf).end)
00062
00063
00068 #define RING_BUFFER_FULL(buf) \
00069 (((buf).end + 1) % (buf).buffer_size == (buf).start)
00070
00071
00079 #define RING_BUFFER_ADD(buf, val) \
00080 do { \
00081 (buf).queue[(buf).end] = val; \
00082 (buf).end = ((buf).end + 1) % (buf).buffer_size; \
00083 } while (0)
00084
00085
00095 #define RING_BUFFER_REMOVE(buf, val_ret) \
00096 do { \
00097 (val_ret) = (buf).queue[(buf).start]; \
00098 (buf).start = ((buf).start + 1) % (buf).buffer_size; \
00099 } while (0)
00100
00109 #define RING_BUFFER_PEEK(buf, val_ret) \
00110 do { \
00111 (val_ret) = (buf).queue[(buf).start]; \
00112 } while(0)
00113
00114 #endif
00115