Program Listing for File rolling_mean_accumulator.hpp
↰ Return to documentation for file (include/rmw_stats_shim/rolling_mean_accumulator.hpp)
// SPDX-FileCopyrightText: 2020 PAL Robotics S.L.
// SPDX-FileCopyrightText: 2024 Bonsai Robotics, Inc.
// SPDX-License-Identifier: Apache-2.0
#ifndef RMW_STATS_SHIM__ROLLING_MEAN_ACCUMULATOR_HPP_
#define RMW_STATS_SHIM__ROLLING_MEAN_ACCUMULATOR_HPP_
#include <cassert>
#include <cstddef>
#include <vector>
/* Copied from rcppmath, but modified to give access to the current window size. */
template <typename T>
class RollingMeanAccumulator
{
public:
explicit RollingMeanAccumulator(size_t rolling_window_size)
: buffer_(rolling_window_size)
{}
void accumulate(T val)
{
sum_ -= buffer_[next_insert_];
sum_ += val;
buffer_[next_insert_] = val;
next_insert_++;
buffer_filled_ |= next_insert_ >= buffer_.size();
next_insert_ = next_insert_ % buffer_.size();
}
T getRollingMean() const
{
size_t valid_data_count = dataCount();
assert(valid_data_count > 0);
return sum_ / valid_data_count;
}
size_t dataCount() const
{
return buffer_filled_ * buffer_.size() + !buffer_filled_ * next_insert_;
}
private:
std::vector<T> buffer_;
size_t next_insert_{0};
T sum_{0};
bool buffer_filled_{false};
};
#endif // RMW_STATS_SHIM__ROLLING_MEAN_ACCUMULATOR_HPP__