1 //===-- Flags.h -------------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_UTILITY_FLAGS_H
10 #define LLDB_UTILITY_FLAGS_H
11 
12 #include <cstddef>
13 #include <cstdint>
14 
15 namespace lldb_private {
16 
17 /// \class Flags Flags.h "lldb/Utility/Flags.h"
18 /// A class to manage flags.
19 ///
20 /// The Flags class managed flag bits and allows testing and modification of
21 /// individual or multiple flag bits.
22 class Flags {
23 public:
24   /// The value type for flags is a 32 bit unsigned integer type.
25   typedef uint32_t ValueType;
26 
27   /// Construct with initial flag bit values.
28   ///
29   /// Constructs this object with \a mask as the initial value for all of the
30   /// flags.
31   ///
32   /// \param[in] flags
33   ///     The initial value for all flags.
34   Flags(ValueType flags = 0) : m_flags(flags) {}
35 
36   /// Get accessor for all flags.
37   ///
38   /// \return
39   ///     Returns all of the flags as a Flags::ValueType.
40   ValueType Get() const { return m_flags; }
41 
42   /// Return the number of flags that can be represented in this object.
43   ///
44   /// \return
45   ///     The maximum number bits in this flag object.
46   size_t GetBitSize() const { return sizeof(ValueType) * 8; }
47 
48   /// Set accessor for all flags.
49   ///
50   /// \param[in] flags
51   ///     The bits with which to replace all of the current flags.
52   void Reset(ValueType flags) { m_flags = flags; }
53 
54   /// Clear one or more flags.
55   ///
56   /// \param[in] mask
57   ///     A bitfield containing one or more flags.
58   ///
59   /// \return
60   ///     The new flags after clearing all bits from \a mask.
61   ValueType Clear(ValueType mask = ~static_cast<ValueType>(0)) {
62     m_flags &= ~mask;
63     return m_flags;
64   }
65 
66   /// Set one or more flags by logical OR'ing \a mask with the current flags.
67   ///
68   /// \param[in] mask
69   ///     A bitfield containing one or more flags.
70   ///
71   /// \return
72   ///     The new flags after setting all bits from \a mask.
73   ValueType Set(ValueType mask) {
74     m_flags |= mask;
75     return m_flags;
76   }
77 
78   /// Test if all bits in \a mask are 1 in the current flags
79   ///
80   /// \return
81   ///     \b true if all flags in \a mask are 1, \b false
82   ///     otherwise.
83   bool AllSet(ValueType mask) const { return (m_flags & mask) == mask; }
84 
85   /// Test one or more flags.
86   ///
87   /// \return
88   ///     \b true if any flags in \a mask are 1, \b false
89   ///     otherwise.
90   bool AnySet(ValueType mask) const { return (m_flags & mask) != 0; }
91 
92   /// Test a single flag bit.
93   ///
94   /// \return
95   ///     \b true if \a bit is set, \b false otherwise.
96   bool Test(ValueType bit) const { return (m_flags & bit) != 0; }
97 
98   /// Test if all bits in \a mask are clear.
99   ///
100   /// \return
101   ///     \b true if \b all flags in \a mask are clear, \b false
102   ///     otherwise.
103   bool AllClear(ValueType mask) const { return (m_flags & mask) == 0; }
104 
105   bool AnyClear(ValueType mask) const { return (m_flags & mask) != mask; }
106 
107   /// Test a single flag bit to see if it is clear (zero).
108   ///
109   /// \return
110   ///     \b true if \a bit is 0, \b false otherwise.
111   bool IsClear(ValueType bit) const { return (m_flags & bit) == 0; }
112 
113 protected:
114   ValueType m_flags; ///< The flags.
115 };
116 
117 } // namespace lldb_private
118 
119 #endif // LLDB_UTILITY_FLAGS_H
120