1296417Sdim//===-- OptionValue.h -------------------------------------------*- C++ -*-===//
2254721Semaste//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6254721Semaste//
7254721Semaste//===----------------------------------------------------------------------===//
8254721Semaste
9254721Semaste#ifndef liblldb_OptionValue_h_
10254721Semaste#define liblldb_OptionValue_h_
11254721Semaste
12288943Sdim#include "lldb/Core/FormatEntity.h"
13341825Sdim#include "lldb/Utility/CompletionRequest.h"
14321369Sdim#include "lldb/Utility/ConstString.h"
15321369Sdim#include "lldb/Utility/Status.h"
16314564Sdim#include "lldb/lldb-defines.h"
17321369Sdim#include "lldb/lldb-private-enumerations.h"
18321369Sdim#include "lldb/lldb-private-interfaces.h"
19254721Semaste
20254721Semastenamespace lldb_private {
21254721Semaste
22314564Sdim// OptionValue
23314564Sdimclass OptionValue {
24314564Sdimpublic:
25353358Sdim  enum Type {
26314564Sdim    eTypeInvalid = 0,
27314564Sdim    eTypeArch,
28314564Sdim    eTypeArgs,
29314564Sdim    eTypeArray,
30314564Sdim    eTypeBoolean,
31314564Sdim    eTypeChar,
32314564Sdim    eTypeDictionary,
33314564Sdim    eTypeEnum,
34314564Sdim    eTypeFileSpec,
35314564Sdim    eTypeFileSpecList,
36314564Sdim    eTypeFormat,
37314564Sdim    eTypeLanguage,
38314564Sdim    eTypePathMap,
39314564Sdim    eTypeProperties,
40314564Sdim    eTypeRegex,
41314564Sdim    eTypeSInt64,
42314564Sdim    eTypeString,
43314564Sdim    eTypeUInt64,
44314564Sdim    eTypeUUID,
45314564Sdim    eTypeFormatEntity
46353358Sdim  };
47280031Sdim
48314564Sdim  enum {
49314564Sdim    eDumpOptionName = (1u << 0),
50314564Sdim    eDumpOptionType = (1u << 1),
51314564Sdim    eDumpOptionValue = (1u << 2),
52314564Sdim    eDumpOptionDescription = (1u << 3),
53314564Sdim    eDumpOptionRaw = (1u << 4),
54344779Sdim    eDumpOptionCommand = (1u << 5),
55314564Sdim    eDumpGroupValue = (eDumpOptionName | eDumpOptionType | eDumpOptionValue),
56314564Sdim    eDumpGroupHelp =
57344779Sdim        (eDumpOptionName | eDumpOptionType | eDumpOptionDescription),
58344779Sdim    eDumpGroupExport = (eDumpOptionCommand | eDumpOptionName | eDumpOptionValue)
59314564Sdim  };
60254721Semaste
61360784Sdim  OptionValue() : m_value_was_set(false) {}
62254721Semaste
63314564Sdim  virtual ~OptionValue() = default;
64254721Semaste
65314564Sdim  // Subclasses should override these functions
66314564Sdim  virtual Type GetType() const = 0;
67254721Semaste
68341825Sdim  // If this value is always hidden, the avoid showing any info on this value,
69341825Sdim  // just show the info for the child values.
70314564Sdim  virtual bool ValueIsTransparent() const {
71314564Sdim    return GetType() == eTypeProperties;
72314564Sdim  }
73254721Semaste
74314564Sdim  virtual const char *GetTypeAsCString() const {
75314564Sdim    return GetBuiltinTypeAsCString(GetType());
76314564Sdim  }
77254721Semaste
78314564Sdim  static const char *GetBuiltinTypeAsCString(Type t);
79254721Semaste
80314564Sdim  virtual void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
81314564Sdim                         uint32_t dump_mask) = 0;
82254721Semaste
83321369Sdim  virtual Status
84314564Sdim  SetValueFromString(llvm::StringRef value,
85314564Sdim                     VarSetOperationType op = eVarSetOperationAssign);
86254721Semaste
87314564Sdim  virtual bool Clear() = 0;
88296417Sdim
89314564Sdim  virtual lldb::OptionValueSP DeepCopy() const = 0;
90254721Semaste
91360784Sdim  virtual void AutoComplete(CommandInterpreter &interpreter,
92360784Sdim                            CompletionRequest &request);
93254721Semaste
94314564Sdim  // Subclasses can override these functions
95314564Sdim  virtual lldb::OptionValueSP GetSubValue(const ExecutionContext *exe_ctx,
96321369Sdim                                          llvm::StringRef name,
97321369Sdim                                          bool will_modify,
98321369Sdim                                          Status &error) const {
99314564Sdim    error.SetErrorStringWithFormat("'%s' is not a value subvalue", name.str().c_str());
100314564Sdim    return lldb::OptionValueSP();
101314564Sdim  }
102254721Semaste
103321369Sdim  virtual Status SetSubValue(const ExecutionContext *exe_ctx,
104321369Sdim                             VarSetOperationType op, llvm::StringRef name,
105321369Sdim                             llvm::StringRef value);
106254721Semaste
107314564Sdim  virtual bool IsAggregateValue() const { return false; }
108280031Sdim
109314564Sdim  virtual ConstString GetName() const { return ConstString(); }
110280031Sdim
111314564Sdim  virtual bool DumpQualifiedName(Stream &strm) const;
112280031Sdim
113341825Sdim  // Subclasses should NOT override these functions as they use the above
114341825Sdim  // functions to implement functionality
115314564Sdim  uint32_t GetTypeAsMask() { return 1u << GetType(); }
116280031Sdim
117314564Sdim  static uint32_t ConvertTypeToMask(OptionValue::Type type) {
118314564Sdim    return 1u << type;
119314564Sdim  }
120288943Sdim
121314564Sdim  static OptionValue::Type ConvertTypeMaskToType(uint32_t type_mask) {
122314564Sdim    // If only one bit is set, then return an appropriate enumeration
123314564Sdim    switch (type_mask) {
124314564Sdim    case 1u << eTypeArch:
125314564Sdim      return eTypeArch;
126314564Sdim    case 1u << eTypeArgs:
127314564Sdim      return eTypeArgs;
128314564Sdim    case 1u << eTypeArray:
129314564Sdim      return eTypeArray;
130314564Sdim    case 1u << eTypeBoolean:
131314564Sdim      return eTypeBoolean;
132314564Sdim    case 1u << eTypeChar:
133314564Sdim      return eTypeChar;
134314564Sdim    case 1u << eTypeDictionary:
135314564Sdim      return eTypeDictionary;
136314564Sdim    case 1u << eTypeEnum:
137314564Sdim      return eTypeEnum;
138314564Sdim    case 1u << eTypeFileSpec:
139314564Sdim      return eTypeFileSpec;
140314564Sdim    case 1u << eTypeFileSpecList:
141314564Sdim      return eTypeFileSpecList;
142314564Sdim    case 1u << eTypeFormat:
143314564Sdim      return eTypeFormat;
144314564Sdim    case 1u << eTypeLanguage:
145314564Sdim      return eTypeLanguage;
146314564Sdim    case 1u << eTypePathMap:
147314564Sdim      return eTypePathMap;
148314564Sdim    case 1u << eTypeProperties:
149314564Sdim      return eTypeProperties;
150314564Sdim    case 1u << eTypeRegex:
151314564Sdim      return eTypeRegex;
152314564Sdim    case 1u << eTypeSInt64:
153314564Sdim      return eTypeSInt64;
154314564Sdim    case 1u << eTypeString:
155314564Sdim      return eTypeString;
156314564Sdim    case 1u << eTypeUInt64:
157314564Sdim      return eTypeUInt64;
158314564Sdim    case 1u << eTypeUUID:
159314564Sdim      return eTypeUUID;
160314564Sdim    }
161314564Sdim    // Else return invalid
162314564Sdim    return eTypeInvalid;
163314564Sdim  }
164288943Sdim
165314564Sdim  static lldb::OptionValueSP
166314564Sdim  CreateValueFromCStringForTypeMask(const char *value_cstr, uint32_t type_mask,
167321369Sdim                                    Status &error);
168288943Sdim
169341825Sdim  // Get this value as a uint64_t value if it is encoded as a boolean, uint64_t
170341825Sdim  // or int64_t. Other types will cause "fail_value" to be returned
171314564Sdim  uint64_t GetUInt64Value(uint64_t fail_value, bool *success_ptr);
172280031Sdim
173314564Sdim  OptionValueArch *GetAsArch();
174280031Sdim
175314564Sdim  const OptionValueArch *GetAsArch() const;
176280031Sdim
177314564Sdim  OptionValueArray *GetAsArray();
178254721Semaste
179314564Sdim  const OptionValueArray *GetAsArray() const;
180254721Semaste
181314564Sdim  OptionValueArgs *GetAsArgs();
182254721Semaste
183314564Sdim  const OptionValueArgs *GetAsArgs() const;
184254721Semaste
185314564Sdim  OptionValueBoolean *GetAsBoolean();
186254721Semaste
187314564Sdim  OptionValueChar *GetAsChar();
188288943Sdim
189314564Sdim  const OptionValueBoolean *GetAsBoolean() const;
190254721Semaste
191314564Sdim  const OptionValueChar *GetAsChar() const;
192254721Semaste
193314564Sdim  OptionValueDictionary *GetAsDictionary();
194254721Semaste
195314564Sdim  const OptionValueDictionary *GetAsDictionary() const;
196254721Semaste
197314564Sdim  OptionValueEnumeration *GetAsEnumeration();
198254721Semaste
199314564Sdim  const OptionValueEnumeration *GetAsEnumeration() const;
200254721Semaste
201314564Sdim  OptionValueFileSpec *GetAsFileSpec();
202254721Semaste
203314564Sdim  const OptionValueFileSpec *GetAsFileSpec() const;
204280031Sdim
205314564Sdim  OptionValueFileSpecList *GetAsFileSpecList();
206280031Sdim
207314564Sdim  const OptionValueFileSpecList *GetAsFileSpecList() const;
208296417Sdim
209314564Sdim  OptionValueFormat *GetAsFormat();
210254721Semaste
211314564Sdim  const OptionValueFormat *GetAsFormat() const;
212314564Sdim
213314564Sdim  OptionValueLanguage *GetAsLanguage();
214314564Sdim
215314564Sdim  const OptionValueLanguage *GetAsLanguage() const;
216314564Sdim
217314564Sdim  OptionValuePathMappings *GetAsPathMappings();
218314564Sdim
219314564Sdim  const OptionValuePathMappings *GetAsPathMappings() const;
220314564Sdim
221314564Sdim  OptionValueProperties *GetAsProperties();
222314564Sdim
223314564Sdim  const OptionValueProperties *GetAsProperties() const;
224314564Sdim
225314564Sdim  OptionValueRegex *GetAsRegex();
226314564Sdim
227314564Sdim  const OptionValueRegex *GetAsRegex() const;
228314564Sdim
229314564Sdim  OptionValueSInt64 *GetAsSInt64();
230314564Sdim
231314564Sdim  const OptionValueSInt64 *GetAsSInt64() const;
232314564Sdim
233314564Sdim  OptionValueString *GetAsString();
234314564Sdim
235314564Sdim  const OptionValueString *GetAsString() const;
236314564Sdim
237314564Sdim  OptionValueUInt64 *GetAsUInt64();
238314564Sdim
239314564Sdim  const OptionValueUInt64 *GetAsUInt64() const;
240314564Sdim
241314564Sdim  OptionValueUUID *GetAsUUID();
242314564Sdim
243314564Sdim  const OptionValueUUID *GetAsUUID() const;
244314564Sdim
245314564Sdim  OptionValueFormatEntity *GetAsFormatEntity();
246314564Sdim
247314564Sdim  const OptionValueFormatEntity *GetAsFormatEntity() const;
248314564Sdim
249314564Sdim  bool GetBooleanValue(bool fail_value = false) const;
250314564Sdim
251314564Sdim  bool SetBooleanValue(bool new_value);
252314564Sdim
253314564Sdim  char GetCharValue(char fail_value) const;
254314564Sdim
255314564Sdim  char SetCharValue(char new_value);
256314564Sdim
257314564Sdim  int64_t GetEnumerationValue(int64_t fail_value = -1) const;
258314564Sdim
259314564Sdim  bool SetEnumerationValue(int64_t value);
260314564Sdim
261314564Sdim  FileSpec GetFileSpecValue() const;
262314564Sdim
263314564Sdim  bool SetFileSpecValue(const FileSpec &file_spec);
264314564Sdim
265314564Sdim  FileSpecList GetFileSpecListValue() const;
266314564Sdim
267314564Sdim  lldb::Format
268314564Sdim  GetFormatValue(lldb::Format fail_value = lldb::eFormatDefault) const;
269314564Sdim
270314564Sdim  bool SetFormatValue(lldb::Format new_value);
271314564Sdim
272314564Sdim  lldb::LanguageType GetLanguageValue(
273314564Sdim      lldb::LanguageType fail_value = lldb::eLanguageTypeUnknown) const;
274314564Sdim
275314564Sdim  bool SetLanguageValue(lldb::LanguageType new_language);
276314564Sdim
277314564Sdim  const FormatEntity::Entry *GetFormatEntity() const;
278314564Sdim
279314564Sdim  const RegularExpression *GetRegexValue() const;
280314564Sdim
281314564Sdim  int64_t GetSInt64Value(int64_t fail_value = 0) const;
282314564Sdim
283314564Sdim  bool SetSInt64Value(int64_t new_value);
284314564Sdim
285314564Sdim  llvm::StringRef GetStringValue(llvm::StringRef fail_value) const;
286314564Sdim  llvm::StringRef GetStringValue() const { return GetStringValue(llvm::StringRef()); }
287314564Sdim
288314564Sdim  bool SetStringValue(llvm::StringRef new_value);
289314564Sdim
290314564Sdim  uint64_t GetUInt64Value(uint64_t fail_value = 0) const;
291314564Sdim
292314564Sdim  bool SetUInt64Value(uint64_t new_value);
293314564Sdim
294314564Sdim  UUID GetUUIDValue() const;
295314564Sdim
296314564Sdim  bool SetUUIDValue(const UUID &uuid);
297314564Sdim
298314564Sdim  bool OptionWasSet() const { return m_value_was_set; }
299314564Sdim
300314564Sdim  void SetOptionWasSet() { m_value_was_set = true; }
301314564Sdim
302314564Sdim  void SetParent(const lldb::OptionValueSP &parent_sp) {
303314564Sdim    m_parent_wp = parent_sp;
304314564Sdim  }
305314564Sdim
306360784Sdim  void SetValueChangedCallback(std::function<void()> callback) {
307360784Sdim    assert(!m_callback);
308360784Sdim    m_callback = std::move(callback);
309314564Sdim  }
310314564Sdim
311314564Sdim  void NotifyValueChanged() {
312314564Sdim    if (m_callback)
313360784Sdim      m_callback();
314314564Sdim  }
315314564Sdim
316314564Sdimprotected:
317314564Sdim  lldb::OptionValueWP m_parent_wp;
318360784Sdim  std::function<void()> m_callback;
319314564Sdim  bool m_value_was_set; // This can be used to see if a value has been set
320314564Sdim                        // by a call to SetValueFromCString(). It is often
321341825Sdim                        // handy to know if an option value was set from the
322341825Sdim                        // command line or as a setting, versus if we just have
323341825Sdim                        // the default value that was already populated in the
324341825Sdim                        // option value.
325314564Sdim};
326314564Sdim
327254721Semaste} // namespace lldb_private
328254721Semaste
329296417Sdim#endif // liblldb_OptionValue_h_
330