31#ifndef DW_FRAMEWORK_ENUMDESCRIPTOR_HPP_
32#define DW_FRAMEWORK_ENUMDESCRIPTOR_HPP_
34#include <dw/core/base/Status.h>
35#include <dwshared/dwfoundation/dw/core/container/StringView.hpp>
43#define DW_ENUMERATOR_NAME_STRING_VIEW(NAME_STR) NAME_STR##_sv
53#define DW_DESCRIBE_ENUMERATOR(NAME) describeEnumerator(DW_ENUMERATOR_NAME_STRING_VIEW(#NAME), EnumT::NAME)
61#define DW_DESCRIBE_C_ENUMERATOR(NAME) describeEnumerator(DW_ENUMERATOR_NAME_STRING_VIEW(#NAME), (NAME))
70template <
typename EnumT>
73 static_assert(std::is_enum<EnumT>::value,
"EnumT must be an enumeration type");
84 static constexpr auto get()
86 static_assert(
sizeof(EnumT) == 0,
"Needs specialization for specific enum type");
87 constexpr const size_t numberOfEnumerators = 0;
88 std::array<std::pair<dw::core::StringView, EnumT>, numberOfEnumerators> ret;
105template <
typename EnumT,
typename... Args>
109 return std::array<std::pair<dw::core::StringView, EnumT>,
sizeof...(Args)>{std::forward<const Args>(args)...};
124template <
typename EnumT>
126constexpr auto describeEnumerator(dw::core::StringView
const&& name, EnumT value) -> std::pair<dw::core::StringView, EnumT>
128 return std::make_pair(std::move(name), value);
138template <
typename EnumT>
144 for (
const auto& pair : pairs)
146 if (pair.first == name)
152 FixedString<4096> validNames{};
153 for (
const auto& pair : pairs)
156 validNames <<
" " << pair.first;
158 throw ExceptionWithStatus(DW_INVALID_ARGUMENT,
"Invalid enumerator name '", name,
"' for enum type ",
typeid(EnumT).name(),
", valid names:", validNames);
168template <
typename EnumT>
174 for (
const auto& pair : pairs)
176 if (pair.second == value)
181 throw ExceptionWithStatus(DW_INVALID_ARGUMENT,
"The enumerator value is invalid: ",
typeid(EnumT).name(),
" ",
static_cast<std::underlying_type_t<EnumT>
>(value));
dw::core::StringView mapEnumValueToName(EnumT value)
Get the enumerator name based on the value.
constexpr auto describeEnumeratorCollection(Args const &&... args) -> std::array< std::pair< dw::core::StringView, EnumT >, sizeof...(Args)>
Describe the enumerators.
constexpr auto describeEnumerator(dw::core::StringView const &&name, EnumT value) -> std::pair< dw::core::StringView, EnumT >
Describe an enumerator.
auto mapEnumNameToValue(dw::core::StringView const &name) -> EnumT
Get the enumerator value based on the name.
static constexpr auto get()
Describe the enumerators.