+ // Update average with value v
+ void update(int64_t v)
+ { average = RESOLUTION * v + (PERIOD - 1) * average / PERIOD; }
+
+ // Test if average is strictly greater than rational a / b
+ bool is_greater(int64_t a, int64_t b)
+ { return b * average > a * PERIOD * RESOLUTION ; }
+
+ private :
+ static constexpr int64_t PERIOD = 4096;
+ static constexpr int64_t RESOLUTION = 1024;
+ int64_t average;
+};
+
+template <typename T, std::size_t MaxSize>
+class ValueList {
+
+public:
+ std::size_t size() const { return size_; }
+ void resize(std::size_t newSize) { size_ = newSize; }
+ void push_back(const T& value) { values_[size_++] = value; }
+ T& operator[](std::size_t index) { return values_[index]; }
+ T* begin() { return values_; }
+ T* end() { return values_ + size_; }
+ const T& operator[](std::size_t index) const { return values_[index]; }
+ const T* begin() const { return values_; }
+ const T* end() const { return values_ + size_; }
+
+ void swap(ValueList& other) {
+ const std::size_t maxSize = std::max(size_, other.size_);
+ for (std::size_t i = 0; i < maxSize; ++i) {
+ std::swap(values_[i], other.values_[i]);
+ }
+ std::swap(size_, other.size_);
+ }