Commit c2136b67 by Jamie Madill Committed by Commit Bot

Allow constexpr initialization of PackedEnumMap.

By making mData public we can use aggregate initialization. The syntax is the same as for initializing a std::array. It might be possible to also use std::map initialization syntax using a list of pairs. That is left for a follow-up. Bug: angleproject:2568 Change-Id: I30a6f280172cb197208d14b1a53b9cc12b7834d8 Reviewed-on: https://chromium-review.googlesource.com/1127181 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTobin Ehlis <tobine@google.com>
parent 8fbd9d96
...@@ -70,12 +70,9 @@ struct AllEnums ...@@ -70,12 +70,9 @@ struct AllEnums
template <typename E, typename T> template <typename E, typename T>
class PackedEnumMap class PackedEnumMap
{ {
private:
using UnderlyingType = typename std::underlying_type<E>::type; using UnderlyingType = typename std::underlying_type<E>::type;
using Storage = std::array<T, EnumSize<E>()>; using Storage = std::array<T, EnumSize<E>()>;
Storage mData;
public: public:
// types: // types:
using value_type = T; using value_type = T;
...@@ -93,38 +90,41 @@ class PackedEnumMap ...@@ -93,38 +90,41 @@ class PackedEnumMap
using const_reverse_iterator = std::reverse_iterator<const_iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>;
// No explicit construct/copy/destroy for aggregate type // No explicit construct/copy/destroy for aggregate type
void fill(const T &u) { mData.fill(u); } void fill(const T &u) { mPrivateData.fill(u); }
void swap(PackedEnumMap<E, T> &a) noexcept { mData.swap(a.mData); } void swap(PackedEnumMap<E, T> &a) noexcept { mPrivateData.swap(a.mPrivateData); }
// iterators: // iterators:
iterator begin() noexcept { return mData.begin(); } iterator begin() noexcept { return mPrivateData.begin(); }
const_iterator begin() const noexcept { return mData.begin(); } const_iterator begin() const noexcept { return mPrivateData.begin(); }
iterator end() noexcept { return mData.end(); } iterator end() noexcept { return mPrivateData.end(); }
const_iterator end() const noexcept { return mData.end(); } const_iterator end() const noexcept { return mPrivateData.end(); }
reverse_iterator rbegin() noexcept { return mData.rbegin(); } reverse_iterator rbegin() noexcept { return mPrivateData.rbegin(); }
const_reverse_iterator rbegin() const noexcept { return mData.rbegin(); } const_reverse_iterator rbegin() const noexcept { return mPrivateData.rbegin(); }
reverse_iterator rend() noexcept { return mData.rend(); } reverse_iterator rend() noexcept { return mPrivateData.rend(); }
const_reverse_iterator rend() const noexcept { return mData.rend(); } const_reverse_iterator rend() const noexcept { return mPrivateData.rend(); }
// capacity: // capacity:
constexpr size_type size() const noexcept { return mData.size(); } constexpr size_type size() const noexcept { return mPrivateData.size(); }
constexpr size_type max_size() const noexcept { return mData.max_size(); } constexpr size_type max_size() const noexcept { return mPrivateData.max_size(); }
constexpr bool empty() const noexcept { return mData.empty(); } constexpr bool empty() const noexcept { return mPrivateData.empty(); }
// element access: // element access:
reference operator[](E n) { return mData[static_cast<UnderlyingType>(n)]; } reference operator[](E n) { return mPrivateData[static_cast<UnderlyingType>(n)]; }
const_reference operator[](E n) const { return mData[static_cast<UnderlyingType>(n)]; } const_reference operator[](E n) const { return mPrivateData[static_cast<UnderlyingType>(n)]; }
const_reference at(E n) const { return mData.at(static_cast<UnderlyingType>(n)); } const_reference at(E n) const { return mPrivateData.at(static_cast<UnderlyingType>(n)); }
reference at(E n) { return mData.at(static_cast<UnderlyingType>(n)); } reference at(E n) { return mPrivateData.at(static_cast<UnderlyingType>(n)); }
reference front() { return mData.front(); } reference front() { return mPrivateData.front(); }
const_reference front() const { return mData.front(); } const_reference front() const { return mPrivateData.front(); }
reference back() { return mData.back(); } reference back() { return mPrivateData.back(); }
const_reference back() const { return mData.back(); } const_reference back() const { return mPrivateData.back(); }
T *data() noexcept { return mData.data(); } T *data() noexcept { return mPrivateData.data(); }
const T *data() const noexcept { return mData.data(); } const T *data() const noexcept { return mPrivateData.data(); }
// Do not access this variable directly. It unfortunately must be public to use aggregate init.
/* private: */ Storage mPrivateData;
}; };
// PackedEnumBitSetE> is like an std::bitset<E::EnumCount> but is indexed with enum values. It // PackedEnumBitSetE> is like an std::bitset<E::EnumCount> but is indexed with enum values. It
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment