From fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 03:14:29 +0200 Subject: Merging upstream version 125.0.1. Signed-off-by: Daniel Baumann --- mfbt/EnumeratedArray.h | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) (limited to 'mfbt/EnumeratedArray.h') diff --git a/mfbt/EnumeratedArray.h b/mfbt/EnumeratedArray.h index f6edff4875..ba902d94b9 100644 --- a/mfbt/EnumeratedArray.h +++ b/mfbt/EnumeratedArray.h @@ -12,6 +12,7 @@ #include #include "mozilla/Array.h" +#include "EnumTypeTraits.h" namespace mozilla { @@ -33,19 +34,23 @@ namespace mozilla { * Count * }; * - * EnumeratedArray headCount; + * EnumeratedArray headCount; * * headCount[AnimalSpecies::Cow] = 17; * headCount[AnimalSpecies::Sheep] = 30; * + * If the enum class has contiguous values and provides a specialization of + * mozilla::MaxContiguousEnumValue then the size will be calculated as the max + * value + 1. */ -template +template ::value> class EnumeratedArray { - public: - static const size_t kSize = size_t(SizeAsEnumValue); - private: - typedef Array ArrayType; + static_assert(UnderlyingValue(MinContiguousEnumValue::value) == 0, + "All indexes would need to be corrected if min != 0"); + + using ArrayType = Array; ArrayType mArray; @@ -56,16 +61,16 @@ class EnumeratedArray { MOZ_IMPLICIT constexpr EnumeratedArray(Args&&... aArgs) : mArray{std::forward(aArgs)...} {} - ValueType& operator[](IndexType aIndex) { return mArray[size_t(aIndex)]; } + ValueType& operator[](Enum aIndex) { return mArray[size_t(aIndex)]; } - const ValueType& operator[](IndexType aIndex) const { + const ValueType& operator[](Enum aIndex) const { return mArray[size_t(aIndex)]; } - typedef typename ArrayType::iterator iterator; - typedef typename ArrayType::const_iterator const_iterator; - typedef typename ArrayType::reverse_iterator reverse_iterator; - typedef typename ArrayType::const_reverse_iterator const_reverse_iterator; + using iterator = typename ArrayType::iterator; + using const_iterator = typename ArrayType::const_iterator; + using reverse_iterator = typename ArrayType::reverse_iterator; + using const_reverse_iterator = typename ArrayType::const_reverse_iterator; // Methods for range-based for loops. iterator begin() { return mArray.begin(); } -- cgit v1.2.3