blob: e53ee093b028ac017f14bb2e0461d66ded22a485 [file] [log] [blame]
//===- 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 <typename Enum>
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_