1//===-- OptionValue.h --------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_OptionValue_h_
11#define liblldb_OptionValue_h_
12
13// C Includes
14// C++ Includes
15// Other libraries and framework includes
16// Project includes
17#include "lldb/lldb-defines.h"
18#include "lldb/Core/ConstString.h"
19#include "lldb/Core/Error.h"
20
21namespace lldb_private {
22
23    //---------------------------------------------------------------------
24    // OptionValue
25    //---------------------------------------------------------------------
26    class OptionValue
27    {
28    public:
29        typedef enum {
30            eTypeInvalid = 0,
31            eTypeArch,
32            eTypeArgs,
33            eTypeArray,
34            eTypeBoolean,
35            eTypeDictionary,
36            eTypeEnum,
37            eTypeFileSpec,
38            eTypeFileSpecList,
39            eTypeFormat,
40            eTypePathMap,
41            eTypeProperties,
42            eTypeRegex,
43            eTypeSInt64,
44            eTypeString,
45            eTypeUInt64,
46            eTypeUUID
47        } Type;
48
49        enum {
50            eDumpOptionName         = (1u << 0),
51            eDumpOptionType         = (1u << 1),
52            eDumpOptionValue        = (1u << 2),
53            eDumpOptionDescription  = (1u << 3),
54            eDumpOptionRaw          = (1u << 4),
55            eDumpGroupValue         = (eDumpOptionName | eDumpOptionType | eDumpOptionValue),
56            eDumpGroupHelp          = (eDumpOptionName | eDumpOptionType | eDumpOptionDescription)
57        };
58
59
60        OptionValue () :
61            m_value_was_set (false)
62        {
63        }
64
65        OptionValue (const OptionValue &rhs) :
66            m_value_was_set (rhs.m_value_was_set)
67        {
68        }
69
70        virtual ~OptionValue ()
71        {
72        }
73        //-----------------------------------------------------------------
74        // Subclasses should override these functions
75        //-----------------------------------------------------------------
76        virtual Type
77        GetType () const = 0;
78
79        // If this value is always hidden, the avoid showing any info on this
80        // value, just show the info for the child values.
81        virtual bool
82        ValueIsTransparent () const
83        {
84            return GetType() == eTypeProperties;
85        }
86
87        virtual const char *
88        GetTypeAsCString () const
89        {
90            return GetBuiltinTypeAsCString(GetType());
91        }
92
93
94        static const char *
95        GetBuiltinTypeAsCString (Type t);
96
97        virtual void
98        DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) = 0;
99
100        virtual Error
101        SetValueFromCString (const char *value, VarSetOperationType op = eVarSetOperationAssign);
102
103        virtual bool
104        Clear () = 0;
105
106        virtual lldb::OptionValueSP
107        DeepCopy () const = 0;
108
109        virtual size_t
110        AutoComplete (CommandInterpreter &interpreter,
111                      const char *s,
112                      int match_start_point,
113                      int max_return_elements,
114                      bool &word_complete,
115                      StringList &matches);
116
117        //-----------------------------------------------------------------
118        // Subclasses can override these functions
119        //-----------------------------------------------------------------
120        virtual lldb::OptionValueSP
121        GetSubValue (const ExecutionContext *exe_ctx,
122                     const char *name,
123                     bool will_modify,
124                     Error &error) const
125        {
126            error.SetErrorStringWithFormat("'%s' is not a value subvalue", name);
127            return lldb::OptionValueSP();
128        }
129
130        virtual Error
131        SetSubValue (const ExecutionContext *exe_ctx,
132                     VarSetOperationType op,
133                     const char *name,
134                     const char *value);
135
136        virtual bool
137        IsAggregateValue () const
138        {
139            return false;
140        }
141
142        virtual ConstString
143        GetName() const
144        {
145            return ConstString();
146        }
147
148        virtual bool
149        DumpQualifiedName (Stream &strm) const;
150        //-----------------------------------------------------------------
151        // Subclasses should NOT override these functions as they use the
152        // above functions to implement functionality
153        //-----------------------------------------------------------------
154        uint32_t
155        GetTypeAsMask ()
156        {
157            return 1u << GetType();
158        }
159
160        static uint32_t
161        ConvertTypeToMask (OptionValue::Type type)
162        {
163            return 1u << type;
164        }
165
166        static OptionValue::Type
167        ConvertTypeMaskToType (uint32_t type_mask)
168        {
169            // If only one bit is set, then return an appropriate enumeration
170            switch (type_mask)
171            {
172                case 1u << eTypeArch:           return eTypeArch;
173                case 1u << eTypeArgs:           return eTypeArgs;
174                case 1u << eTypeArray:          return eTypeArray;
175                case 1u << eTypeBoolean:        return eTypeBoolean;
176                case 1u << eTypeDictionary:     return eTypeDictionary;
177                case 1u << eTypeEnum:           return eTypeEnum;
178                case 1u << eTypeFileSpec:       return eTypeFileSpec;
179                case 1u << eTypeFileSpecList:   return eTypeFileSpecList;
180                case 1u << eTypeFormat:         return eTypeFormat;
181                case 1u << eTypePathMap:        return eTypePathMap;
182                case 1u << eTypeProperties:     return eTypeProperties;
183                case 1u << eTypeRegex:          return eTypeRegex;
184                case 1u << eTypeSInt64:         return eTypeSInt64;
185                case 1u << eTypeString:         return eTypeString;
186                case 1u << eTypeUInt64:         return eTypeUInt64;
187                case 1u << eTypeUUID:           return eTypeUUID;
188            }
189            // Else return invalid
190            return eTypeInvalid;
191        }
192
193        static lldb::OptionValueSP
194        CreateValueFromCStringForTypeMask (const char *value_cstr,
195                                           uint32_t type_mask,
196                                           Error &error);
197
198        // Get this value as a uint64_t value if it is encoded as a boolean,
199        // uint64_t or int64_t. Other types will cause "fail_value" to be
200        // returned
201        uint64_t
202        GetUInt64Value (uint64_t fail_value, bool *success_ptr);
203
204        OptionValueArch *
205        GetAsArch ();
206
207        const OptionValueArch *
208        GetAsArch () const;
209
210        OptionValueArray *
211        GetAsArray ();
212
213        const OptionValueArray *
214        GetAsArray () const;
215
216        OptionValueArgs *
217        GetAsArgs ();
218
219        const OptionValueArgs *
220        GetAsArgs () const;
221
222        OptionValueBoolean *
223        GetAsBoolean ();
224
225        const OptionValueBoolean *
226        GetAsBoolean () const;
227
228        OptionValueDictionary *
229        GetAsDictionary ();
230
231        const OptionValueDictionary *
232        GetAsDictionary () const;
233
234        OptionValueEnumeration *
235        GetAsEnumeration ();
236
237        const OptionValueEnumeration *
238        GetAsEnumeration () const;
239
240        OptionValueFileSpec *
241        GetAsFileSpec ();
242
243        const OptionValueFileSpec *
244        GetAsFileSpec () const;
245
246        OptionValueFileSpecList *
247        GetAsFileSpecList ();
248
249        const OptionValueFileSpecList *
250        GetAsFileSpecList () const;
251
252        OptionValueFormat *
253        GetAsFormat ();
254
255        const OptionValueFormat *
256        GetAsFormat () const;
257
258        OptionValuePathMappings *
259        GetAsPathMappings ();
260
261        const OptionValuePathMappings *
262        GetAsPathMappings () const;
263
264        OptionValueProperties *
265        GetAsProperties ();
266
267        const OptionValueProperties *
268        GetAsProperties () const;
269
270        OptionValueRegex *
271        GetAsRegex ();
272
273        const OptionValueRegex *
274        GetAsRegex () const;
275
276        OptionValueSInt64 *
277        GetAsSInt64 ();
278
279        const OptionValueSInt64 *
280        GetAsSInt64 () const;
281
282        OptionValueString *
283        GetAsString ();
284
285        const OptionValueString *
286        GetAsString () const;
287
288        OptionValueUInt64 *
289        GetAsUInt64 ();
290
291        const OptionValueUInt64 *
292        GetAsUInt64 () const;
293
294        OptionValueUUID *
295        GetAsUUID ();
296
297        const OptionValueUUID *
298        GetAsUUID () const;
299
300        bool
301        GetBooleanValue (bool fail_value = false) const;
302
303        bool
304        SetBooleanValue (bool new_value);
305
306        int64_t
307        GetEnumerationValue (int64_t fail_value = -1) const;
308
309        bool
310        SetEnumerationValue (int64_t value);
311
312        FileSpec
313        GetFileSpecValue () const;
314
315        bool
316        SetFileSpecValue (const FileSpec &file_spec);
317
318        FileSpecList
319        GetFileSpecListValue () const;
320
321        lldb::Format
322        GetFormatValue (lldb::Format fail_value = lldb::eFormatDefault) const;
323
324        bool
325        SetFormatValue (lldb::Format new_value);
326
327        const RegularExpression *
328        GetRegexValue () const;
329
330        int64_t
331        GetSInt64Value (int64_t fail_value = 0) const;
332
333        bool
334        SetSInt64Value (int64_t new_value);
335
336        const char *
337        GetStringValue (const char *fail_value = NULL) const;
338
339        bool
340        SetStringValue (const char *new_value);
341
342        uint64_t
343        GetUInt64Value (uint64_t fail_value = 0) const;
344
345        bool
346        SetUInt64Value (uint64_t new_value);
347
348        UUID
349        GetUUIDValue () const;
350
351        bool
352        SetUUIDValue (const UUID &uuid);
353
354        bool
355        OptionWasSet () const
356        {
357            return m_value_was_set;
358        }
359
360        void
361        SetOptionWasSet ()
362        {
363            m_value_was_set = true;
364        }
365
366        void
367        SetParent (const lldb::OptionValueSP &parent_sp)
368        {
369            m_parent_wp = parent_sp;
370        }
371    protected:
372        lldb::OptionValueWP m_parent_wp;
373        bool m_value_was_set; // This can be used to see if a value has been set
374                              // by a call to SetValueFromCString(). It is often
375                              // handy to know if an option value was set from
376                              // the command line or as a setting, versus if we
377                              // just have the default value that was already
378                              // populated in the option value.
379
380    };
381
382} // namespace lldb_private
383
384#endif  // liblldb_OptionValue_h_
385