ringBuffer.h

00001 #ifndef RING_BUFFER_H
00002 #define RING_BUFFER_H
00003 
00004 /*
00005   ・ー・ミ・テ・ユ・。
00006   Satofumi KAMIMURA
00007   $Id$
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 /* !RING_BUFFER_H */
00088 

Generated on Mon Apr 13 22:52:01 2009 by  doxygen 1.5.7.1