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
15namespace 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.
22class Flags {
23public:
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
113protected:
114 ValueType m_flags; ///< The flags.
115};
116
117} // namespace lldb_private
118
119#endif // LLDB_UTILITY_FLAGS_H
120