A template for ring buffer implementation
Dependents: AwsomeStation LoRaBaseStation LoRaTerminal
buffer.cpp
- Committer:
- rba90
- Date:
- 2016-06-19
- Revision:
- 0:36b372831d9e
File content as of revision 0:36b372831d9e:
#include "buffer.h" template <typename T> CircularBuffer<T>::CircularBuffer(const uint32_t size) :buffer_size(size) { read_ptr = 0; write_ptr = 0; count = 0; // mutex lock mux = false; // overflow is_over_flow = false; // container data = new T[buffer_size]; } template <typename T> CircularBuffer<T>::~CircularBuffer() { delete[] data; } template <typename T> bool CircularBuffer<T>::isLocked() { return mux; } template <typename T> void CircularBuffer<T>::lock() { mux = true; } template <typename T> void CircularBuffer<T>::unlock() { mux = false; } template <typename T> void CircularBuffer<T>::enqueue(T in) { data[write_ptr++] = in; write_ptr %= buffer_size; count++; } template <typename T> T CircularBuffer<T>::dequeue() { T temp = data[read_ptr++]; read_ptr %= buffer_size; count--; return temp; } template <typename T> uint32_t CircularBuffer<T>::getReadPtr() { return read_ptr; } template <typename T> uint32_t CircularBuffer<T>::getWritePtr() { return write_ptr; } template <typename T> uint32_t CircularBuffer<T>::getCounter() { return count; } template <typename T> bool CircularBuffer<T>::getOverFlow() { return is_over_flow; } template <typename T> void CircularBuffer<T>::clearOverFlow() { is_over_flow = false; } template <typename T> T CircularBuffer<T>::first() { if (read_ptr > 0) { return data[read_ptr - 1]; } else { return data[read_ptr]; } } template <typename T> T CircularBuffer<T>::last() { if (write_ptr > 0) { return data[write_ptr - 1]; } else { return data[write_ptr]; } } template <typename T> T CircularBuffer<T>::operator[](uint32_t idx) { return data[idx]; } // force compiler to create code for template template class CircularBuffer<int>; template class CircularBuffer<uint8_t>; template class CircularBuffer<uint16_t>; template class CircularBuffer<uint32_t>;