diff options
Diffstat (limited to 'src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h')
-rw-r--r-- | src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h | 343 |
1 files changed, 165 insertions, 178 deletions
diff --git a/src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h b/src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h index 50309e31b..c00fe4881 100644 --- a/src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h +++ b/src/systemc/ext/tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h @@ -17,252 +17,239 @@ *****************************************************************************/ -// -// To the LRM writer : this class is purely an artifact of the implementation. -// - -#ifndef __CIRCULAR_BUFFER_H__ -#define __CIRCULAR_BUFFER_H__ +#ifndef \ + __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_CIRCULAR_BUFFER_H__ +#define \ + __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_CIRCULAR_BUFFER_H__ #include <iostream> -namespace tlm { +namespace tlm +{ -template < typename T > +template <typename T> class circular_buffer { -public: - - explicit - circular_buffer( int size = 0 ); - ~circular_buffer(); - - void resize( int size ); - void clear(); - - T read(); - void write( const T & ); - - bool is_empty() const { return used() == 0; } - bool is_full() const { return free() == 0; } - - int size() const { return m_size; } - int used() const { return m_used; } - int free() const { return m_free; } - - const T& read_data() const - { return buf_read( m_buf, m_ri ); } - - const T& peek_data( int i ) const - { return buf_read( m_buf, (m_ri + i) % size() ); } - - T & poke_data( int i ) - { return buf_read( m_buf , (m_wi + i) % size() ); } - - void debug() const; - -private: - void increment_write_pos( int i = 1 ); - void increment_read_pos( int i = 1 ); - - void init(); - - circular_buffer( const circular_buffer<T> &b ); // disabled - circular_buffer<T> &operator=( const circular_buffer<T> & ); // disabled - - void* buf_alloc( int size ); - void buf_free( void*& buf ); - void buf_write( void* buf, int n, const T & t ); - T& buf_read( void* buf, int n ) const; - void buf_clear( void* buf, int n ); - -private: - int m_size; // size of the buffer - void* m_buf; // the buffer - int m_free; // number of free spaces - int m_used; // number of used spaces - int m_ri; // index of next read - int m_wi; // index of next write - + public: + explicit circular_buffer(int size=0); + ~circular_buffer(); + + void resize(int size); + void clear(); + + T read(); + void write(const T &); + + bool is_empty() const { return used() == 0; } + bool is_full() const { return free() == 0; } + + int size() const { return m_size; } + int used() const { return m_used; } + int free() const { return m_free; } + + const T &read_data() const { return buf_read(m_buf, m_ri); } + const T & + peek_data(int i) const + { + return buf_read(m_buf, (m_ri + i) % size()); + } + + T & + poke_data(int i) + { + return buf_read(m_buf, (m_wi + i) % size()); + } + + void debug() const; + + private: + void increment_write_pos(int i=1); + void increment_read_pos(int i=1); + + void init(); + + // Disabled. + circular_buffer(const circular_buffer<T> &b); + circular_buffer<T> &operator = (const circular_buffer<T> &); + + void *buf_alloc(int size); + void buf_free(void *&buf); + void buf_write(void *buf, int n, const T &t); + T &buf_read(void *buf, int n) const; + void buf_clear(void *buf, int n); + + private: + int m_size; // size of the buffer + void *m_buf; // the buffer + int m_free; // number of free spaces + int m_used; // number of used spaces + int m_ri; // index of next read + int m_wi; // index of next write }; -template< typename T > +template <typename T> void circular_buffer<T>::debug() const { - - std::cout << "Buffer debug" << std::endl; - std::cout << "Size : " << size() << std::endl; - std::cout << "Free/Used " << free() << "/" << used() << std::endl; - std::cout << "Indices : r/w = " << m_ri << "/" << m_wi << std::endl; - - if( is_empty() ) { - - std::cout << "empty" << std::endl; - - } - - if( is_full() ) { - - std::cout << "full" << std::endl; - - } - - std::cout << "Data : " << std::endl; - for( int i = 0; i < used(); i++ ) { - - std::cout << peek_data( i ) << std::endl; - - } - - + std::cout << "Buffer debug" << std::endl; + std::cout << "Size : " << size() << std::endl; + std::cout << "Free/Used " << free() << "/" << used() << std::endl; + std::cout << "Indices : r/w = " << m_ri << "/" << m_wi << std::endl; + + if (is_empty()) { + std::cout << "empty" << std::endl; + } + + if (is_full()) { + std::cout << "full" << std::endl; + } + + std::cout << "Data : " << std::endl; + for (int i = 0; i < used(); i++) { + std::cout << peek_data( i ) << std::endl; + } } -template < typename T > -circular_buffer<T>::circular_buffer( int size ) - : m_size(size) - , m_buf(0) +template <typename T> +circular_buffer<T>::circular_buffer(int size) : m_size(size), m_buf(0) { - init(); - + init(); } -template < typename T > +template <typename T> void circular_buffer<T>::clear() { - for( int i=0; i < used(); i++ ) { - buf_clear( m_buf, (m_ri + i) % m_size ); - } - m_free = m_size; - m_used = m_ri = m_wi = 0; + for (int i = 0; i < used(); i++) { + buf_clear(m_buf, (m_ri + i) % m_size); + } + m_free = m_size; + m_used = m_ri = m_wi = 0; } -template < typename T > +template <typename T> circular_buffer<T>::~circular_buffer() { - clear(); - buf_free( m_buf ); + clear(); + buf_free(m_buf); } -template < typename T > +template <typename T> void -circular_buffer<T>::resize( int size ) +circular_buffer<T>::resize(int size) { + int i; + void *new_buf = buf_alloc(size); - int i; - void * new_buf = buf_alloc(size); - - for( i = 0; i < size && i < used(); i++ ) { + for (i = 0; i < size && i < used(); i++) { + buf_write(new_buf, i, peek_data(i)); + buf_clear(m_buf, (m_ri + i) % m_size); + } - buf_write( new_buf, i, peek_data( i ) ); - buf_clear( m_buf, (m_ri + i) % m_size ); + buf_free(m_buf); - } + m_size = size; + m_ri = 0; + m_wi = i % m_size; + m_used = i; + m_free = m_size - m_used; - buf_free( m_buf ); - - m_size = size; - m_ri = 0; - m_wi = i % m_size; - m_used = i; - m_free = m_size - m_used; - - m_buf = new_buf; + m_buf = new_buf; } -template < typename T > +template <typename T> void -circular_buffer<T>::init() { - - if( m_size > 0 ) { - m_buf = buf_alloc( m_size ); - } - - m_free = m_size; - m_used = 0; - m_ri = 0; - m_wi = 0; - +circular_buffer<T>::init() +{ + if (m_size > 0) { + m_buf = buf_alloc(m_size); + } + + m_free = m_size; + m_used = 0; + m_ri = 0; + m_wi = 0; } -template < typename T > +template <typename T> T circular_buffer<T>::read() { - T t = read_data(); + T t = read_data(); - buf_clear( m_buf, m_ri ); - increment_read_pos(); + buf_clear(m_buf, m_ri); + increment_read_pos(); - return t; + return t; } -template < typename T > +template <typename T> void -circular_buffer<T>::write( const T &t ) +circular_buffer<T>::write(const T &t) { - buf_write( m_buf, m_wi, t ); - increment_write_pos(); + buf_write(m_buf, m_wi, t); + increment_write_pos(); } - -template < typename T > +template <typename T> void -circular_buffer<T>::increment_write_pos( int i ) { - - m_wi = ( m_wi + i ) % m_size; - m_used += i; - m_free -= i; - +circular_buffer<T>::increment_write_pos(int i) +{ + m_wi = (m_wi + i) % m_size; + m_used += i; + m_free -= i; } -template < typename T > +template <typename T> void -circular_buffer<T>::increment_read_pos( int i ) { - - m_ri = ( m_ri + i ) % m_size; - m_used -= i; - m_free += i; - +circular_buffer<T>::increment_read_pos(int i) +{ + m_ri = (m_ri + i) % m_size; + m_used -= i; + m_free += i; } -template < typename T > -inline void* -circular_buffer<T>::buf_alloc( int size ) - { return new unsigned char[ size * sizeof(T) ]; } +template <typename T> +inline void * +circular_buffer<T>::buf_alloc(int size) +{ + return new unsigned char [size * sizeof(T)]; +} -template < typename T > +template <typename T> inline void -circular_buffer<T>::buf_free( void* & buf ) - { delete [] static_cast<unsigned char*>(buf); buf = 0; } +circular_buffer<T>::buf_free(void *&buf) +{ + delete [] static_cast<unsigned char *>(buf); + buf = nullptr; +} -template < typename T > +template <typename T> inline void -circular_buffer<T>::buf_write( void* buf, int n, const T & t ) +circular_buffer<T>::buf_write(void *buf, int n, const T &t) { - T* p = static_cast<T*>(buf) + n; - new (p) T(t); + T *p = static_cast<T *>(buf) + n; + new (p)T(t); } -template < typename T > -inline T& -circular_buffer<T>::buf_read( void* buf, int n ) const +template <typename T> +inline T & +circular_buffer<T>::buf_read(void *buf, int n) const { - T* p = static_cast<T*>(buf) + n; - return *p; + T *p = static_cast<T *>(buf) + n; + return *p; } -template < typename T > +template <typename T> inline void -circular_buffer<T>::buf_clear( void* buf, int n ) +circular_buffer<T>::buf_clear(void *buf, int n) { - T* p = static_cast<T*>(buf) + n; - p->~T(); + T *p = static_cast<T *>(buf) + n; + p->~T(); } } // namespace tlm #endif - +/* __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_CIRCULAR_BUFFER_H__ */ |