00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __RINGBUFFER_H
00022 #define __RINGBUFFER_H
00023
00024 #include <vector>
00025
00026 namespace CVD
00027 {
00028
00029
00037 template <typename T>
00038 class RingBuffer {
00039 public:
00042 RingBuffer(int size=0){
00043 my_buffer.resize(size);
00044 my_start=0;
00045 }
00046
00050 RingBuffer(int size, const T &t){
00051 my_buffer.resize(size,t);
00052 my_start=0;
00053 }
00054
00055 ~RingBuffer(){}
00056
00057
00060 void resize(int size){
00061 my_buffer.resize(size);
00062 }
00063
00065 int size() const {
00066 return my_buffer.size();
00067 }
00068
00073 T& operator[](int i){
00074 return my_buffer[(my_buffer.size()+i+my_start)%my_buffer.size()];
00075 }
00076
00081 const T& operator[](int i) const {
00082 return my_buffer[(my_buffer.size()+i+my_start)%my_buffer.size()];
00083 }
00084
00087 void advance(int n=1){
00088 my_start = (my_start+my_buffer.size()+n)%my_buffer.size();
00089 }
00090
00091 private:
00092 std::vector<T> my_buffer;
00093 int my_start;
00094 };
00095
00096
00097 }
00098
00099 #endif
00100