re-enabling serial
[clinton/Smoothieware.git] / gcc4mbed / samples / MSTest / USBDevice / USBSERIAL / CircBuffer.h
1 #ifndef CIRCBUFFER_H
2 #define CIRCBUFFER_H
3
4 template <class T>
5 class CircBuffer {
6 public:
7 CircBuffer(int length) {
8 write = 0;
9 read = 0;
10 size = length + 1;
11 buf = (T *)malloc(size * sizeof(T));
12 };
13
14 bool isFull() {
15 return ((write + 1) % size == read);
16 };
17
18 bool isEmpty() {
19 return (read == write);
20 };
21
22 void queue(T k) {
23 if (isFull()) {
24 read++;
25 read %= size;
26 }
27 buf[write++] = k;
28 write %= size;
29 }
30
31 uint16_t available() {
32 return (write >= read) ? write - read : size - read + write;
33 };
34
35 bool dequeue(T * c) {
36 bool empty = isEmpty();
37 if (!empty) {
38 *c = buf[read++];
39 read %= size;
40 }
41 return(!empty);
42 };
43
44 private:
45 volatile uint16_t write;
46 volatile uint16_t read;
47 uint16_t size;
48 T * buf;
49 };
50
51 #endif