Go to the documentation of this file.00001 #ifndef QRK_RING_BUFFER_H
00002 #define QRK_RING_BUFFER_H
00003
00013 #include <deque>
00014
00015
00016 namespace qrk
00017 {
00019 template <class T>
00020 class RingBuffer
00021 {
00022 public:
00023 explicit RingBuffer(void)
00024 {
00025 }
00026
00027
00031 size_t size(void)
00032 {
00033 return ring_buffer_.size();
00034 }
00035
00036
00043 bool empty(void)
00044 {
00045 return ring_buffer_.empty();
00046 }
00047
00048
00055 void put(const T* data, size_t size)
00056 {
00057 const T* last_p = data + size;
00058 ring_buffer_.insert(ring_buffer_.end(), data, last_p);
00059 }
00060
00061
00070 size_t get(T* data, size_t size)
00071 {
00072 size_t n = std::min(size, ring_buffer_.size());
00073 std::copy(ring_buffer_.begin(), ring_buffer_.begin() + n, data);
00074 ring_buffer_.erase(ring_buffer_.begin(), ring_buffer_.begin() + n);
00075 return n;
00076 }
00077
00078
00084 void ungetc(const T ch)
00085 {
00086 ring_buffer_.push_front(ch);
00087 }
00088
00089
00093 void clear(void)
00094 {
00095 ring_buffer_.clear();
00096 }
00097
00098
00099 private:
00100 RingBuffer(const RingBuffer& rhs);
00101 RingBuffer& operator = (const RingBuffer& rhs);
00102
00103 std::deque<T> ring_buffer_;
00104 };
00105 }
00106
00107 #endif