A template for ring buffer implementation

Dependents:   AwsomeStation LoRaBaseStation LoRaTerminal

Committer:
rba90
Date:
Thu Sep 02 00:16:51 2021 +0000
Revision:
7:3e06927ef5ec
Parent:
6:790344151d69
Rename CircularBuffer to RingBuffer

Who changed what in which revision?

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