Horizon
named_vector.hpp
1 #pragma once
2 #include <vector>
3 #include <cstddef>
4 #include <cstdint>
5 
6 namespace horizon {
7 namespace detail {
8 template <typename Parameter> class NamedIndex {
9 public:
10  explicit NamedIndex(size_t value) : value_(value)
11  {
12  }
13 
14  NamedIndex() : value_(SIZE_MAX)
15  {
16  }
17 
18  bool has_value() const
19  {
20  return value_ != SIZE_MAX;
21  }
22 
23  size_t get() const
24  {
25  return value_;
26  }
27 
28  size_t operator++(int)
29  {
30  return value_++;
31  }
32 
33  auto operator+(size_t other) const
34  {
35  return NamedIndex<Parameter>{get() + other};
36  }
37 
38  bool operator<(NamedIndex<Parameter> other) const
39  {
40  return get() < other.get();
41  }
42 
43  bool operator==(NamedIndex<Parameter> other) const
44  {
45  return get() == other.get();
46  }
47 
48 private:
49  size_t value_;
50 };
51 } // namespace detail
52 
53 template <typename T, typename Name> class NamedVector {
54 public:
55  NamedVector() = default;
56  using vector_type = std::vector<T>;
58 
59  static index_type make_index(typename vector_type::size_type i)
60  {
61  return index_type{i};
62  }
63 
64  typename vector_type::reference at(index_type i)
65  {
66  return vec.at(i.get());
67  }
68 
69  typename vector_type::const_reference at(index_type i) const
70  {
71  return vec.at(i.get());
72  }
73 
74  void push_back(const T &value)
75  {
76  vec.push_back(value);
77  }
78 
79  template <class... Args> void emplace_back(Args &&...args)
80  {
81  vec.emplace_back(std::forward<Args>(args)...);
82  }
83 
84  auto size() const
85  {
86  return make_index(vec.size());
87  }
88 
89  void reserve(size_t s)
90  {
91  vec.reserve(s);
92  }
93 
94  auto begin()
95  {
96  return vec.begin();
97  }
98 
99  auto end()
100  {
101  return vec.end();
102  }
103 
104 
105 private:
106  vector_type vec;
107 };
108 } // namespace horizon
Definition: named_vector.hpp:53
Definition: named_vector.hpp:8