1 //===-- BreakpointName.h --------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_Breakpoint_Name_h_
11 #define liblldb_Breakpoint_Name_h_
17 #include <unordered_set>
20 // Other libraries and framework includes
22 #include "lldb/Breakpoint/BreakpointID.h"
23 #include "lldb/Breakpoint/BreakpointLocationCollection.h"
24 #include "lldb/Breakpoint/BreakpointLocationList.h"
25 #include "lldb/Breakpoint/BreakpointOptions.h"
26 #include "lldb/Breakpoint/Stoppoint.h"
27 #include "lldb/Core/Event.h"
28 #include "lldb/Core/SearchFilter.h"
29 #include "lldb/Utility/Flags.h"
30 #include "lldb/Utility/StringList.h"
31 #include "lldb/Utility/StructuredData.h"
33 namespace lldb_private {
35 class BreakpointName {
41 enum PermissionKinds { listPerm = 0, disablePerm = 1,
42 deletePerm = 2, allPerms = 3 };
44 Permissions(bool in_list, bool in_disable, bool in_delete)
46 m_permissions[listPerm] = in_list;
47 m_permissions[disablePerm] = in_disable;
48 m_permissions[deletePerm] = in_delete;
49 m_set_mask.Set(permissions_mask[allPerms]);
52 Permissions(const Permissions &rhs)
54 m_permissions[listPerm] = rhs.m_permissions[listPerm];
55 m_permissions[disablePerm] = rhs.m_permissions[disablePerm];
56 m_permissions[deletePerm] = rhs.m_permissions[deletePerm];
57 m_set_mask = rhs.m_set_mask;
62 m_permissions[listPerm] = true;
63 m_permissions[disablePerm] = true;
64 m_permissions[deletePerm] = true;
68 const Permissions &operator= (const Permissions &rhs)
71 m_permissions[listPerm] = rhs.m_permissions[listPerm];
72 m_permissions[disablePerm] = rhs.m_permissions[disablePerm];
73 m_permissions[deletePerm] = rhs.m_permissions[deletePerm];
74 m_set_mask = rhs.m_set_mask;
80 *this = Permissions();
83 // Merge the permissions from incoming into this set of permissions.
84 // Only merge set permissions, and most restrictive permission wins.
85 void MergeInto(const Permissions &incoming)
87 MergePermission(incoming, listPerm);
88 MergePermission(incoming, disablePerm);
89 MergePermission(incoming, deletePerm);
92 bool GetAllowList() const { return GetPermission(listPerm); }
93 bool SetAllowList(bool value) { return SetPermission(listPerm, value); }
95 bool GetAllowDelete() const { return GetPermission(deletePerm); }
96 bool SetAllowDelete(bool value) { return SetPermission(deletePerm, value); }
98 bool GetAllowDisable() const { return GetPermission(disablePerm); }
99 bool SetAllowDisable(bool value) { return SetPermission(disablePerm,
102 bool GetPermission(enum PermissionKinds permission) const
104 return m_permissions[permission];
107 bool GetDescription(Stream *s, lldb::DescriptionLevel level);
109 bool IsSet(enum PermissionKinds permission) const
111 return m_set_mask.Test(permissions_mask[permission]);
115 return m_set_mask.AnySet(permissions_mask[allPerms]);
119 static const Flags::ValueType permissions_mask[allPerms + 1];
121 bool m_permissions[allPerms];
124 bool SetPermission(enum PermissionKinds permission, bool value)
126 bool old_value = m_permissions[permission];
127 m_permissions[permission] = value;
128 m_set_mask.Set(permissions_mask[permission]);
132 // If either side disallows the permission, the resultant disallows it.
133 void MergePermission(const Permissions &incoming,
134 enum PermissionKinds permission)
136 if (incoming.IsSet(permission))
138 SetPermission(permission, !(m_permissions[permission] |
139 incoming.m_permissions[permission]));
144 BreakpointName(const ConstString &name, const char *help = nullptr) :
145 m_name(name), m_options(false)
150 BreakpointName(const ConstString &name,
151 BreakpointOptions &options,
152 const Permissions &permissions = Permissions(),
153 const char *help = nullptr) :
154 m_name(name), m_options(options),
155 m_permissions(permissions) {
159 BreakpointName(const BreakpointName &rhs) :
160 m_name(rhs.m_name), m_options(rhs.m_options),
161 m_permissions(rhs.m_permissions), m_help(rhs.m_help)
164 BreakpointName(const ConstString &name, const Breakpoint &bkpt,
167 const ConstString &GetName() const { return m_name; }
168 BreakpointOptions &GetOptions() { return m_options; }
169 const BreakpointOptions &GetOptions() const { return m_options; }
171 void SetOptions(const BreakpointOptions &options) {
175 Permissions &GetPermissions() { return m_permissions; }
176 const Permissions &GetPermissions() const { return m_permissions; }
177 void SetPermissions(const Permissions &permissions) {
178 m_permissions = permissions;
181 bool GetPermission(Permissions::PermissionKinds permission) const
183 return m_permissions.GetPermission(permission);
186 void SetHelp(const char *description)
189 m_help.assign(description);
194 const char *GetHelp()
196 return m_help.c_str();
199 // Returns true if any options were set in the name
200 bool GetDescription(Stream *s, lldb::DescriptionLevel level);
202 void ConfigureBreakpoint(lldb::BreakpointSP bp_sp);
206 BreakpointOptions m_options;
207 Permissions m_permissions;
211 } // namespace lldb_private
213 #endif // liblldb_Breakpoint_Name_h_