1254721Semaste//===-- Flags.h -------------------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#ifndef liblldb_Flags_h_ 11254721Semaste#define liblldb_Flags_h_ 12254721Semaste#if defined(__cplusplus) 13254721Semaste 14254721Semaste 15254721Semaste#include <stdint.h> 16254721Semaste#include <unistd.h> 17254721Semaste 18254721Semastenamespace lldb_private { 19254721Semaste 20254721Semaste//---------------------------------------------------------------------- 21254721Semaste/// @class Flags Flags.h "lldb/Core/Flags.h" 22254721Semaste/// @brief A class to manage flags. 23254721Semaste/// 24254721Semaste/// The Flags class managed flag bits and allows testing and 25254721Semaste/// modification of individual or multiple flag bits. 26254721Semaste//---------------------------------------------------------------------- 27254721Semasteclass Flags 28254721Semaste{ 29254721Semastepublic: 30254721Semaste //---------------------------------------------------------------------- 31254721Semaste /// The value type for flags is a 32 bit unsigned integer type. 32254721Semaste //---------------------------------------------------------------------- 33254721Semaste typedef uint32_t ValueType; 34254721Semaste 35254721Semaste //---------------------------------------------------------------------- 36254721Semaste /// Construct with initial flag bit values. 37254721Semaste /// 38254721Semaste /// Constructs this object with \a mask as the initial value for all 39254721Semaste /// of the flags. 40254721Semaste /// 41254721Semaste /// @param[in] mask 42254721Semaste /// The initial value for all flags. 43254721Semaste //---------------------------------------------------------------------- 44254721Semaste Flags (ValueType flags = 0) : 45254721Semaste m_flags (flags) 46254721Semaste { 47254721Semaste } 48254721Semaste 49254721Semaste //---------------------------------------------------------------------- 50254721Semaste /// Copy constructor. 51254721Semaste /// 52254721Semaste /// Construct and copy the flags from \a rhs. 53254721Semaste /// 54254721Semaste /// @param[in] rhs 55254721Semaste /// A const Flags object reference to copy. 56254721Semaste //---------------------------------------------------------------------- 57254721Semaste Flags (const Flags& rhs) : 58254721Semaste m_flags(rhs.m_flags) 59254721Semaste { 60254721Semaste } 61254721Semaste 62254721Semaste //---------------------------------------------------------------------- 63254721Semaste /// Destructor. 64254721Semaste //---------------------------------------------------------------------- 65254721Semaste ~Flags () 66254721Semaste { 67254721Semaste } 68254721Semaste 69254721Semaste //---------------------------------------------------------------------- 70254721Semaste /// Get accessor for all flags. 71254721Semaste /// 72254721Semaste /// @return 73254721Semaste /// Returns all of the flags as a Flags::ValueType. 74254721Semaste //---------------------------------------------------------------------- 75254721Semaste ValueType 76254721Semaste Get () const 77254721Semaste { 78254721Semaste return m_flags; 79254721Semaste } 80254721Semaste 81254721Semaste //---------------------------------------------------------------------- 82254721Semaste /// Return the number of flags that can be represented in this 83254721Semaste /// object. 84254721Semaste /// 85254721Semaste /// @return 86254721Semaste /// The maximum number bits in this flag object. 87254721Semaste //---------------------------------------------------------------------- 88254721Semaste size_t 89254721Semaste GetBitSize() const 90254721Semaste { 91254721Semaste return sizeof (ValueType) * 8; 92254721Semaste } 93254721Semaste 94254721Semaste //---------------------------------------------------------------------- 95254721Semaste /// Set accessor for all flags. 96254721Semaste /// 97254721Semaste /// @param[in] flags 98254721Semaste /// The bits with which to replace all of the current flags. 99254721Semaste //---------------------------------------------------------------------- 100254721Semaste void 101254721Semaste Reset (ValueType flags) 102254721Semaste { 103254721Semaste m_flags = flags; 104254721Semaste } 105254721Semaste 106254721Semaste //---------------------------------------------------------------------- 107254721Semaste /// Clear one or more flags. 108254721Semaste /// 109254721Semaste /// @param[in] mask 110254721Semaste /// A bitfield containing one or more flags. 111254721Semaste /// 112254721Semaste /// @return 113254721Semaste /// The new flags after clearing all bits from \a mask. 114254721Semaste //---------------------------------------------------------------------- 115254721Semaste ValueType 116254721Semaste Clear (ValueType mask = ~(ValueType)0) 117254721Semaste { 118254721Semaste m_flags &= ~mask; 119254721Semaste return m_flags; 120254721Semaste } 121254721Semaste 122254721Semaste 123254721Semaste //---------------------------------------------------------------------- 124254721Semaste /// Set one or more flags by logical OR'ing \a mask with the current 125254721Semaste /// flags. 126254721Semaste /// 127254721Semaste /// @param[in] mask 128254721Semaste /// A bitfield containing one or more flags. 129254721Semaste /// 130254721Semaste /// @return 131254721Semaste /// The new flags after setting all bits from \a mask. 132254721Semaste //---------------------------------------------------------------------- 133254721Semaste ValueType 134254721Semaste Set (ValueType mask) 135254721Semaste { 136254721Semaste m_flags |= mask; 137254721Semaste return m_flags; 138254721Semaste } 139254721Semaste 140254721Semaste 141254721Semaste //---------------------------------------------------------------------- 142254721Semaste /// Test if all bits in \a mask are 1 in the current flags 143254721Semaste /// 144254721Semaste /// @return 145254721Semaste /// \b true if all flags in \a mask are 1, \b false 146254721Semaste /// otherwise. 147254721Semaste //---------------------------------------------------------------------- 148254721Semaste bool 149254721Semaste AllSet (ValueType mask) const 150254721Semaste { 151254721Semaste return (m_flags & mask) == mask; 152254721Semaste } 153254721Semaste 154254721Semaste //---------------------------------------------------------------------- 155254721Semaste /// Test one or more flags. 156254721Semaste /// 157254721Semaste /// @return 158254721Semaste /// \b true if any flags in \a mask are 1, \b false 159254721Semaste /// otherwise. 160254721Semaste //---------------------------------------------------------------------- 161254721Semaste bool 162254721Semaste AnySet (ValueType mask) const 163254721Semaste { 164254721Semaste return (m_flags & mask) != 0; 165254721Semaste } 166254721Semaste 167254721Semaste //---------------------------------------------------------------------- 168254721Semaste /// Test a single flag bit. 169254721Semaste /// 170254721Semaste /// @return 171254721Semaste /// \b true if \a bit is set, \b false otherwise. 172254721Semaste //---------------------------------------------------------------------- 173254721Semaste bool 174254721Semaste Test (ValueType bit) const 175254721Semaste { 176254721Semaste return (m_flags & bit) != 0; 177254721Semaste } 178254721Semaste 179254721Semaste //---------------------------------------------------------------------- 180254721Semaste /// Test if all bits in \a mask are clear. 181254721Semaste /// 182254721Semaste /// @return 183254721Semaste /// \b true if \b all flags in \a mask are clear, \b false 184254721Semaste /// otherwise. 185254721Semaste //---------------------------------------------------------------------- 186254721Semaste bool 187254721Semaste AllClear (ValueType mask) const 188254721Semaste { 189254721Semaste return (m_flags & mask) == 0; 190254721Semaste } 191254721Semaste 192254721Semaste bool 193254721Semaste AnyClear (ValueType mask) const 194254721Semaste { 195254721Semaste return (m_flags & mask) != mask; 196254721Semaste } 197254721Semaste 198254721Semaste //---------------------------------------------------------------------- 199254721Semaste /// Test a single flag bit to see if it is clear (zero). 200254721Semaste /// 201254721Semaste /// @return 202254721Semaste /// \b true if \a bit is 0, \b false otherwise. 203254721Semaste //---------------------------------------------------------------------- 204254721Semaste bool 205254721Semaste IsClear (ValueType bit) const 206254721Semaste { 207254721Semaste return (m_flags & bit) == 0; 208254721Semaste } 209254721Semaste 210254721Semaste //---------------------------------------------------------------------- 211254721Semaste /// Get the number of zero bits in \a m_flags. 212254721Semaste /// 213254721Semaste /// @return 214254721Semaste /// The number of bits that are set to 0 in the current flags. 215254721Semaste //---------------------------------------------------------------------- 216254721Semaste size_t 217254721Semaste ClearCount () const 218254721Semaste { 219254721Semaste size_t count = 0; 220254721Semaste for (ValueType shift = 0; shift < sizeof(ValueType)*8; ++shift) 221254721Semaste { 222254721Semaste if ((m_flags & (1u << shift)) == 0) 223254721Semaste ++count; 224254721Semaste } 225254721Semaste return count; 226254721Semaste } 227254721Semaste 228254721Semaste //---------------------------------------------------------------------- 229254721Semaste /// Get the number of one bits in \a m_flags. 230254721Semaste /// 231254721Semaste /// @return 232254721Semaste /// The number of bits that are set to 1 in the current flags. 233254721Semaste //---------------------------------------------------------------------- 234254721Semaste size_t 235254721Semaste SetCount () const 236254721Semaste { 237254721Semaste size_t count = 0; 238254721Semaste for (ValueType mask = m_flags; mask; mask >>= 1) 239254721Semaste { 240254721Semaste if (mask & 1u) 241254721Semaste ++count; 242254721Semaste } 243254721Semaste return count; 244254721Semaste } 245254721Semaste 246254721Semasteprotected: 247254721Semaste ValueType m_flags; ///< The flags. 248254721Semaste}; 249254721Semaste 250254721Semaste} // namespace lldb_private 251254721Semaste 252254721Semaste#endif // #if defined(__cplusplus) 253254721Semaste#endif // liblldb_Flags_h_ 254