LLDB mainline
OptionValueProperties.h
Go to the documentation of this file.
1//===-- OptionValueProperties.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_INTERPRETER_OPTIONVALUEPROPERTIES_H
10#define LLDB_INTERPRETER_OPTIONVALUEPROPERTIES_H
11
12#include <vector>
13
18
19namespace lldb_private {
20class Properties;
21
23 : public Cloneable<OptionValueProperties, OptionValue>,
24 public std::enable_shared_from_this<OptionValueProperties> {
25public:
27
28 OptionValueProperties(llvm::StringRef name);
29
30 ~OptionValueProperties() override = default;
31
32 Type GetType() const override { return eTypeProperties; }
33
35 CreateLocalCopy(const Properties &global_properties);
36
38 DeepCopy(const lldb::OptionValueSP &new_parent) const override;
39
40 Status
41 SetValueFromString(llvm::StringRef value,
43
44 void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
45 uint32_t dump_mask) override;
46
47 bool IsDefault() const override;
48
49 llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override;
50
51 llvm::StringRef GetName() const override { return m_name; }
52
53 virtual Status DumpPropertyValue(const ExecutionContext *exe_ctx,
54 Stream &strm, llvm::StringRef property_path,
55 uint32_t dump_mask, bool is_json = false);
56
57 virtual void DumpAllDescriptions(CommandInterpreter &interpreter,
58 Stream &strm) const;
59
60 void Apropos(llvm::StringRef keyword,
61 std::vector<const Property *> &matching_properties,
62 std::vector<const Property *> &matching_property_paths) const;
63
64 void Initialize(const PropertyCollectionDefinition &setting_definitions);
65
66 void SetExpectedPath(std::string path);
67
68 // Subclass specific functions
69
70 // Get the index of a property given its exact name in this property
71 // collection, "name" can't be a path to a property path that refers to a
72 // property within a property
73 virtual size_t GetPropertyIndex(llvm::StringRef name) const;
74
75 // Get a property by exact name exists in this property collection, name can
76 // not be a path to a property path that refers to a property within a
77 // property
78 virtual const Property *
79 GetProperty(llvm::StringRef name,
80 const ExecutionContext *exe_ctx = nullptr) const;
81
82 virtual const Property *
84 const ExecutionContext *exe_ctx = nullptr) const {
86 }
87
88 // Property can be a property path like
89 // "target.process.extra-startup-command"
90 virtual const Property *
92 llvm::StringRef property_path) const;
93
95 GetPropertyValueAtIndex(size_t idx, const ExecutionContext *exe_ctx) const;
96
98 llvm::StringRef key) const;
99
101 llvm::StringRef name,
102 Status &error) const override;
103
105 llvm::StringRef path, llvm::StringRef value) override;
106
107 bool
108 GetPropertyAtIndexAsArgs(size_t idx, Args &args,
109 const ExecutionContext *exe_ctx = nullptr) const;
110
111 bool SetPropertyAtIndexFromArgs(size_t idx, const Args &args,
112 const ExecutionContext *exe_ctx = nullptr);
113
115 size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
116
118 size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
119
121 size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
122
124 size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
125
127 size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
128
130 size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
131
133 size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
134
135 void AppendProperty(llvm::StringRef name, llvm::StringRef desc,
136 bool is_global, const lldb::OptionValueSP &value_sp);
137
139 llvm::StringRef name);
140
141 void SetValueChangedCallback(size_t property_idx,
142 std::function<void()> callback);
143
144 template <typename T>
145 auto GetPropertyAtIndexAs(size_t idx,
146 const ExecutionContext *exe_ctx = nullptr) const {
147 if (const Property *property = GetPropertyAtIndex(idx, exe_ctx)) {
148 if (OptionValue *value = property->GetValue().get())
149 return value->GetValueAs<T>();
150 }
151 if constexpr (std::is_pointer_v<T>)
152 return T{nullptr};
153 else
154 return std::optional<T>{std::nullopt};
155 }
156
157 template <typename T>
158 bool SetPropertyAtIndex(size_t idx, T t,
159 const ExecutionContext *exe_ctx = nullptr) const {
160 if (const Property *property = GetPropertyAtIndex(idx, exe_ctx)) {
161 if (OptionValue *value = property->GetValue().get()) {
162 value->SetValueAs(t);
163 return true;
164 }
165 }
166 return false;
167 }
168
169protected:
171 assert(idx < m_properties.size() && "invalid property index");
172 return ((idx < m_properties.size()) ? &m_properties[idx] : nullptr);
173 }
174
175 const Property *ProtectedGetPropertyAtIndex(size_t idx) const {
176 assert(idx < m_properties.size() && "invalid property index");
177 return ((idx < m_properties.size()) ? &m_properties[idx] : nullptr);
178 }
179
180 bool VerifyPath();
181
182 void ClearImpl() override;
183
184 std::string m_name;
185 std::vector<Property> m_properties;
186 llvm::StringMap<size_t> m_name_to_index;
187 std::string m_expected_path;
188};
189
190} // namespace lldb_private
191
192#endif // LLDB_INTERPRETER_OPTIONVALUEPROPERTIES_H
static llvm::raw_ostream & error(Stream &strm)
A command line argument class.
Definition Args.h:33
A class that implements CRTP-based "virtual constructor" idiom.
Definition Cloneable.h:40
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
void AppendProperty(llvm::StringRef name, llvm::StringRef desc, bool is_global, const lldb::OptionValueSP &value_sp)
void Apropos(llvm::StringRef keyword, std::vector< const Property * > &matching_properties, std::vector< const Property * > &matching_property_paths) const
Status SetSubValue(const ExecutionContext *exe_ctx, VarSetOperationType op, llvm::StringRef path, llvm::StringRef value) override
OptionValueFileSpec * GetPropertyAtIndexAsOptionValueFileSpec(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
auto GetPropertyAtIndexAs(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
void Initialize(const PropertyCollectionDefinition &setting_definitions)
bool IsDefault() const override
Return true if the current value equals the default value.
lldb::OptionValueSP DeepCopy(const lldb::OptionValueSP &new_parent) const override
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) override
virtual void DumpAllDescriptions(CommandInterpreter &interpreter, Stream &strm) const
OptionValueFileSpecList * GetPropertyAtIndexAsOptionValueFileSpecList(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
Property * ProtectedGetPropertyAtIndex(size_t idx)
OptionValueString * GetPropertyAtIndexAsOptionValueString(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
bool SetPropertyAtIndex(size_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
virtual Status DumpPropertyValue(const ExecutionContext *exe_ctx, Stream &strm, llvm::StringRef property_path, uint32_t dump_mask, bool is_json=false)
OptionValueDictionary * GetPropertyAtIndexAsOptionValueDictionary(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
llvm::StringRef GetName() const override
static lldb::OptionValuePropertiesSP CreateLocalCopy(const Properties &global_properties)
lldb::OptionValueSP GetSubValue(const ExecutionContext *exe_ctx, llvm::StringRef name, Status &error) const override
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) const override
void SetValueChangedCallback(size_t property_idx, std::function< void()> callback)
const Property * ProtectedGetPropertyAtIndex(size_t idx) const
bool SetPropertyAtIndexFromArgs(size_t idx, const Args &args, const ExecutionContext *exe_ctx=nullptr)
Status SetValueFromString(llvm::StringRef value, VarSetOperationType op=eVarSetOperationAssign) override
virtual const Property * GetPropertyAtPath(const ExecutionContext *exe_ctx, llvm::StringRef property_path) const
virtual const Property * GetPropertyAtIndex(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
virtual lldb::OptionValueSP GetValueForKey(const ExecutionContext *exe_ctx, llvm::StringRef key) const
lldb::OptionValuePropertiesSP GetSubProperty(const ExecutionContext *exe_ctx, llvm::StringRef name)
virtual lldb::OptionValueSP GetPropertyValueAtIndex(size_t idx, const ExecutionContext *exe_ctx) const
OptionValueUInt64 * GetPropertyAtIndexAsOptionValueUInt64(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
OptionValuePathMappings * GetPropertyAtIndexAsOptionValuePathMappings(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
OptionValueSInt64 * GetPropertyAtIndexAsOptionValueSInt64(size_t idx, const ExecutionContext *exe_ctx=nullptr) const
virtual const Property * GetProperty(llvm::StringRef name, const ExecutionContext *exe_ctx=nullptr) const
bool GetPropertyAtIndexAsArgs(size_t idx, Args &args, const ExecutionContext *exe_ctx=nullptr) const
virtual size_t GetPropertyIndex(llvm::StringRef name) const
~OptionValueProperties() override=default
An error handling class.
Definition Status.h:118
A stream class that can stream formatted output to a file.
Definition Stream.h:28
A class that represents a running process on the host machine.
VarSetOperationType
Settable state variable types.
std::shared_ptr< lldb_private::OptionValueProperties > OptionValuePropertiesSP
std::shared_ptr< lldb_private::OptionValue > OptionValueSP