22 #ifndef __CIRCULAR_BUFFER_H__
23 #define __CIRCULAR_BUFFER_H__
29 template <
typename T >
42 void write(
const T & );
47 int size()
const {
return m_size; }
48 int used()
const {
return m_used; }
49 int free()
const {
return m_free; }
52 {
return buf_read( m_buf, m_ri ); }
55 {
return buf_read( m_buf, (m_ri + i) %
size() ); }
58 {
return buf_read( m_buf , (m_wi + i) %
size() ); }
63 void increment_write_pos(
int i = 1 );
64 void increment_read_pos(
int i = 1 );
71 void* buf_alloc(
int size );
72 void buf_free(
void*& buf );
73 void buf_write(
void* buf,
int n,
const T & t );
74 T& buf_read(
void* buf,
int n )
const;
75 void buf_clear(
void* buf,
int n );
87 template<
typename T >
92 std::cout <<
"Buffer debug" << std::endl;
93 std::cout <<
"Size : " << size() << std::endl;
94 std::cout <<
"Free/Used " << free() <<
"/" << used() << std::endl;
95 std::cout <<
"Indices : r/w = " << m_ri <<
"/" << m_wi << std::endl;
99 std::cout <<
"empty" << std::endl;
105 std::cout <<
"full" << std::endl;
109 std::cout <<
"Data : " << std::endl;
110 for(
int i = 0; i < used(); i++ ) {
112 std::cout << peek_data( i ) << std::endl;
119 template <
typename T >
128 template <
typename T >
132 for(
int i=0; i < used(); i++ ) {
133 buf_clear( m_buf, i );
136 m_used = m_ri = m_wi = 0;
139 template <
typename T >
146 template <
typename T >
152 void * new_buf = buf_alloc(size);
154 for( i = 0; i < size && i < used(); i++ ) {
156 buf_write( new_buf, i, peek_data( i ) );
157 buf_clear( m_buf, (m_ri + i) % m_size );
167 m_free = m_size - m_used;
173 template <
typename T >
178 m_buf = buf_alloc( m_size );
188 template <
typename T >
194 buf_clear( m_buf, m_ri );
195 increment_read_pos();
200 template <
typename T >
204 buf_write( m_buf, m_wi, t );
205 increment_write_pos();
209 template <
typename T >
213 m_wi = ( m_wi + i ) % m_size;
219 template <
typename T >
221 circular_buffer<T>::increment_read_pos(
int i ) {
223 m_ri = ( m_ri + i ) % m_size;
229 template <
typename T >
231 circular_buffer<T>::buf_alloc(
int size )
232 {
return new unsigned char[ size *
sizeof(T) ]; }
234 template <
typename T >
236 circular_buffer<T>::buf_free(
void* & buf )
237 {
delete []
static_cast<unsigned char*
>(buf); buf = 0; }
239 template <
typename T >
241 circular_buffer<T>::buf_write(
void* buf,
int n,
const T & t )
243 T* p =
static_cast<T*
>(buf) + n;
247 template <
typename T >
249 circular_buffer<T>::buf_read(
void* buf,
int n )
const
251 T* p =
static_cast<T*
>(buf) + n;
255 template <
typename T >
257 circular_buffer<T>::buf_clear(
void* buf,
int n )
259 T* p =
static_cast<T*
>(buf) + n;
circular_buffer(int size=0)
const T & read_data() const
const T & peek_data(int i) const