#pragma once #include namespace chatterino { namespace util { template ::value>::type, typename Q = std::underlying_type::type> class FlagsEnum { public: FlagsEnum() : value((T)0) { } FlagsEnum(T _value) : value(_value) { } inline T operator~() const { return (T) ~(Q)this->value; } inline T operator|(Q a) const { return (T)((Q)a | (Q)this->value); } inline T operator&(Q a) const { return (T)((Q)a & (Q)this->value); } inline T operator^(Q a) const { return (T)((Q)a ^ (Q)this->value); } inline T &operator|=(const Q &a) { return (T &)((Q &)a |= (Q)this->value); } inline T &operator&=(const Q &a) { return (T &)((Q &)a &= (Q)this->value); } inline T &operator^=(const Q &a) { return (T &)((Q &)a ^= (Q)this->value); } T value; }; } // namespace util } // namespace chatterino