text: // 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 <typename T, int N>
  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<int64_t>(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_
  