/** * @file enum_traits.h * * Base template for 'enum_traits' which allow us to access static information about an enum. */ #pragma once #include namespace devilution { template struct enum_size { constexpr static const std::size_t value = static_cast(T::LAST) + 1; }; template class enum_values { public: class Iterator { typename std::underlying_type::type m_value; public: Iterator(typename std::underlying_type::type value) : m_value(value) { } const T operator*() const { return static_cast(m_value); } void operator++() { m_value++; } bool operator!=(Iterator rhs) const { return m_value != rhs.m_value; } }; }; template typename enum_values::Iterator begin(enum_values) { return typename enum_values::Iterator(static_cast::type>(T::FIRST)); } template typename enum_values::Iterator end(enum_values) { return typename enum_values::Iterator(static_cast::type>(T::LAST) + 1); } } // namespace devilution