Circular Buffer template for any data type
Dependents: serqet serqet2 EMGvoorjan kopija_NUCLEO_CELL_LOCKER_copy ... more
circular_buffer.cpp@0:b241b75b052b, 2012-10-22 (annotated)
- Committer:
- hamparawa
- Date:
- Mon Oct 22 13:17:26 2012 +0000
- Revision:
- 0:b241b75b052b
first version
Who changed what in which revision?
User | Revision | Line number | New 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 |