File: RingBuffer.h

package info (click to toggle)
urg 0.8.11-1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 3,212 kB
  • ctags: 1,605
  • sloc: sh: 10,014; cpp: 6,459; ansic: 2,419; makefile: 203
file content (109 lines) | stat: -rw-r--r-- 1,787 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#ifndef QRK_RING_BUFFER_H
#define QRK_RING_BUFFER_H

/*!
  \file
  \brief Oobt@

  \author Satofumi KAMIMURA

  $Id: RingBuffer.h 1574 2009-12-13 03:53:55Z satofumi $
*/

#include <deque>


namespace qrk
{
  /*!
    \brief Oobt@
  */
  template <class T>
  class RingBuffer
  {
  public:
    explicit RingBuffer(void)
    {
    }


    /*!
      \brief obt@TCY̎擾
    */
    size_t size(void)
    {
      return ring_buffer_.size();
    }


    /*!
      \brief obt@

      \retval true f[^Ȃ
      \retval false f[^
    */
    bool empty(void)
    {
      return ring_buffer_.empty();
    }


    /*!
      \brief f[^̊i[

      \param[in] data f[^
      \param[in] size f[^
    */
    void put(const T* data, size_t size)
    {
      const T* last_p = data + size;
      ring_buffer_.insert(ring_buffer_.end(), data, last_p);
    }


    /*!
      \brief f[^̎o

      \param[out] data f[^opobt@
      \param[in] size of[^̍ő

      \return of[^
    */
    size_t get(T* data, size_t size)
    {
      size_t n = std::min(size, ring_buffer_.size());
      std::copy(ring_buffer_.begin(), ring_buffer_.begin() + n, data);
      ring_buffer_.erase(ring_buffer_.begin(), ring_buffer_.begin() + n);
      return n;
    }


    /*!
      \brief f[^̏߂

      \param[in] ch ߂f[^
    */
    void ungetc(const T ch)
    {
      ring_buffer_.push_front(ch);
    }


    /*!
      \brief i[f[^̃NA
    */
    void clear(void)
    {
      ring_buffer_.clear();
    }


  private:
    RingBuffer(const RingBuffer& rhs);
    RingBuffer& operator = (const RingBuffer& rhs);

    std::deque<T> ring_buffer_;
  };
}

#endif /* !QRK_RING_BUFFER_H */