2 // Simple fixed size ring buffer.
3 // Manage objects by value.
4 // Thread safe for single Producer and single Consumer.
5 // By Dennis Lang http://home.comcast.net/~lang.dennis/code/ring/ring.html
6 // Slightly modified for naming
10 template <class T
, size_t RingSize
>
15 : m_size(RingSize
), m_buffer(new T
[RingSize
]), m_rIndex(0), m_wIndex(0)
23 size_t next(size_t n
) const
25 return (n
+ 1) % m_size
;
30 return (m_rIndex
== m_wIndex
);
35 return (next(m_wIndex
) == m_rIndex
);
38 bool put(const T
&value
)
42 m_buffer
[m_wIndex
] = value
;
43 m_wIndex
= next(m_wIndex
);
51 value
= m_buffer
[m_rIndex
];
52 m_rIndex
= next(m_rIndex
);
60 // volatile is only used to keep compiler from placing values in registers.
61 // volatile does NOT make the index thread safe.
62 volatile size_t m_rIndex
;
63 volatile size_t m_wIndex
;