update shit
This commit is contained in:
@ -45,19 +45,34 @@
|
||||
#include <type_traits>
|
||||
#include <cinttypes>
|
||||
#include <cstdint>
|
||||
#include <cstdarg>
|
||||
|
||||
namespace LibCmo {
|
||||
|
||||
namespace EnumsHelper {
|
||||
template<typename TEnum>
|
||||
inline TEnum FlagEnumAdd(TEnum e, ...) {
|
||||
TEnum result = e;
|
||||
va_list argptr;
|
||||
va_start(argptr, e);
|
||||
result = static_cast<TEnum>(static_cast<std::underlying_type_t<TEnum>>(result) | static_cast<std::underlying_type_t<TEnum>>(va_arg(argptr, TEnum)));
|
||||
va_end(argptr);
|
||||
return result;
|
||||
inline TEnum FlagEnumMerge(std::initializer_list<TEnum> il) {
|
||||
std::underlying_type_t<TEnum> result = 0u;
|
||||
for (auto it = il.begin(); it != il.end(); ++it) {
|
||||
result |= static_cast<std::underlying_type_t<TEnum>>(*it);
|
||||
}
|
||||
return static_cast<TEnum>(result);
|
||||
}
|
||||
|
||||
template<typename TEnum>
|
||||
inline TEnum FlagEnumInv(TEnum e) {
|
||||
return static_cast<TEnum>(~(static_cast<std::underlying_type_t<TEnum>>(e)));
|
||||
}
|
||||
|
||||
template<typename TEnum>
|
||||
inline void FlagEnumRm(TEnum& e, std::initializer_list<TEnum> il) {
|
||||
auto mask = FlagEnumInv(FlagEnumMerge(il));
|
||||
e = static_cast<TEnum>(static_cast<std::underlying_type_t<TEnum>>(e) & static_cast<std::underlying_type_t<TEnum>>(mask));
|
||||
}
|
||||
|
||||
template<typename TEnum>
|
||||
inline void FlagEnumAdd(TEnum& e, std::initializer_list<TEnum> il) {
|
||||
auto mask = FlagEnumMerge(il);
|
||||
e = static_cast<TEnum>(static_cast<std::underlying_type_t<TEnum>>(e) | static_cast<std::underlying_type_t<TEnum>>(mask));
|
||||
}
|
||||
|
||||
template<typename TEnum>
|
||||
|
Reference in New Issue
Block a user