//===-- OptionValue.h --------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_OptionValue_h_ #define liblldb_OptionValue_h_ // C Includes // C++ Includes // Other libraries and framework includes // Project includes #include "lldb/lldb-defines.h" #include "lldb/Core/ConstString.h" #include "lldb/Core/Error.h" namespace lldb_private { //--------------------------------------------------------------------- // OptionValue //--------------------------------------------------------------------- class OptionValue { public: typedef enum { eTypeInvalid = 0, eTypeArch, eTypeArgs, eTypeArray, eTypeBoolean, eTypeDictionary, eTypeEnum, eTypeFileSpec, eTypeFileSpecList, eTypeFormat, eTypePathMap, eTypeProperties, eTypeRegex, eTypeSInt64, eTypeString, eTypeUInt64, eTypeUUID } Type; enum { eDumpOptionName = (1u << 0), eDumpOptionType = (1u << 1), eDumpOptionValue = (1u << 2), eDumpOptionDescription = (1u << 3), eDumpOptionRaw = (1u << 4), eDumpGroupValue = (eDumpOptionName | eDumpOptionType | eDumpOptionValue), eDumpGroupHelp = (eDumpOptionName | eDumpOptionType | eDumpOptionDescription) }; OptionValue () : m_value_was_set (false) { } OptionValue (const OptionValue &rhs) : m_value_was_set (rhs.m_value_was_set) { } virtual ~OptionValue () { } //----------------------------------------------------------------- // Subclasses should override these functions //----------------------------------------------------------------- virtual Type GetType () const = 0; // If this value is always hidden, the avoid showing any info on this // value, just show the info for the child values. virtual bool ValueIsTransparent () const { return GetType() == eTypeProperties; } virtual const char * GetTypeAsCString () const { return GetBuiltinTypeAsCString(GetType()); } static const char * GetBuiltinTypeAsCString (Type t); virtual void DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) = 0; virtual Error SetValueFromCString (const char *value, VarSetOperationType op = eVarSetOperationAssign); virtual bool Clear () = 0; virtual lldb::OptionValueSP DeepCopy () const = 0; virtual size_t AutoComplete (CommandInterpreter &interpreter, const char *s, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches); //----------------------------------------------------------------- // Subclasses can override these functions //----------------------------------------------------------------- virtual lldb::OptionValueSP GetSubValue (const ExecutionContext *exe_ctx, const char *name, bool will_modify, Error &error) const { error.SetErrorStringWithFormat("'%s' is not a value subvalue", name); return lldb::OptionValueSP(); } virtual Error SetSubValue (const ExecutionContext *exe_ctx, VarSetOperationType op, const char *name, const char *value); virtual bool IsAggregateValue () const { return false; } virtual ConstString GetName() const { return ConstString(); } virtual bool DumpQualifiedName (Stream &strm) const; //----------------------------------------------------------------- // Subclasses should NOT override these functions as they use the // above functions to implement functionality //----------------------------------------------------------------- uint32_t GetTypeAsMask () { return 1u << GetType(); } static uint32_t ConvertTypeToMask (OptionValue::Type type) { return 1u << type; } static OptionValue::Type ConvertTypeMaskToType (uint32_t type_mask) { // If only one bit is set, then return an appropriate enumeration switch (type_mask) { case 1u << eTypeArch: return eTypeArch; case 1u << eTypeArgs: return eTypeArgs; case 1u << eTypeArray: return eTypeArray; case 1u << eTypeBoolean: return eTypeBoolean; case 1u << eTypeDictionary: return eTypeDictionary; case 1u << eTypeEnum: return eTypeEnum; case 1u << eTypeFileSpec: return eTypeFileSpec; case 1u << eTypeFileSpecList: return eTypeFileSpecList; case 1u << eTypeFormat: return eTypeFormat; case 1u << eTypePathMap: return eTypePathMap; case 1u << eTypeProperties: return eTypeProperties; case 1u << eTypeRegex: return eTypeRegex; case 1u << eTypeSInt64: return eTypeSInt64; case 1u << eTypeString: return eTypeString; case 1u << eTypeUInt64: return eTypeUInt64; case 1u << eTypeUUID: return eTypeUUID; } // Else return invalid return eTypeInvalid; } static lldb::OptionValueSP CreateValueFromCStringForTypeMask (const char *value_cstr, uint32_t type_mask, Error &error); // Get this value as a uint64_t value if it is encoded as a boolean, // uint64_t or int64_t. Other types will cause "fail_value" to be // returned uint64_t GetUInt64Value (uint64_t fail_value, bool *success_ptr); OptionValueArch * GetAsArch (); const OptionValueArch * GetAsArch () const; OptionValueArray * GetAsArray (); const OptionValueArray * GetAsArray () const; OptionValueArgs * GetAsArgs (); const OptionValueArgs * GetAsArgs () const; OptionValueBoolean * GetAsBoolean (); const OptionValueBoolean * GetAsBoolean () const; OptionValueDictionary * GetAsDictionary (); const OptionValueDictionary * GetAsDictionary () const; OptionValueEnumeration * GetAsEnumeration (); const OptionValueEnumeration * GetAsEnumeration () const; OptionValueFileSpec * GetAsFileSpec (); const OptionValueFileSpec * GetAsFileSpec () const; OptionValueFileSpecList * GetAsFileSpecList (); const OptionValueFileSpecList * GetAsFileSpecList () const; OptionValueFormat * GetAsFormat (); const OptionValueFormat * GetAsFormat () const; OptionValuePathMappings * GetAsPathMappings (); const OptionValuePathMappings * GetAsPathMappings () const; OptionValueProperties * GetAsProperties (); const OptionValueProperties * GetAsProperties () const; OptionValueRegex * GetAsRegex (); const OptionValueRegex * GetAsRegex () const; OptionValueSInt64 * GetAsSInt64 (); const OptionValueSInt64 * GetAsSInt64 () const; OptionValueString * GetAsString (); const OptionValueString * GetAsString () const; OptionValueUInt64 * GetAsUInt64 (); const OptionValueUInt64 * GetAsUInt64 () const; OptionValueUUID * GetAsUUID (); const OptionValueUUID * GetAsUUID () const; bool GetBooleanValue (bool fail_value = false) const; bool SetBooleanValue (bool new_value); int64_t GetEnumerationValue (int64_t fail_value = -1) const; bool SetEnumerationValue (int64_t value); FileSpec GetFileSpecValue () const; bool SetFileSpecValue (const FileSpec &file_spec); FileSpecList GetFileSpecListValue () const; lldb::Format GetFormatValue (lldb::Format fail_value = lldb::eFormatDefault) const; bool SetFormatValue (lldb::Format new_value); const RegularExpression * GetRegexValue () const; int64_t GetSInt64Value (int64_t fail_value = 0) const; bool SetSInt64Value (int64_t new_value); const char * GetStringValue (const char *fail_value = NULL) const; bool SetStringValue (const char *new_value); uint64_t GetUInt64Value (uint64_t fail_value = 0) const; bool SetUInt64Value (uint64_t new_value); UUID GetUUIDValue () const; bool SetUUIDValue (const UUID &uuid); bool OptionWasSet () const { return m_value_was_set; } void SetOptionWasSet () { m_value_was_set = true; } void SetParent (const lldb::OptionValueSP &parent_sp) { m_parent_wp = parent_sp; } protected: lldb::OptionValueWP m_parent_wp; bool m_value_was_set; // This can be used to see if a value has been set // by a call to SetValueFromCString(). It is often // handy to know if an option value was set from // the command line or as a setting, versus if we // just have the default value that was already // populated in the option value. }; } // namespace lldb_private #endif // liblldb_OptionValue_h_