All Classes Namespaces Files Functions Variables Enumerations Enumerator
libs/common/RingBuffer.h
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 /* !QRK_RING_BUFFER_H */