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