ringBuffer.h
00001 #ifndef RING_BUFFER_H
00002 #define RING_BUFFER_H
00003
00004
00005
00006
00007
00008
00009
00010
00011 template<class C> class RingBuffer {
00012 typedef unsigned long size_type;
00013 size_type real_size;
00014 size_type first;
00015 size_type last;
00016 C *buffer;
00017 RingBuffer(void);
00018
00019 public:
00020 RingBuffer(size_type size) : real_size(1), first(0), last(0) {
00021 while (size > (real_size -1)) {
00022 real_size <<= 1;
00023 }
00024 buffer = new C[real_size];
00025 }
00026
00027 ~RingBuffer(void) {
00028 delete [] buffer;
00029 }
00030
00031 size_type size(void) {
00032 return (last >= first) ? last - first : real_size - (first - last);
00033 }
00034
00035 size_type free_size(void) {
00036 return real_size -1 - size();
00037 }
00038
00039 void put(const C* data, size_type size) {
00040 size_type free_length = free_size();
00041 size_type len = (size > free_length) ? free_length : size;
00042
00043 size_type put_end = (len > (real_size - last)) ? real_size : last + len;
00044 C *p = &buffer[last];
00045 C *q = (C *)data;
00046 for (size_type i = last; i < put_end; ++i) {
00047 *p++ = *q++;
00048 }
00049
00050 C *data_last = (C *)data + len;
00051 if (q < data_last) {
00052 p = &buffer[0];
00053 while (q < data_last) {
00054 *p++ = *q++;
00055 }
00056 }
00057 last = (p - buffer) & (real_size -1);
00058 }
00059
00060 void get(C* data, size_type size) {
00061 size_type filled_length = this->size();
00062 size_type len = (size > filled_length) ? filled_length : size;
00063
00064 size_type get_end = (len > (real_size - first)) ? real_size : first + len;
00065 C *p = data;
00066 C *q = &buffer[first];
00067 for (size_type i = first; i < get_end; ++i) {
00068 *p++ = *q++;
00069 }
00070
00071 C *data_last = data + len;
00072 if (p < data_last) {
00073 while (p < data_last) {
00074 *p++ = *q++;
00075 }
00076 }
00077 first = (q - buffer) & (real_size -1);
00078 }
00079
00080 void clear(void) {
00081 first = 0;
00082 last = 0;
00083 }
00084 };
00085
00086
00087 #endif
00088