32#ifndef LLVM_SUPPORT_ENUM_H
33#define LLVM_SUPPORT_ENUM_H
48 std::array<std::string_view, NumStrs>
Names;
52template <
typename T,
unsigned NumStrs = 1>
class EnumString {
53 template <
typename,
unsigned,
size_t,
size_t>
60 constexpr EnumString() {}
63 EnumString(
const EnumString &) =
delete;
64 EnumString &operator=(
const EnumString &) =
delete;
69 return {
reinterpret_cast<const char *
>(
this) + NameOff[Idx], NameSize[Idx]};
71 constexpr T value()
const {
return Value; }
75template <
typename T,
unsigned NumStrs,
size_t N>
79 for (
unsigned i = 0; i !=
N; i++)
80 for (
unsigned j = 0; j != NumStrs; j++)
81 Len += Entries[i].Names[j].
size();
86template <
typename T,
unsigned NumStrs,
size_t N,
size_t StrLen>
94 for (
unsigned i = 0; i <
N; i++) {
95 Data[i].Value = Entries[i].Value;
96 for (
unsigned j = 0; j < NumStrs; j++) {
100 assert(StrOff - DataOff <= UINT16_MAX &&
"enum string table too large");
101 std::string_view Name = Entries[i].Names[j];
102 assert(Name.size() <= UINT8_MAX &&
"enum name too long");
103 Data[i].NameSize[j] = Name.size();
111 constexpr size_t size()
const {
return N; }
120#define BUILD_ENUM_STRINGS(Tab) \
121 (::llvm::EnumStringsStorage<decltype(Tab[0].Value), Tab[0].Names.size(), \
122 sizeof(Tab) / sizeof(Tab[0]), \
123 ::llvm::detail::enumStringsStorageSize(Tab)>{ \
130 template <
size_t N,
size_t StrLen>
132 : EnumValues(Table.
Data,
N) {}
134 template <
typename TValue>
137 for (
const auto &EnumItem : EnumValues)
138 if (EnumItem.value() ==
Value)
139 return EnumItem.name(StrIdx);
143 template <
typename TValue>
150 size_t size()
const {
return EnumValues.size(); }
159template <
typename T,
unsigned NumStrs,
size_t N,
size_t StrLen>
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define offsetof(TYPE, MEMBER)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
constexpr T value() const
constexpr StringRef name(unsigned Idx=0) const
friend struct EnumStringsStorage
const EnumString * begin() const
const EnumString * end() const
StringRef toString(TValue Value, unsigned StrIdx=0) const
const EnumString & operator[](size_t Idx) const
std::string toStringOrHex(TValue Value, unsigned StrIdx=0) const
EnumStrings(const EnumStringsStorage< T, NumStrs, N, StrLen > &Table)
::llvm::EnumString< T, NumStrs > EnumString
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
LLVM Value Representation.
@ C
The default llvm calling convention, compatible with C.
constexpr size_t NameSize
constexpr unsigned enumStringsStorageSize(const EnumStringDef< T, NumStrs >(&Entries)[N])
This is an optimization pass for GlobalISel generic memory operations.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
std::string utohexstr(uint64_t X, bool LowerCase=false, unsigned Width=0)
EnumStrings(const EnumStringsStorage< T, NumStrs, N, StrLen > &) -> EnumStrings< T, NumStrs >
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Compile-time data representation of enum entries.
std::array< std::string_view, NumStrs > Names
const EnumString< T, NumStrs > * begin() const
constexpr size_t size() const
constexpr EnumStringsStorage(const EnumStringDef< T, NumStrs >(&Entries)[N])
EnumString< T, NumStrs > Data[N]
const EnumString< T, NumStrs > & operator[](size_t Idx) const
const EnumString< T, NumStrs > * end() const