diff --git a/llvm/include/llvm/ADT/EnumeratedArray.h b/llvm/include/llvm/ADT/EnumeratedArray.h index 93e1327306175..2fe6be434f11b 100644 --- a/llvm/include/llvm/ADT/EnumeratedArray.h +++ b/llvm/include/llvm/ADT/EnumeratedArray.h @@ -15,8 +15,9 @@ #ifndef LLVM_ADT_ENUMERATEDARRAY_H #define LLVM_ADT_ENUMERATEDARRAY_H +#include "llvm/ADT/STLExtras.h" +#include #include -#include namespace llvm { @@ -24,12 +25,15 @@ template (LargestEnum)> class EnumeratedArray { -public: - using iterator = ValueType *; - using const_iterator = const ValueType *; + static_assert(Size > 0); + using ArrayTy = std::array; + ArrayTy Underlying; - using const_reverse_iterator = std::reverse_iterator; - using reverse_iterator = std::reverse_iterator; +public: + using iterator = typename ArrayTy::iterator; + using const_iterator = typename ArrayTy::const_iterator; + using reverse_iterator = typename ArrayTy::reverse_iterator; + using const_reverse_iterator = typename ArrayTy::const_reverse_iterator; using value_type = ValueType; using reference = ValueType &; @@ -38,16 +42,10 @@ class EnumeratedArray { using const_pointer = const ValueType *; EnumeratedArray() = default; - EnumeratedArray(ValueType V) { - for (IndexType IX = 0; IX < Size; ++IX) { - Underlying[IX] = V; - } - } + EnumeratedArray(ValueType V) { Underlying.fill(V); } EnumeratedArray(std::initializer_list Init) { assert(Init.size() == Size && "Incorrect initializer size"); - for (IndexType IX = 0; IX < Size; ++IX) { - Underlying[IX] = *(Init.begin() + IX); - } + llvm::copy(Init, Underlying.begin()); } const ValueType &operator[](Enumeration Index) const { @@ -62,23 +60,15 @@ class EnumeratedArray { IndexType size() const { return Size; } bool empty() const { return size() == 0; } - iterator begin() { return Underlying; } - const_iterator begin() const { return Underlying; } - - iterator end() { return begin() + size(); } - const_iterator end() const { return begin() + size(); } - - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(end()); - } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { - return const_reverse_iterator(begin()); - } + iterator begin() { return Underlying.begin(); } + const_iterator begin() const { return Underlying.begin(); } + iterator end() { return Underlying.end(); } + const_iterator end() const { return Underlying.end(); } -private: - ValueType Underlying[Size]; + reverse_iterator rbegin() { return Underlying.rbegin(); } + const_reverse_iterator rbegin() const { return Underlying.rbegin(); } + reverse_iterator rend() { return Underlying.rend(); } + const_reverse_iterator rend() const { return Underlying.rend(); } }; } // namespace llvm