/* * Copyright (C) 2008-2018 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef EnumClassFlag_h__ #define EnumClassFlag_h__ #include template class EnumClassFlag { static_assert(std::is_enum::value, "EnumClassFlag must be used only with enums"); public: /*implicit*/ EnumClassFlag(T value) : _value(value) { } EnumClassFlag& operator&=(EnumClassFlag right) { _value = static_cast(static_cast>(_value) & static_cast>(right._value)); return *this; } friend EnumClassFlag operator&(EnumClassFlag left, EnumClassFlag right) { return left &= right; } EnumClassFlag operator|=(EnumClassFlag right) { _value = static_cast(static_cast>(_value) | static_cast>(right._value)); return *this; } friend EnumClassFlag operator|(EnumClassFlag left, EnumClassFlag right) { return left |= right; } EnumClassFlag operator~() const { return static_cast(~static_cast>(_value)); } void RemoveFlag(EnumClassFlag flag) { _value = static_cast(static_cast>(_value) & ~static_cast>(flag._value)); } bool HasFlag(T flag) const { return (static_cast>(_value) & static_cast>(flag)) != 0; } operator T() const { return _value; } std::underlying_type_t AsUnderlyingType() const { return static_cast>(_value); } private: T _value; }; #endif // EnumClassFlag_h__