//===- Flags.h ------------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_FLAGS_H
#define MCLD_FLAGS_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif

namespace mcld
{

template<typename Enum>
class Flags
{
public:
  typedef Enum enum_type;

public:
  Flags(const Flags& pOther)
  : m_Data(pOther.m_Data) {}

  Flags(Enum pFlag)
  : m_Data(pFlag) {}

  Flags(int pFlag = 0x0)
  : m_Data(pFlag) {}

  operator 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&= (int pMask ) {
    m_Data &= pMask;
    return *this;
  }

  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:
  int m_Data;
};

} // namespace of mcld

#endif

