diff -r 000000000000 -r 6474c204b198 mfbt/EnumeratedArray.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mfbt/EnumeratedArray.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* EnumeratedArray is like Array, but indexed by a typed enum. */ + +#ifndef mozilla_EnumeratedArray_h +#define mozilla_EnumeratedArray_h + +#include "mozilla/Array.h" +#include "mozilla/TypedEnum.h" + +namespace mozilla { + +/** + * EnumeratedArray is a fixed-size array container for use when an + * array is indexed by a specific enum class, as currently implemented + * by MOZ_BEGIN_ENUM_CLASS. + * + * This provides type safety by guarding at compile time against accidentally + * indexing such arrays with unrelated values. This also removes the need + * for manual casting when using a typed enum value to index arrays. + * + * Aside from the typing of indices, EnumeratedArray is similar to Array. + * + * Example: + * + * MOZ_BEGIN_ENUM_CLASS(AnimalSpecies) + * Cow, + * Sheep, + * Count + * MOZ_END_ENUM_CLASS(AnimalSpecies) + * + * EnumeratedArray headCount; + * + * headCount[AnimalSpecies::Cow] = 17; + * headCount[AnimalSpecies::Sheep] = 30; + * + */ +template +class EnumeratedArray +{ + public: + static const size_t Size = size_t(SizeAsEnumValue); + + private: + Array mArray; + + public: + EnumeratedArray() {} + + explicit EnumeratedArray(const EnumeratedArray& aOther) + { + for (size_t i = 0; i < Size; i++) + mArray[i] = aOther.mArray[i]; + } + + explicit EnumeratedArray(const ValueType (&aOther)[Size]) + { + for (size_t i = 0; i < Size; i++) + mArray[i] = aOther[i]; + } + + ValueType& operator[](IndexType aIndex) + { + return mArray[size_t(aIndex)]; + } + + const ValueType& operator[](IndexType aIndex) const + { + return mArray[size_t(aIndex)]; + } +}; + +} // namespace mozilla + +#endif // mozilla_EnumeratedArray_h