// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_VM_RING_BUFFER_H_ #define RUNTIME_VM_RING_BUFFER_H_ #include "platform/assert.h" #include "platform/utils.h" namespace dart { // Fixed-capacity ring buffer. template class RingBuffer { public: RingBuffer() : count_(0) {} void Add(const T& t) { data_[count_++ & kMask] = t; } // Returns the i'th most recently added element. Requires 0 <= i < Size(). const T& Get(int i) const { ASSERT(0 <= i && i < Size()); return data_[(count_ - i - 1) & kMask]; } // Returns the number of elements currently stored in this buffer (at most N). int64_t Size() const { return Utils::Minimum(count_, static_cast(N)); } private: static const int kMask = N - 1; COMPILE_ASSERT((N & kMask) == 0); T data_[N]; int64_t count_; }; } // namespace dart #endif // RUNTIME_VM_RING_BUFFER_H_