1//===- Flags.h ------------------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#ifndef MCLD_FLAGS_H 10#define MCLD_FLAGS_H 11#ifdef ENABLE_UNITTEST 12#include <gtest.h> 13#endif 14 15namespace mcld 16{ 17 18template<typename Enum> 19class Flags 20{ 21public: 22 typedef Enum enum_type; 23 24public: 25 Flags(const Flags& pOther) 26 : m_Data(pOther.m_Data) {} 27 28 Flags(Enum pFlag) 29 : m_Data(pFlag) {} 30 31 Flags(int pFlag = 0x0) 32 : m_Data(pFlag) {} 33 34 operator int () const 35 { return m_Data; } 36 37 bool operator! () const 38 { return (m_Data == 0x0); } 39 40 Flags operator& (int pMask ) const 41 { return Flags(m_Data & pMask); } 42 43 Flags operator& (unsigned int pMask ) const 44 { return Flags(m_Data & pMask); } 45 46 Flags operator& (Enum pMask ) const 47 { return Flags(m_Data & pMask); } 48 49 Flags& operator&= (int pMask ) { 50 m_Data &= pMask; 51 return *this; 52 } 53 54 Flags& operator&= (unsigned int pMask ) { 55 m_Data &= pMask; 56 return *this; 57 } 58 59 Flags& operator=(Flags pOther) { 60 m_Data = pOther.m_Data; 61 return *this; 62 } 63 64 Flags operator^ (Flags pOther) const 65 { return Flags(m_Data^pOther.m_Data); } 66 67 Flags operator^ (Enum pOther) const 68 { return Flags(m_Data^pOther); } 69 70 Flags& operator^= (Flags pOther) { 71 m_Data ^= pOther.m_Data; 72 return *this; 73 } 74 75 Flags& operator^= (Enum pOther) { 76 m_Data ^= pOther; 77 return *this; 78 } 79 80 Flags operator| (Flags pOther) const 81 { return Flags(m_Data | pOther.m_Data); } 82 83 Flags operator| (Enum pOther ) const 84 { return Flags(m_Data | pOther); } 85 86 Flags& operator|= (Flags pOther) { 87 m_Data |= pOther.m_Data; 88 return *this; 89 } 90 91 Flags& operator|= (Enum pOther) { 92 m_Data |= pOther; 93 return *this; 94 } 95 96 Flags operator~ () const 97 { return Flags(~m_Data); } 98 99private: 100 int m_Data; 101}; 102 103} // namespace of mcld 104 105#endif 106 107