RingBuffer.h 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #ifndef CORE_RINGBUFFER_H
  2. #define CORE_RINGBUFFER_H
  3. #include "data/Array.h"
  4. namespace Core {
  5. template<typename T, int N>
  6. class RingBuffer final {
  7. Array<T, N> data;
  8. int writeIndex = 0;
  9. int readIndex = 0;
  10. int values = 0;
  11. public:
  12. bool add(const T& t) {
  13. if(values >= N) {
  14. return true;
  15. }
  16. data[writeIndex] = t;
  17. writeIndex = (writeIndex + 1) % N;
  18. values++;
  19. return false;
  20. }
  21. int getLength() const {
  22. return values;
  23. }
  24. bool canRemove() const {
  25. return values > 0;
  26. }
  27. bool remove() {
  28. if(values <= 0) {
  29. return true;
  30. }
  31. values--;
  32. readIndex = (readIndex + 1) % N;
  33. return false;
  34. }
  35. T& operator[](int index) {
  36. return data[(index + readIndex) % N];
  37. }
  38. const T& operator[](int index) const {
  39. return data[(index + readIndex) % N];
  40. }
  41. void clear() {
  42. writeIndex = 0;
  43. readIndex = 0;
  44. values = 0;
  45. }
  46. };
  47. }
  48. #endif