00001 #ifndef VR_BASE_RINGBUF_H
00002 #define VR_BASE_RINGBUF_H
00003 #include "Env.h"
00004 #include <vector>
00005
00006 namespace Spr {
00007
00008
00009 template <class T>
00010 class UTRingBuffer:private std::vector<T>{
00011 public:
00012 typedef std::vector<T> container;
00013 typedef std::vector<T> base_class;
00014 protected:
00015 int cur;
00016 public:
00017 T zero;
00018 UTRingBuffer(int sz=0){
00019 cur = 0;
00020 size(sz);
00021 }
00022 int size() const{ return container::size(); }
00023 void size(int sz){
00024 container::resize(sz);
00025 if (cur >= size()) cur = 0;
00026 }
00027 void clear(){
00028 for(int i=0; i<size(); i++) begin()[i] = zero;
00029 }
00030 void inc(){
00031 cur ++;
00032 if (cur>=size()) cur = 0;
00033 }
00034 void dec(){
00035 cur --;
00036 if (cur<0) cur = size()-1;
00037 }
00038 T& operator[] (int i){
00039 i += cur + size();
00040 i = i % size();
00041 return begin()[i];
00042 }
00043 };
00044
00045 }
00046
00047 #endif