blob: bae6a75237a161ebd1007d23afcd61bf292eb33f (
plain) (
blame)
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#pragma once
#include <library/cpp/yt/misc/enum.h>
namespace NYT {
////////////////////////////////////////////////////////////////////////////////
//! A statically sized vector with elements of type |T| indexed by
//! the items of enumeration type |E|.
/*!
* By default, valid indexes are in range from the minimum declared value of |E|
* to the maximum declared value of |E|.
*
* Items are value-initialized on construction.
*/
template <
class E,
class T,
E Min = TEnumTraits<E>::GetMinValue(),
E Max = TEnumTraits<E>::GetMaxValue()
>
class TEnumIndexedArray
{
public:
static_assert(Min <= Max);
using TIndex = E;
using TValue = T;
constexpr TEnumIndexedArray() = default;
TEnumIndexedArray(std::initializer_list<std::pair<E, T>> elements);
constexpr TEnumIndexedArray(const TEnumIndexedArray&) = default;
constexpr TEnumIndexedArray(TEnumIndexedArray&&) = default;
constexpr TEnumIndexedArray& operator=(const TEnumIndexedArray&) = default;
constexpr TEnumIndexedArray& operator=(TEnumIndexedArray&&) = default;
T& operator[] (E index);
const T& operator[] (E index) const;
// STL interop.
T* begin();
const T* begin() const;
T* end();
const T* end() const;
constexpr size_t size() const;
static bool IsValidIndex(E index);
private:
static constexpr size_t Size = static_cast<size_t>(Max) - static_cast<size_t>(Min) + 1;
std::array<T, Size> Items_{};
};
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT
#define ENUM_INDEXED_ARRAY_INL_H_
#include "enum_indexed_array-inl.h"
#undef ENUM_INDEXED_ARRAY_INL_H_
|