00001 #ifndef QRK_RING_BUFFER_H 00002 #define QRK_RING_BUFFER_H 00003 00013 #include <deque> 00014 00015 00016 namespace qrk 00017 { 00021 template <class T> 00022 class RingBuffer 00023 { 00024 public: 00025 explicit RingBuffer(void) 00026 { 00027 } 00028 00029 00033 size_t size(void) 00034 { 00035 return ring_buffer_.size(); 00036 } 00037 00038 00045 bool empty(void) 00046 { 00047 return ring_buffer_.empty(); 00048 } 00049 00050 00057 void put(const T* data, size_t size) 00058 { 00059 const T* last_p = data + size; 00060 ring_buffer_.insert(ring_buffer_.end(), data, last_p); 00061 } 00062 00063 00072 size_t get(T* data, size_t size) 00073 { 00074 size_t n = std::min(size, ring_buffer_.size()); 00075 std::copy(ring_buffer_.begin(), ring_buffer_.begin() + n, data); 00076 ring_buffer_.erase(ring_buffer_.begin(), ring_buffer_.begin() + n); 00077 return n; 00078 } 00079 00080 00086 void ungetc(const T ch) 00087 { 00088 ring_buffer_.push_front(ch); 00089 } 00090 00091 00095 void clear(void) 00096 { 00097 ring_buffer_.clear(); 00098 } 00099 00100 00101 private: 00102 RingBuffer(const RingBuffer& rhs); 00103 RingBuffer& operator = (const RingBuffer& rhs); 00104 00105 std::deque<T> ring_buffer_; 00106 }; 00107 } 00108 00109 #endif /* !QRK_RING_BUFFER_H */