Horizon
Loading...
Searching...
No Matches
named_vector.hpp
1#pragma once
2#include <vector>
3#include <cstddef>
4#include <cstdint>
5
6namespace horizon {
7namespace detail {
8template <typename Parameter> class NamedIndex {
9public:
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
48private:
49 size_t value_;
50};
51} // namespace detail
52
53template <typename T, typename Name> class NamedVector {
54public:
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
105private:
106 vector_type vec;
107};
108} // namespace horizon
Definition named_vector.hpp:53
Definition named_vector.hpp:8