summaryrefslogtreecommitdiff
path: root/Source/Core/Common/SmallVector.h
blob: c7018f474103d744c2f0068aaaee7d615c286566 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// SPDX-License-Identifier: CC0-1.0

#pragma once

#include <array>
#include <cstddef>
#include <utility>

namespace Common
{

// An std::vector-like container that uses no heap allocations but is limited to a maximum size.
template <typename T, size_t MaxSize>
class SmallVector final
{
public:
  SmallVector() = default;
  explicit SmallVector(size_t size) : m_size(size) {}

  void push_back(const T& x) { m_array[m_size++] = x; }
  void push_back(T&& x) { m_array[m_size++] = std::move(x); }

  template <typename... Args>
  T& emplace_back(Args&&... args)
  {
    return m_array[m_size++] = T{std::forward<Args>(args)...};
  }

  T& operator[](size_t i) { return m_array[i]; }
  const T& operator[](size_t i) const { return m_array[i]; }

  auto data() { return m_array.data(); }
  auto begin() { return m_array.begin(); }
  auto end() { return m_array.begin() + m_size; }

  auto data() const { return m_array.data(); }
  auto begin() const { return m_array.begin(); }
  auto end() const { return m_array.begin() + m_size; }

  size_t size() const { return m_size; }
  bool empty() const { return m_size == 0; }

private:
  std::array<T, MaxSize> m_array{};
  size_t m_size = 0;
};

}  // namespace Common