// Copyright (C) 2016 Jérôme Leclercq // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_FLAGS_HPP #define NAZARA_FLAGS_HPP #include #include namespace Nz { template class Flags { static_assert(std::is_enum::value, "Type must be an enumeration"); public: constexpr Flags(UInt32 value); constexpr Flags(E enumVal); explicit constexpr operator bool() const; explicit constexpr operator UInt32() const; constexpr Flags operator~() const; constexpr Flags operator&(Flags rhs) const; constexpr Flags operator|(Flags rhs) const; constexpr Flags operator^(Flags rhs) const; constexpr bool operator==(Flags rhs) const; constexpr bool operator!=(Flags rhs) const; /*constexpr*/ Flags& operator|=(Flags rhs); /*constexpr*/ Flags& operator&=(Flags rhs); /*constexpr*/ Flags& operator^=(Flags rhs); static constexpr UInt32 GetFlagValue(E enumValue); private: UInt32 m_value; }; // From: https://www.justsoftwaresolutions.co.uk/cplusplus/using-enum-classes-as-bitfields.html template struct EnableFlagsOperators { static constexpr bool value = false; }; template constexpr std::enable_if_t::value, Flags> operator~(E lhs); template constexpr std::enable_if_t::value, Flags> operator|(E lhs, E rhs); template constexpr std::enable_if_t::value, Flags> operator&(E lhs, E rhs); template constexpr std::enable_if_t::value, Flags> operator^(E lhs, E rhs); } #include #endif // NAZARA_FLAGS_HPP