XBee API mode library
RingBuffer.h@9:850306f22153, 2013-01-29 (annotated)
- Committer:
- yamaguch
- Date:
- Tue Jan 29 14:18:18 2013 +0000
- Revision:
- 9:850306f22153
- Parent:
- 8:776b8dc51932
added copyright
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yamaguch | 9:850306f22153 | 1 | /* |
yamaguch | 9:850306f22153 | 2 | Copyright (c) 2013, Senio Networks, Inc. |
yamaguch | 9:850306f22153 | 3 | |
yamaguch | 9:850306f22153 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy |
yamaguch | 9:850306f22153 | 5 | of this software and associated documentation files (the "Software"), to deal |
yamaguch | 9:850306f22153 | 6 | in the Software without restriction, including without limitation the rights |
yamaguch | 9:850306f22153 | 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
yamaguch | 9:850306f22153 | 8 | copies of the Software, and to permit persons to whom the Software is |
yamaguch | 9:850306f22153 | 9 | furnished to do so, subject to the following conditions: |
yamaguch | 9:850306f22153 | 10 | |
yamaguch | 9:850306f22153 | 11 | The above copyright notice and this permission notice shall be included in |
yamaguch | 9:850306f22153 | 12 | all copies or substantial portions of the Software. |
yamaguch | 9:850306f22153 | 13 | |
yamaguch | 9:850306f22153 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
yamaguch | 9:850306f22153 | 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
yamaguch | 9:850306f22153 | 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
yamaguch | 9:850306f22153 | 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
yamaguch | 9:850306f22153 | 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
yamaguch | 9:850306f22153 | 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
yamaguch | 9:850306f22153 | 20 | THE SOFTWARE. |
yamaguch | 9:850306f22153 | 21 | */ |
yamaguch | 9:850306f22153 | 22 | |
yamaguch | 8:776b8dc51932 | 23 | #ifndef RING_BUFFER_H |
yamaguch | 8:776b8dc51932 | 24 | #define RING_BUFFER_H |
yamaguch | 8:776b8dc51932 | 25 | |
yamaguch | 8:776b8dc51932 | 26 | #include <stdio.h> |
yamaguch | 8:776b8dc51932 | 27 | template <typename T, size_t SIZE> |
yamaguch | 9:850306f22153 | 28 | class RingBuffer { |
yamaguch | 8:776b8dc51932 | 29 | public: |
yamaguch | 8:776b8dc51932 | 30 | RingBuffer() : head(0), tail(0) { |
yamaguch | 8:776b8dc51932 | 31 | } |
yamaguch | 8:776b8dc51932 | 32 | |
yamaguch | 8:776b8dc51932 | 33 | int writable() { |
yamaguch | 8:776b8dc51932 | 34 | return head < tail ? tail - head - 1 : tail - head + (sizeof(buf) / sizeof(T)) - 1; |
yamaguch | 8:776b8dc51932 | 35 | } |
yamaguch | 8:776b8dc51932 | 36 | |
yamaguch | 8:776b8dc51932 | 37 | int readable() { |
yamaguch | 8:776b8dc51932 | 38 | return tail <= head ? head - tail : head - tail + (sizeof(buf) / sizeof(T)) - 1; |
yamaguch | 8:776b8dc51932 | 39 | } |
yamaguch | 8:776b8dc51932 | 40 | |
yamaguch | 8:776b8dc51932 | 41 | T putc(T c) { |
yamaguch | 8:776b8dc51932 | 42 | if (!writable()) |
yamaguch | 8:776b8dc51932 | 43 | return (T) -1; |
yamaguch | 8:776b8dc51932 | 44 | |
yamaguch | 8:776b8dc51932 | 45 | buf[head] = c; |
yamaguch | 8:776b8dc51932 | 46 | head = (head + 1) % (sizeof(buf) / sizeof(T)); |
yamaguch | 8:776b8dc51932 | 47 | |
yamaguch | 8:776b8dc51932 | 48 | return c; |
yamaguch | 8:776b8dc51932 | 49 | } |
yamaguch | 8:776b8dc51932 | 50 | |
yamaguch | 8:776b8dc51932 | 51 | int getc() { |
yamaguch | 8:776b8dc51932 | 52 | if (readable()) { |
yamaguch | 8:776b8dc51932 | 53 | T c = buf[tail]; |
yamaguch | 8:776b8dc51932 | 54 | tail = (tail + 1) % (sizeof(buf) / sizeof(T)); |
yamaguch | 8:776b8dc51932 | 55 | return c; |
yamaguch | 8:776b8dc51932 | 56 | } |
yamaguch | 8:776b8dc51932 | 57 | return -1; |
yamaguch | 8:776b8dc51932 | 58 | } |
yamaguch | 8:776b8dc51932 | 59 | |
yamaguch | 8:776b8dc51932 | 60 | T operator=(T c) { |
yamaguch | 8:776b8dc51932 | 61 | return putc(c); |
yamaguch | 8:776b8dc51932 | 62 | } |
yamaguch | 8:776b8dc51932 | 63 | |
yamaguch | 8:776b8dc51932 | 64 | operator int() { |
yamaguch | 8:776b8dc51932 | 65 | return (int) getc(); |
yamaguch | 8:776b8dc51932 | 66 | } |
yamaguch | 8:776b8dc51932 | 67 | |
yamaguch | 8:776b8dc51932 | 68 | int head, tail; |
yamaguch | 8:776b8dc51932 | 69 | T buf[SIZE]; |
yamaguch | 8:776b8dc51932 | 70 | }; |
yamaguch | 8:776b8dc51932 | 71 | |
yamaguch | 8:776b8dc51932 | 72 | #endif |