1// Copyright 2016 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef V8_BASE_RING_BUFFER_H_ 6#define V8_BASE_RING_BUFFER_H_ 7 8#include "src/base/macros.h" 9 10namespace v8 { 11namespace base { 12 13template <typename T> 14class RingBuffer { 15 public: 16 RingBuffer() { Reset(); } 17 static const int kSize = 10; 18 void Push(const T& value) { 19 if (count_ == kSize) { 20 elements_[start_++] = value; 21 if (start_ == kSize) start_ = 0; 22 } else { 23 DCHECK_EQ(start_, 0); 24 elements_[count_++] = value; 25 } 26 } 27 28 int Count() const { return count_; } 29 30 template <typename Callback> 31 T Sum(Callback callback, const T& initial) const { 32 int j = start_ + count_ - 1; 33 if (j >= kSize) j -= kSize; 34 T result = initial; 35 for (int i = 0; i < count_; i++) { 36 result = callback(result, elements_[j]); 37 if (--j == -1) j += kSize; 38 } 39 return result; 40 } 41 42 void Reset() { start_ = count_ = 0; } 43 44 private: 45 T elements_[kSize]; 46 int start_; 47 int count_; 48 DISALLOW_COPY_AND_ASSIGN(RingBuffer); 49}; 50 51} // namespace base 52} // namespace v8 53 54#endif // V8_BASE_RING_BUFFER_H_ 55