1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- Flags.h ------------------------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_ADT_FLAGS_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_ADT_FLAGS_H_
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <typename Enum>
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Flags {
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef Enum enum_type;
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags(const Flags& pOther) : m_Data(pOther.m_Data) {}
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit Flags(Enum pFlag) : m_Data(pFlag) {}
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit Flags(unsigned int pFlag = 0x0) : m_Data(pFlag) {}
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  operator unsigned int() const { return m_Data; }
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  bool operator!() const { return (m_Data == 0x0); }
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags operator&(int pMask) const { return Flags(m_Data & pMask); }
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags operator&(unsigned int pMask) const { return Flags(m_Data & pMask); }
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags operator&(Enum pMask) const { return Flags(m_Data & pMask); }
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags& operator&=(unsigned int pMask) {
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Data &= pMask;
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return *this;
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  Flags& operator=(Flags pOther) {
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Data = pOther.m_Data;
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return *this;
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags operator^(Flags pOther) const { return Flags(m_Data ^ pOther.m_Data); }
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags operator^(Enum pOther) const { return Flags(m_Data ^ pOther); }
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags& operator^=(Flags pOther) {
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Data ^= pOther.m_Data;
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return *this;
53551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags& operator^=(Enum pOther) {
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Data ^= pOther;
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return *this;
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags operator|(Flags pOther) const { return Flags(m_Data | pOther.m_Data); }
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags operator|(Enum pOther) const { return Flags(m_Data | pOther); }
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags& operator|=(Flags pOther) {
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Data |= pOther.m_Data;
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return *this;
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags& operator|=(Enum pOther) {
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Data |= pOther;
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    return *this;
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  }
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Flags operator~() const { return Flags(~m_Data); }
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  unsigned int m_Data;
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_ADT_FLAGS_H_
83