24 #ifndef __CIRCULAR_BUFFER_H__ 25 #define __CIRCULAR_BUFFER_H__ 31 template <
typename T >
44 void write(
const T & );
49 int size()
const {
return m_size; }
50 int used()
const {
return m_used; }
51 int free()
const {
return m_free; }
54 {
return buf_read( m_buf, m_ri ); }
57 {
return buf_read( m_buf, (m_ri + i) %
size() ); }
60 {
return buf_read( m_buf , (m_wi + i) %
size() ); }
65 void increment_write_pos(
int i = 1 );
66 void increment_read_pos(
int i = 1 );
73 void* buf_alloc(
int size );
74 void buf_free(
void*& buf );
75 void buf_write(
void* buf,
int n,
const T & t );
76 T& buf_read(
void* buf,
int n )
const;
77 void buf_clear(
void* buf,
int n );
89 template<
typename T >
94 std::cout <<
"Buffer debug" << std::endl;
95 std::cout <<
"Size : " <<
size() << std::endl;
96 std::cout <<
"Free/Used " <<
free() <<
"/" <<
used() << std::endl;
97 std::cout <<
"Indices : r/w = " << m_ri <<
"/" << m_wi << std::endl;
101 std::cout <<
"empty" << std::endl;
107 std::cout <<
"full" << std::endl;
111 std::cout <<
"Data : " << std::endl;
112 for(
int i = 0; i <
used(); i++ ) {
114 std::cout <<
peek_data( i ) << std::endl;
121 template <
typename T >
130 template <
typename T >
134 for(
int i=0; i <
used(); i++ ) {
135 buf_clear( m_buf, (m_ri + i) % m_size );
138 m_used = m_ri = m_wi = 0;
141 template <
typename T >
148 template <
typename T >
154 void * new_buf = buf_alloc(size);
156 for( i = 0; i < size && i <
used(); i++ ) {
159 buf_clear( m_buf, (m_ri + i) % m_size );
169 m_free = m_size - m_used;
175 template <
typename T >
180 m_buf = buf_alloc( m_size );
190 template <
typename T >
196 buf_clear( m_buf, m_ri );
197 increment_read_pos();
202 template <
typename T >
206 buf_write( m_buf, m_wi, t );
207 increment_write_pos();
211 template <
typename T >
215 m_wi = ( m_wi + i ) % m_size;
221 template <
typename T >
225 m_ri = ( m_ri + i ) % m_size;
231 template <
typename T >
234 {
return new unsigned char[ size *
sizeof(T) ]; }
236 template <
typename T >
239 {
delete []
static_cast<unsigned char*
>(buf); buf = 0; }
241 template <
typename T >
245 T* p =
static_cast<T*
>(buf) + n;
249 template <
typename T >
253 T* p =
static_cast<T*
>(buf) + n;
257 template <
typename T >
261 T* p =
static_cast<T*
>(buf) + n;
circular_buffer(int size=0)
uint64 const sc_uint_base int b
const T & read_data() const
const T & peek_data(int i) const