A template for ring buffer implementation

Dependents:   AwsomeStation LoRaBaseStation LoRaTerminal

Committer:
rba90
Date:
Sun Jun 19 01:36:24 2016 +0000
Revision:
0:36b372831d9e
Init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rba90 0:36b372831d9e 1 #include "buffer.h"
rba90 0:36b372831d9e 2
rba90 0:36b372831d9e 3 template <typename T>
rba90 0:36b372831d9e 4 CircularBuffer<T>::CircularBuffer(const uint32_t size)
rba90 0:36b372831d9e 5 :buffer_size(size)
rba90 0:36b372831d9e 6 {
rba90 0:36b372831d9e 7 read_ptr = 0;
rba90 0:36b372831d9e 8 write_ptr = 0;
rba90 0:36b372831d9e 9 count = 0;
rba90 0:36b372831d9e 10
rba90 0:36b372831d9e 11 // mutex lock
rba90 0:36b372831d9e 12 mux = false;
rba90 0:36b372831d9e 13
rba90 0:36b372831d9e 14 // overflow
rba90 0:36b372831d9e 15 is_over_flow = false;
rba90 0:36b372831d9e 16
rba90 0:36b372831d9e 17 // container
rba90 0:36b372831d9e 18 data = new T[buffer_size];
rba90 0:36b372831d9e 19 }
rba90 0:36b372831d9e 20
rba90 0:36b372831d9e 21 template <typename T>
rba90 0:36b372831d9e 22 CircularBuffer<T>::~CircularBuffer()
rba90 0:36b372831d9e 23 {
rba90 0:36b372831d9e 24 delete[] data;
rba90 0:36b372831d9e 25 }
rba90 0:36b372831d9e 26
rba90 0:36b372831d9e 27 template <typename T>
rba90 0:36b372831d9e 28 bool CircularBuffer<T>::isLocked()
rba90 0:36b372831d9e 29 {
rba90 0:36b372831d9e 30 return mux;
rba90 0:36b372831d9e 31 }
rba90 0:36b372831d9e 32
rba90 0:36b372831d9e 33 template <typename T>
rba90 0:36b372831d9e 34 void CircularBuffer<T>::lock()
rba90 0:36b372831d9e 35 {
rba90 0:36b372831d9e 36 mux = true;
rba90 0:36b372831d9e 37 }
rba90 0:36b372831d9e 38
rba90 0:36b372831d9e 39 template <typename T>
rba90 0:36b372831d9e 40 void CircularBuffer<T>::unlock()
rba90 0:36b372831d9e 41 {
rba90 0:36b372831d9e 42 mux = false;
rba90 0:36b372831d9e 43 }
rba90 0:36b372831d9e 44
rba90 0:36b372831d9e 45 template <typename T>
rba90 0:36b372831d9e 46 void CircularBuffer<T>::enqueue(T in)
rba90 0:36b372831d9e 47 {
rba90 0:36b372831d9e 48 data[write_ptr++] = in;
rba90 0:36b372831d9e 49 write_ptr %= buffer_size;
rba90 0:36b372831d9e 50
rba90 0:36b372831d9e 51 count++;
rba90 0:36b372831d9e 52 }
rba90 0:36b372831d9e 53
rba90 0:36b372831d9e 54 template <typename T>
rba90 0:36b372831d9e 55 T CircularBuffer<T>::dequeue()
rba90 0:36b372831d9e 56 {
rba90 0:36b372831d9e 57 T temp = data[read_ptr++];
rba90 0:36b372831d9e 58 read_ptr %= buffer_size;
rba90 0:36b372831d9e 59
rba90 0:36b372831d9e 60 count--;
rba90 0:36b372831d9e 61 return temp;
rba90 0:36b372831d9e 62 }
rba90 0:36b372831d9e 63
rba90 0:36b372831d9e 64 template <typename T>
rba90 0:36b372831d9e 65 uint32_t CircularBuffer<T>::getReadPtr()
rba90 0:36b372831d9e 66 {
rba90 0:36b372831d9e 67 return read_ptr;
rba90 0:36b372831d9e 68 }
rba90 0:36b372831d9e 69
rba90 0:36b372831d9e 70 template <typename T>
rba90 0:36b372831d9e 71 uint32_t CircularBuffer<T>::getWritePtr()
rba90 0:36b372831d9e 72 {
rba90 0:36b372831d9e 73 return write_ptr;
rba90 0:36b372831d9e 74 }
rba90 0:36b372831d9e 75
rba90 0:36b372831d9e 76 template <typename T>
rba90 0:36b372831d9e 77 uint32_t CircularBuffer<T>::getCounter()
rba90 0:36b372831d9e 78 {
rba90 0:36b372831d9e 79 return count;
rba90 0:36b372831d9e 80 }
rba90 0:36b372831d9e 81
rba90 0:36b372831d9e 82 template <typename T>
rba90 0:36b372831d9e 83 bool CircularBuffer<T>::getOverFlow()
rba90 0:36b372831d9e 84 {
rba90 0:36b372831d9e 85 return is_over_flow;
rba90 0:36b372831d9e 86 }
rba90 0:36b372831d9e 87
rba90 0:36b372831d9e 88 template <typename T>
rba90 0:36b372831d9e 89 void CircularBuffer<T>::clearOverFlow()
rba90 0:36b372831d9e 90 {
rba90 0:36b372831d9e 91 is_over_flow = false;
rba90 0:36b372831d9e 92 }
rba90 0:36b372831d9e 93
rba90 0:36b372831d9e 94 template <typename T>
rba90 0:36b372831d9e 95 T CircularBuffer<T>::first()
rba90 0:36b372831d9e 96 {
rba90 0:36b372831d9e 97 if (read_ptr > 0)
rba90 0:36b372831d9e 98 {
rba90 0:36b372831d9e 99 return data[read_ptr - 1];
rba90 0:36b372831d9e 100 }
rba90 0:36b372831d9e 101 else
rba90 0:36b372831d9e 102 {
rba90 0:36b372831d9e 103 return data[read_ptr];
rba90 0:36b372831d9e 104 }
rba90 0:36b372831d9e 105 }
rba90 0:36b372831d9e 106
rba90 0:36b372831d9e 107 template <typename T>
rba90 0:36b372831d9e 108 T CircularBuffer<T>::last()
rba90 0:36b372831d9e 109 {
rba90 0:36b372831d9e 110 if (write_ptr > 0)
rba90 0:36b372831d9e 111 {
rba90 0:36b372831d9e 112 return data[write_ptr - 1];
rba90 0:36b372831d9e 113 }
rba90 0:36b372831d9e 114 else
rba90 0:36b372831d9e 115 {
rba90 0:36b372831d9e 116 return data[write_ptr];
rba90 0:36b372831d9e 117 }
rba90 0:36b372831d9e 118 }
rba90 0:36b372831d9e 119
rba90 0:36b372831d9e 120 template <typename T>
rba90 0:36b372831d9e 121 T CircularBuffer<T>::operator[](uint32_t idx)
rba90 0:36b372831d9e 122 {
rba90 0:36b372831d9e 123 return data[idx];
rba90 0:36b372831d9e 124 }
rba90 0:36b372831d9e 125
rba90 0:36b372831d9e 126 // force compiler to create code for template
rba90 0:36b372831d9e 127 template class CircularBuffer<int>;
rba90 0:36b372831d9e 128 template class CircularBuffer<uint8_t>;
rba90 0:36b372831d9e 129 template class CircularBuffer<uint16_t>;
rba90 0:36b372831d9e 130 template class CircularBuffer<uint32_t>;