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