* Add existing files.
[matthijs/ABM2.git] / ABM2 / Engine / ringbuf.h
1 #ifndef RINGBUF_H_INC\r
2 #define RINGBUF_H_INC\r
3 \r
4 \r
5 template<class T, long bufSize>\r
6 class ringbuffer\r
7 {\r
8         protected:\r
9                 T buf[bufSize];\r
10                 long read, write;\r
11         public:\r
12                 ringbuffer()\r
13                 {\r
14                         read=0; write=1;\r
15                 }\r
16                 bool operator << (T &obj)\r
17                 {\r
18                         buf[write]=obj;\r
19                         ++write;\r
20                         while(write>=bufSize)write-=bufSize;\r
21                         if(write==read)\r
22                         {\r
23                                 --write; //make sure this happens next time\r
24                                 while(write<0)write+=bufSize;\r
25                                 return false;\r
26                         }\r
27                         return true;\r
28                 }\r
29                 bool operator >> (T &res)\r
30                 {\r
31                         ++read;\r
32                         while(read>=bufSize)read-=bufSize;\r
33                         if(read==write)\r
34                         {\r
35                                 ++write; //make sure this happens next time we call and the buf is still empty\r
36                                 while(write>=bufSize)write-=bufSize;\r
37                                 return false;\r
38                         }\r
39                         res=buf[read];\r
40                         return true;\r
41                 }\r
42                 unsigned long dataSize()\r
43                 {\r
44                         unsigned long wc=write;\r
45                         while(wc<read)wc+=bufSize;\r
46                         return wc-read-1;\r
47                 }\r
48                 void flood(const T &value)\r
49                 {\r
50                         //loop through all indices, flooding them\r
51                         //this is basically a reset\r
52                         read=0;\r
53                         for(write=0;write<bufSize;write++)\r
54                         {\r
55                                 buf[write]=value;\r
56                         }\r
57                         write=1;\r
58                 }\r
59 };\r
60 \r
61 \r
62 #endif