Skip to content

Commit a767077

Browse files
[ADT] Implement EnumeratedArray with std::array (NFC)
EnumeratedArray provides an std::array-like interface except that you access the array with an enum index. Now, the problem is that because the underlying array is implemented as a C array, we have to mirror what std::array would do: iterator end() { return begin() + size(); } reverse_iterator rbegin() { return reverse_iterator(end()); } This patch switches to the std::array. This way, we just have to "forward" calls to begin, end, rbegin, rend, etc. Also, we benefit from std::array::fill in one of the constructors.
1 parent c642e2a commit a767077

File tree

1 file changed

+17
-27
lines changed

1 file changed

+17
-27
lines changed

llvm/include/llvm/ADT/EnumeratedArray.h

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,23 @@
1515
#ifndef LLVM_ADT_ENUMERATEDARRAY_H
1616
#define LLVM_ADT_ENUMERATEDARRAY_H
1717

18+
#include <array>
1819
#include <cassert>
19-
#include <iterator>
2020

2121
namespace llvm {
2222

2323
template <typename ValueType, typename Enumeration,
2424
Enumeration LargestEnum = Enumeration::Last, typename IndexType = int,
2525
IndexType Size = 1 + static_cast<IndexType>(LargestEnum)>
2626
class EnumeratedArray {
27-
public:
28-
using iterator = ValueType *;
29-
using const_iterator = const ValueType *;
27+
using ArrayTy = std::array<ValueType, Size>;
28+
ArrayTy Underlying;
3029

31-
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
32-
using reverse_iterator = std::reverse_iterator<iterator>;
30+
public:
31+
using iterator = typename ArrayTy::iterator;
32+
using const_iterator = typename ArrayTy::const_iterator;
33+
using reverse_iterator = typename ArrayTy::reverse_iterator;
34+
using const_reverse_iterator = typename ArrayTy::const_reverse_iterator;
3335

3436
using value_type = ValueType;
3537
using reference = ValueType &;
@@ -38,11 +40,7 @@ class EnumeratedArray {
3840
using const_pointer = const ValueType *;
3941

4042
EnumeratedArray() = default;
41-
EnumeratedArray(ValueType V) {
42-
for (IndexType IX = 0; IX < Size; ++IX) {
43-
Underlying[IX] = V;
44-
}
45-
}
43+
EnumeratedArray(ValueType V) { Underlying.fill(V); }
4644
EnumeratedArray(std::initializer_list<ValueType> Init) {
4745
assert(Init.size() == Size && "Incorrect initializer size");
4846
for (IndexType IX = 0; IX < Size; ++IX) {
@@ -62,23 +60,15 @@ class EnumeratedArray {
6260
IndexType size() const { return Size; }
6361
bool empty() const { return size() == 0; }
6462

65-
iterator begin() { return Underlying; }
66-
const_iterator begin() const { return Underlying; }
67-
68-
iterator end() { return begin() + size(); }
69-
const_iterator end() const { return begin() + size(); }
70-
71-
reverse_iterator rbegin() { return reverse_iterator(end()); }
72-
const_reverse_iterator rbegin() const {
73-
return const_reverse_iterator(end());
74-
}
75-
reverse_iterator rend() { return reverse_iterator(begin()); }
76-
const_reverse_iterator rend() const {
77-
return const_reverse_iterator(begin());
78-
}
63+
iterator begin() { return Underlying.begin(); }
64+
const_iterator begin() const { return Underlying.begin(); }
65+
iterator end() { return Underlying.end(); }
66+
const_iterator end() const { return Underlying.end(); }
7967

80-
private:
81-
ValueType Underlying[Size];
68+
reverse_iterator rbegin() { return Underlying.rbegin(); }
69+
const_reverse_iterator rbegin() const { return Underlying.rbegin(); }
70+
reverse_iterator rend() { return Underlying.rend(); }
71+
const_reverse_iterator rend() const { return Underlying.rend(); }
8272
};
8373

8474
} // namespace llvm

0 commit comments

Comments
 (0)