XBee API mode library
RingBuffer.h@8:776b8dc51932, 2013-01-29 (annotated)
- Committer:
- yamaguch
- Date:
- Tue Jan 29 13:46:41 2013 +0000
- Revision:
- 8:776b8dc51932
- Child:
- 9:850306f22153
rtos support
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yamaguch | 8:776b8dc51932 | 1 | #ifndef RING_BUFFER_H |
yamaguch | 8:776b8dc51932 | 2 | #define RING_BUFFER_H |
yamaguch | 8:776b8dc51932 | 3 | |
yamaguch | 8:776b8dc51932 | 4 | #include <stdio.h> |
yamaguch | 8:776b8dc51932 | 5 | template <typename T, size_t SIZE> |
yamaguch | 8:776b8dc51932 | 6 | class RingBuffer |
yamaguch | 8:776b8dc51932 | 7 | { |
yamaguch | 8:776b8dc51932 | 8 | public: |
yamaguch | 8:776b8dc51932 | 9 | RingBuffer() : head(0), tail(0) { |
yamaguch | 8:776b8dc51932 | 10 | } |
yamaguch | 8:776b8dc51932 | 11 | |
yamaguch | 8:776b8dc51932 | 12 | int writable() { |
yamaguch | 8:776b8dc51932 | 13 | return head < tail ? tail - head - 1 : tail - head + (sizeof(buf) / sizeof(T)) - 1; |
yamaguch | 8:776b8dc51932 | 14 | } |
yamaguch | 8:776b8dc51932 | 15 | |
yamaguch | 8:776b8dc51932 | 16 | int readable() { |
yamaguch | 8:776b8dc51932 | 17 | return tail <= head ? head - tail : head - tail + (sizeof(buf) / sizeof(T)) - 1; |
yamaguch | 8:776b8dc51932 | 18 | } |
yamaguch | 8:776b8dc51932 | 19 | |
yamaguch | 8:776b8dc51932 | 20 | T putc(T c) { |
yamaguch | 8:776b8dc51932 | 21 | if (!writable()) |
yamaguch | 8:776b8dc51932 | 22 | return (T) -1; |
yamaguch | 8:776b8dc51932 | 23 | |
yamaguch | 8:776b8dc51932 | 24 | buf[head] = c; |
yamaguch | 8:776b8dc51932 | 25 | head = (head + 1) % (sizeof(buf) / sizeof(T)); |
yamaguch | 8:776b8dc51932 | 26 | |
yamaguch | 8:776b8dc51932 | 27 | return c; |
yamaguch | 8:776b8dc51932 | 28 | } |
yamaguch | 8:776b8dc51932 | 29 | |
yamaguch | 8:776b8dc51932 | 30 | int getc() { |
yamaguch | 8:776b8dc51932 | 31 | if (readable()) { |
yamaguch | 8:776b8dc51932 | 32 | T c = buf[tail]; |
yamaguch | 8:776b8dc51932 | 33 | tail = (tail + 1) % (sizeof(buf) / sizeof(T)); |
yamaguch | 8:776b8dc51932 | 34 | return c; |
yamaguch | 8:776b8dc51932 | 35 | } |
yamaguch | 8:776b8dc51932 | 36 | return -1; |
yamaguch | 8:776b8dc51932 | 37 | } |
yamaguch | 8:776b8dc51932 | 38 | |
yamaguch | 8:776b8dc51932 | 39 | T operator=(T c) { |
yamaguch | 8:776b8dc51932 | 40 | return putc(c); |
yamaguch | 8:776b8dc51932 | 41 | } |
yamaguch | 8:776b8dc51932 | 42 | |
yamaguch | 8:776b8dc51932 | 43 | operator int() { |
yamaguch | 8:776b8dc51932 | 44 | return (int) getc(); |
yamaguch | 8:776b8dc51932 | 45 | } |
yamaguch | 8:776b8dc51932 | 46 | |
yamaguch | 8:776b8dc51932 | 47 | int head, tail; |
yamaguch | 8:776b8dc51932 | 48 | T buf[SIZE]; |
yamaguch | 8:776b8dc51932 | 49 | }; |
yamaguch | 8:776b8dc51932 | 50 | |
yamaguch | 8:776b8dc51932 | 51 | #endif |