2015-10-30 16:01:57 -07:00
|
|
|
/*----------------------------------------------------------------------------*/
|
2018-01-02 09:20:21 -08:00
|
|
|
/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
|
2015-10-30 16:01:57 -07:00
|
|
|
/* Open Source Software - may be modified and shared by FRC teams. The code */
|
|
|
|
|
/* must be accompanied by the FIRST BSD license file in the root directory of */
|
|
|
|
|
/* the project. */
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2016-09-14 20:52:06 -07:00
|
|
|
#include <cstddef>
|
2016-05-20 17:30:37 -07:00
|
|
|
#include <vector>
|
2015-10-30 16:01:57 -07:00
|
|
|
|
2016-11-01 22:33:12 -07:00
|
|
|
namespace frc {
|
|
|
|
|
|
2015-10-30 16:01:57 -07:00
|
|
|
/**
|
|
|
|
|
* This is a simple circular buffer so we don't need to "bucket brigade" copy
|
|
|
|
|
* old values.
|
|
|
|
|
*/
|
|
|
|
|
template <class T>
|
2017-11-22 17:04:57 -08:00
|
|
|
class circular_buffer {
|
2015-10-30 16:01:57 -07:00
|
|
|
public:
|
2017-11-22 17:04:57 -08:00
|
|
|
explicit circular_buffer(size_t size);
|
|
|
|
|
|
|
|
|
|
typedef T value_type;
|
|
|
|
|
typedef value_type& reference;
|
|
|
|
|
typedef const value_type& const_reference;
|
|
|
|
|
typedef value_type* pointer;
|
|
|
|
|
typedef size_t size_type;
|
|
|
|
|
typedef std::forward_iterator_tag iterator_category;
|
|
|
|
|
typedef std::ptrdiff_t difference_type;
|
|
|
|
|
|
|
|
|
|
size_type size() const;
|
|
|
|
|
T& front();
|
|
|
|
|
const T& front() const;
|
|
|
|
|
T& back();
|
|
|
|
|
const T& back() const;
|
|
|
|
|
void push_front(T value);
|
|
|
|
|
void push_back(T value);
|
|
|
|
|
T pop_front();
|
|
|
|
|
T pop_back();
|
|
|
|
|
void resize(size_t size);
|
|
|
|
|
void reset();
|
2015-10-30 16:01:57 -07:00
|
|
|
|
|
|
|
|
T& operator[](size_t index);
|
|
|
|
|
const T& operator[](size_t index) const;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::vector<T> m_data;
|
|
|
|
|
|
|
|
|
|
// Index of element at front of buffer
|
|
|
|
|
size_t m_front = 0;
|
|
|
|
|
|
|
|
|
|
// Number of elements used in buffer
|
|
|
|
|
size_t m_length = 0;
|
|
|
|
|
|
|
|
|
|
size_t ModuloInc(size_t index);
|
|
|
|
|
size_t ModuloDec(size_t index);
|
|
|
|
|
};
|
|
|
|
|
|
2016-11-01 22:33:12 -07:00
|
|
|
} // namespace frc
|
|
|
|
|
|
2017-11-22 17:04:57 -08:00
|
|
|
#include "circular_buffer.inc"
|