45#ifndef LLVMEXPR_UTILS_ENUMNAME_HPP
46#define LLVMEXPR_UTILS_ENUMNAME_HPP
54#error "Vapoursynth-llvmexpr is only supported by Clang"
57template <auto value>
consteval std::string_view
enum_name() {
58 constexpr std::string_view NAME = __PRETTY_FUNCTION__;
59 constexpr auto START = NAME.find(
'=') + 2;
60 constexpr auto END = NAME.size() - 1;
61 constexpr auto FULL = NAME.substr(START, END - START);
62 constexpr auto LAST_COLON = FULL.rfind(
"::");
63 return LAST_COLON == std::string_view::npos ? FULL
64 : FULL.substr(LAST_COLON + 2);
72template <
typename T, std::
size_t N = 1>
81template <
typename T, std::
size_t Low, std::
size_t High>
83 if constexpr (High - Low <= 1) {
86 constexpr std::size_t MID = Low + ((High - Low) / 2);
95template <
typename T>
consteval std::size_t
enum_count() {
100template <
typename T, std::size_t... Is>
110template <
typename T>
constexpr std::size_t
enum_max() {
115 requires std::is_enum_v<T> && std::is_scoped_enum_v<T>
118 const auto index =
static_cast<std::size_t
>(std::to_underlying(value));
119 return index < NAMES.size() ? NAMES[index] : std::string_view{};
constexpr std::size_t enum_max()
consteval std::string_view enum_name()
consteval auto make_names_impl(std::index_sequence< Is... >)
consteval std::size_t enum_count()
consteval auto make_names()
consteval bool is_valid_enum()
consteval std::size_t binary_search_count()
consteval std::size_t find_upper_bound()