//===- Flags.h ------------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_ADT_FLAGS_H_ #define MCLD_ADT_FLAGS_H_ namespace mcld { template class Flags { public: typedef Enum enum_type; public: Flags(const Flags& pOther) : m_Data(pOther.m_Data) {} explicit Flags(Enum pFlag) : m_Data(pFlag) {} explicit Flags(unsigned int pFlag = 0x0) : m_Data(pFlag) {} operator unsigned int() const { return m_Data; } bool operator!() const { return (m_Data == 0x0); } Flags operator&(int pMask) const { return Flags(m_Data & pMask); } Flags operator&(unsigned int pMask) const { return Flags(m_Data & pMask); } Flags operator&(Enum pMask) const { return Flags(m_Data & pMask); } Flags& operator&=(unsigned int pMask) { m_Data &= pMask; return *this; } Flags& operator=(Flags pOther) { m_Data = pOther.m_Data; return *this; } Flags operator^(Flags pOther) const { return Flags(m_Data ^ pOther.m_Data); } Flags operator^(Enum pOther) const { return Flags(m_Data ^ pOther); } Flags& operator^=(Flags pOther) { m_Data ^= pOther.m_Data; return *this; } Flags& operator^=(Enum pOther) { m_Data ^= pOther; return *this; } Flags operator|(Flags pOther) const { return Flags(m_Data | pOther.m_Data); } Flags operator|(Enum pOther) const { return Flags(m_Data | pOther); } Flags& operator|=(Flags pOther) { m_Data |= pOther.m_Data; return *this; } Flags& operator|=(Enum pOther) { m_Data |= pOther; return *this; } Flags operator~() const { return Flags(~m_Data); } private: unsigned int m_Data; }; } // namespace mcld #endif // MCLD_ADT_FLAGS_H_