Adds pedantic-error flag, work on making source more aligned with ISO C++
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
28
src/Enum.hpp
28
src/Enum.hpp
@@ -50,9 +50,9 @@
|
||||
#define ALLOW_UINTEGER_OVERFLOW
|
||||
#endif
|
||||
|
||||
#define ENUM_WITH_START_VALUE(name, type, startValue, values...) \
|
||||
#define ENUM_WITH_START_VALUE(name, type, startValue, ...) \
|
||||
enum class name : type { \
|
||||
MACRO_UTILS_FOR_EACH_WITH_VALUE(ENUM_VALUE, startValue + ___MACRO_UTILS_NARGS(values) - 1, values) \
|
||||
MACRO_UTILS_FOR_EACH_WITH_VALUE(ENUM_VALUE, startValue + ___MACRO_UTILS_NARGS(__VA_ARGS__) - 1, __VA_ARGS__) \
|
||||
}; \
|
||||
class name##Helper { \
|
||||
ALLOW_UINTEGER_OVERFLOW \
|
||||
@@ -69,44 +69,46 @@
|
||||
\
|
||||
public: \
|
||||
constexpr static ArbUt::StringViewLiteral ToString(name value) noexcept { \
|
||||
switch (value) { MACRO_UTILS_FOR_EACH(ENUM_CASE, name, values) } \
|
||||
switch (value) { MACRO_UTILS_FOR_EACH(ENUM_CASE, name, __VA_ARGS__) } \
|
||||
return "out of bounds"_cnc; \
|
||||
} \
|
||||
constexpr static name Parse(const char* non_null input, bool caseInsensitive = false) { \
|
||||
if (caseInsensitive) \
|
||||
return ParseCaseInsensitive(input); \
|
||||
switch (ConstHash(input)) { MACRO_UTILS_FOR_EACH(ENUM_PARSE_CASE, name, values) } \
|
||||
switch (ConstHash(input)) { MACRO_UTILS_FOR_EACH(ENUM_PARSE_CASE, name, __VA_ARGS__) } \
|
||||
throw std::runtime_error("Invalid " #name " string."); \
|
||||
} \
|
||||
constexpr static bool TryParse(const char* non_null input, name& out, bool caseInsensitive = false) noexcept { \
|
||||
if (caseInsensitive) \
|
||||
return TryParseCaseInsensitive(input, out); \
|
||||
switch (ConstHash(input)) { MACRO_UTILS_FOR_EACH(ENUM_TRY_PARSE_CASE, name, values) } \
|
||||
switch (ConstHash(input)) { MACRO_UTILS_FOR_EACH(ENUM_TRY_PARSE_CASE, name, __VA_ARGS__) } \
|
||||
return false; \
|
||||
} \
|
||||
static std::vector<name> GetValues() noexcept { return {MACRO_UTILS_FOR_EACH(ARRAY_NAME, name, values)}; } \
|
||||
constexpr static name Last() noexcept { return name::MACRO_UTILS_GET_LAST(values); } \
|
||||
constexpr static name First() noexcept { return name::MACRO_UTILS_GET_FIRST(values); } \
|
||||
static std::vector<name> GetValues() noexcept { \
|
||||
return {MACRO_UTILS_FOR_EACH(ARRAY_NAME, name, __VA_ARGS__)}; \
|
||||
} \
|
||||
constexpr static name Last() noexcept { return name::MACRO_UTILS_GET_LAST(__VA_ARGS__); } \
|
||||
constexpr static name First() noexcept { return name::MACRO_UTILS_GET_FIRST(__VA_ARGS__); } \
|
||||
constexpr static name Highest() noexcept { \
|
||||
i64 highest = -9223372036854775807; \
|
||||
MACRO_UTILS_FOR_EACH(ENUM_GET_HIGHEST, name, values) \
|
||||
MACRO_UTILS_FOR_EACH(ENUM_GET_HIGHEST, name, __VA_ARGS__) \
|
||||
return (name)highest; \
|
||||
} \
|
||||
constexpr static name Lowest() noexcept { \
|
||||
i64 lowest = 9223372036854775807; \
|
||||
MACRO_UTILS_FOR_EACH(ENUM_GET_LOWEST, name, values) \
|
||||
MACRO_UTILS_FOR_EACH(ENUM_GET_LOWEST, name, __VA_ARGS__) \
|
||||
return (name)lowest; \
|
||||
} \
|
||||
\
|
||||
private: \
|
||||
constexpr static name ParseCaseInsensitive(const char* non_null input) { \
|
||||
switch (ConstHashCI(input)) { MACRO_UTILS_FOR_EACH(ENUM_PARSE_CASE_INSENSITIVE, name, values) } \
|
||||
switch (ConstHashCI(input)) { MACRO_UTILS_FOR_EACH(ENUM_PARSE_CASE_INSENSITIVE, name, __VA_ARGS__) } \
|
||||
throw std::runtime_error("Invalid " #name " string."); \
|
||||
} \
|
||||
constexpr static bool TryParseCaseInsensitive(const char* non_null input, name& out) noexcept { \
|
||||
switch (ConstHashCI(input)) { MACRO_UTILS_FOR_EACH(ENUM_TRY_PARSE_CASE_INSENSITIVE, name, values) } \
|
||||
switch (ConstHashCI(input)) { MACRO_UTILS_FOR_EACH(ENUM_TRY_PARSE_CASE_INSENSITIVE, name, __VA_ARGS__) } \
|
||||
return false; \
|
||||
} \
|
||||
};
|
||||
|
||||
#define ENUM(name, type, values...) ENUM_WITH_START_VALUE(name, type, 0, values);
|
||||
#define ENUM(name, type, ...) ENUM_WITH_START_VALUE(name, type, 0, __VA_ARGS__);
|
||||
|
||||
@@ -155,12 +155,8 @@ namespace ArbUt {
|
||||
};
|
||||
}
|
||||
|
||||
#if !__cpp_consteval
|
||||
#define consteval constexpr
|
||||
#endif
|
||||
|
||||
#define THROW(message, ...) \
|
||||
{ ArbUt::Exception::Throw(message, std::source_location::current(), ##__VA_ARGS__); }
|
||||
{ ArbUt::Exception::Throw(message, std::source_location::current() __VA_OPT__(, ) __VA_ARGS__); }
|
||||
|
||||
#define NOT_REACHABLE THROW("Not reachable");
|
||||
#define NOT_IMPLEMENTED THROW("Not implemented");
|
||||
|
||||
Reference in New Issue
Block a user