Circular Buffer template for any data type

Dependents:   serqet serqet2 EMGvoorjan kopija_NUCLEO_CELL_LOCKER_copy ... more

Committer:
hamparawa
Date:
Mon Oct 22 13:17:26 2012 +0000
Revision:
0:b241b75b052b
first version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hamparawa 0:b241b75b052b 1
hamparawa 0:b241b75b052b 2 #ifndef CIRCULAR_BUFFER_CPP
hamparawa 0:b241b75b052b 3 #define CIRCULAR_BUFFER_CPP
hamparawa 0:b241b75b052b 4
hamparawa 0:b241b75b052b 5 #include <stdio.h>
hamparawa 0:b241b75b052b 6 #include "circular_buffer.h"
hamparawa 0:b241b75b052b 7
hamparawa 0:b241b75b052b 8 /*
hamparawa 0:b241b75b052b 9 template<class T>
hamparawa 0:b241b75b052b 10 circular_buffer<T>::circular_buffer()
hamparawa 0:b241b75b052b 11 {
hamparawa 0:b241b75b052b 12 capacity = 0;
hamparawa 0:b241b75b052b 13 size = 0;
hamparawa 0:b241b75b052b 14
hamparawa 0:b241b75b052b 15 buffer = 0;
hamparawa 0:b241b75b052b 16
hamparawa 0:b241b75b052b 17 reset();
hamparawa 0:b241b75b052b 18 }
hamparawa 0:b241b75b052b 19 */
hamparawa 0:b241b75b052b 20
hamparawa 0:b241b75b052b 21 template<class T>
hamparawa 0:b241b75b052b 22 circular_buffer<T>::circular_buffer(int tcapacity)
hamparawa 0:b241b75b052b 23 {
hamparawa 0:b241b75b052b 24 capacity = tcapacity;
hamparawa 0:b241b75b052b 25 buffer = new T[capacity];
hamparawa 0:b241b75b052b 26
hamparawa 0:b241b75b052b 27 reset();
hamparawa 0:b241b75b052b 28 }
hamparawa 0:b241b75b052b 29
hamparawa 0:b241b75b052b 30 template<class T>
hamparawa 0:b241b75b052b 31 circular_buffer<T>::~circular_buffer()
hamparawa 0:b241b75b052b 32 {
hamparawa 0:b241b75b052b 33 if (buffer != 0)
hamparawa 0:b241b75b052b 34 delete[] buffer;
hamparawa 0:b241b75b052b 35 }
hamparawa 0:b241b75b052b 36
hamparawa 0:b241b75b052b 37 template<class T>
hamparawa 0:b241b75b052b 38 void circular_buffer<T>::reset()
hamparawa 0:b241b75b052b 39 {
hamparawa 0:b241b75b052b 40 start_pos = 0;
hamparawa 0:b241b75b052b 41 end_pos = 0;
hamparawa 0:b241b75b052b 42 size = 0;
hamparawa 0:b241b75b052b 43 }
hamparawa 0:b241b75b052b 44
hamparawa 0:b241b75b052b 45 template<class T>
hamparawa 0:b241b75b052b 46 int circular_buffer<T>::get_capacity()
hamparawa 0:b241b75b052b 47 {
hamparawa 0:b241b75b052b 48 return capacity;
hamparawa 0:b241b75b052b 49 }
hamparawa 0:b241b75b052b 50
hamparawa 0:b241b75b052b 51 template<class T>
hamparawa 0:b241b75b052b 52 int circular_buffer<T>::get_size()
hamparawa 0:b241b75b052b 53 {
hamparawa 0:b241b75b052b 54 return size;
hamparawa 0:b241b75b052b 55 }
hamparawa 0:b241b75b052b 56
hamparawa 0:b241b75b052b 57 template<class T>
hamparawa 0:b241b75b052b 58 void circular_buffer<T>::push_back(T item)
hamparawa 0:b241b75b052b 59 {
hamparawa 0:b241b75b052b 60 if (size == capacity)
hamparawa 0:b241b75b052b 61 pop_front();
hamparawa 0:b241b75b052b 62
hamparawa 0:b241b75b052b 63 buffer[end_pos] = item;
hamparawa 0:b241b75b052b 64 increment(end_pos);
hamparawa 0:b241b75b052b 65 size++;
hamparawa 0:b241b75b052b 66 }
hamparawa 0:b241b75b052b 67
hamparawa 0:b241b75b052b 68 /*
hamparawa 0:b241b75b052b 69 template<class T>
hamparawa 0:b241b75b052b 70 void circular_buffer<T>::push_front(T item)
hamparawa 0:b241b75b052b 71 {
hamparawa 0:b241b75b052b 72 if (size == capacity)
hamparawa 0:b241b75b052b 73 pop_back();
hamparawa 0:b241b75b052b 74
hamparawa 0:b241b75b052b 75 buffer[start_pos] = item;
hamparawa 0:b241b75b052b 76 decrement(start_pos);
hamparawa 0:b241b75b052b 77 size++;
hamparawa 0:b241b75b052b 78 }
hamparawa 0:b241b75b052b 79
hamparawa 0:b241b75b052b 80 */
hamparawa 0:b241b75b052b 81
hamparawa 0:b241b75b052b 82 template<class T>
hamparawa 0:b241b75b052b 83 void circular_buffer<T>::pop_back()
hamparawa 0:b241b75b052b 84 {
hamparawa 0:b241b75b052b 85 if (size != 0)
hamparawa 0:b241b75b052b 86 {
hamparawa 0:b241b75b052b 87 size--;
hamparawa 0:b241b75b052b 88 decrement(end_pos);
hamparawa 0:b241b75b052b 89 }
hamparawa 0:b241b75b052b 90 }
hamparawa 0:b241b75b052b 91
hamparawa 0:b241b75b052b 92 template<class T>
hamparawa 0:b241b75b052b 93 void circular_buffer<T>::pop_front()
hamparawa 0:b241b75b052b 94 {
hamparawa 0:b241b75b052b 95 if (size != 0)
hamparawa 0:b241b75b052b 96 {
hamparawa 0:b241b75b052b 97 size--;
hamparawa 0:b241b75b052b 98 increment(start_pos);
hamparawa 0:b241b75b052b 99 }
hamparawa 0:b241b75b052b 100 }
hamparawa 0:b241b75b052b 101
hamparawa 0:b241b75b052b 102 template<class T>
hamparawa 0:b241b75b052b 103 void circular_buffer<T>::increment(int& index)
hamparawa 0:b241b75b052b 104 {
hamparawa 0:b241b75b052b 105 index++;
hamparawa 0:b241b75b052b 106 if (index >= capacity)
hamparawa 0:b241b75b052b 107 index = 0;
hamparawa 0:b241b75b052b 108 }
hamparawa 0:b241b75b052b 109
hamparawa 0:b241b75b052b 110 template<class T>
hamparawa 0:b241b75b052b 111 void circular_buffer<T>::decrement(int& index)
hamparawa 0:b241b75b052b 112 {
hamparawa 0:b241b75b052b 113 index--;
hamparawa 0:b241b75b052b 114 if (index < 0)
hamparawa 0:b241b75b052b 115 index = capacity - 1;
hamparawa 0:b241b75b052b 116 }
hamparawa 0:b241b75b052b 117
hamparawa 0:b241b75b052b 118
hamparawa 0:b241b75b052b 119 template<class T>
hamparawa 0:b241b75b052b 120 int circular_buffer<T>::if_increment(int index)
hamparawa 0:b241b75b052b 121 {
hamparawa 0:b241b75b052b 122 index++;
hamparawa 0:b241b75b052b 123 if (index >= capacity)
hamparawa 0:b241b75b052b 124 index = 0;
hamparawa 0:b241b75b052b 125
hamparawa 0:b241b75b052b 126 return index;
hamparawa 0:b241b75b052b 127 }
hamparawa 0:b241b75b052b 128
hamparawa 0:b241b75b052b 129 template<class T>
hamparawa 0:b241b75b052b 130 int circular_buffer<T>::if_decrement(int index)
hamparawa 0:b241b75b052b 131 {
hamparawa 0:b241b75b052b 132 index--;
hamparawa 0:b241b75b052b 133 if (index < capacity)
hamparawa 0:b241b75b052b 134 index = capacity - 1;
hamparawa 0:b241b75b052b 135
hamparawa 0:b241b75b052b 136 return index;
hamparawa 0:b241b75b052b 137 }
hamparawa 0:b241b75b052b 138
hamparawa 0:b241b75b052b 139 template<class T>
hamparawa 0:b241b75b052b 140 T& circular_buffer<T>::front()
hamparawa 0:b241b75b052b 141 {
hamparawa 0:b241b75b052b 142 return buffer[start_pos];
hamparawa 0:b241b75b052b 143 }
hamparawa 0:b241b75b052b 144
hamparawa 0:b241b75b052b 145 template<class T>
hamparawa 0:b241b75b052b 146 T& circular_buffer<T>::back()
hamparawa 0:b241b75b052b 147 {
hamparawa 0:b241b75b052b 148 return buffer[if_decrement(end_pos)];
hamparawa 0:b241b75b052b 149 }
hamparawa 0:b241b75b052b 150
hamparawa 0:b241b75b052b 151
hamparawa 0:b241b75b052b 152 template<class T>
hamparawa 0:b241b75b052b 153 T& circular_buffer<T>::operator[](int index)
hamparawa 0:b241b75b052b 154 {
hamparawa 0:b241b75b052b 155 int real_index = 0;
hamparawa 0:b241b75b052b 156
hamparawa 0:b241b75b052b 157 // if (size == 0) // no item
hamparawa 0:b241b75b052b 158 // return NULL;
hamparawa 0:b241b75b052b 159
hamparawa 0:b241b75b052b 160 real_index = index + start_pos;
hamparawa 0:b241b75b052b 161 if (real_index >= capacity)
hamparawa 0:b241b75b052b 162 real_index -= capacity;
hamparawa 0:b241b75b052b 163
hamparawa 0:b241b75b052b 164 return buffer[real_index];
hamparawa 0:b241b75b052b 165 }
hamparawa 0:b241b75b052b 166
hamparawa 0:b241b75b052b 167
hamparawa 0:b241b75b052b 168 template<class T>
hamparawa 0:b241b75b052b 169 T& circular_buffer<T>::at(int index)
hamparawa 0:b241b75b052b 170 {
hamparawa 0:b241b75b052b 171 int real_index = 0;
hamparawa 0:b241b75b052b 172
hamparawa 0:b241b75b052b 173 real_index = index + start_pos;
hamparawa 0:b241b75b052b 174 if (real_index >= capacity)
hamparawa 0:b241b75b052b 175 real_index -= capacity;
hamparawa 0:b241b75b052b 176
hamparawa 0:b241b75b052b 177 return buffer[real_index];
hamparawa 0:b241b75b052b 178 }
hamparawa 0:b241b75b052b 179
hamparawa 0:b241b75b052b 180 #endif // CIRCULAR_BUFFER_CPP