Flutter Engine
The Flutter Engine
ring_buffer.h
Go to the documentation of this file.
1// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4
5#ifndef RUNTIME_VM_RING_BUFFER_H_
6#define RUNTIME_VM_RING_BUFFER_H_
7
8#include "platform/assert.h"
9#include "platform/utils.h"
10
11namespace dart {
12
13// Fixed-capacity ring buffer.
14template <typename T, int N>
16 public:
17 RingBuffer() : count_(0) {}
18
19 void Add(const T& t) { data_[count_++ & kMask] = t; }
20
21 // Returns the i'th most recently added element. Requires 0 <= i < Size().
22 const T& Get(int i) const {
23 ASSERT(0 <= i && i < Size());
24 return data_[(count_ - i - 1) & kMask];
25 }
26
27 // Returns the number of elements currently stored in this buffer (at most N).
28 int64_t Size() const {
29 return Utils::Minimum(count_, static_cast<int64_t>(N));
30 }
31
32 private:
33 static constexpr int kMask = N - 1;
34 COMPILE_ASSERT((N & kMask) == 0);
35 T data_[N];
36 int64_t count_;
37};
38
39} // namespace dart
40
41#endif // RUNTIME_VM_RING_BUFFER_H_
#define N
Definition: beziers.cpp:19
const T & Get(int i) const
Definition: ring_buffer.h:22
int64_t Size() const
Definition: ring_buffer.h:28
void Add(const T &t)
Definition: ring_buffer.h:19
static T Minimum(T x, T y)
Definition: utils.h:36
#define ASSERT(E)
Definition: dart_vm.cc:33
#define T
Definition: precompiler.cc:65