1254721Semaste//===-- OptionValueEnumeration.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_OptionValueEnumeration_h_
10254721Semaste#define liblldb_OptionValueEnumeration_h_
11254721Semaste
12254721Semaste#include "lldb/Core/UniqueCStringMap.h"
13254721Semaste#include "lldb/Interpreter/OptionValue.h"
14321369Sdim#include "lldb/Utility/ConstString.h"
15321369Sdim#include "lldb/Utility/Status.h"
16321369Sdim#include "lldb/Utility/Stream.h"
17321369Sdim#include "lldb/Utility/StreamString.h"
18321369Sdim#include "lldb/lldb-private-types.h"
19254721Semaste
20254721Semastenamespace lldb_private {
21254721Semaste
22314564Sdimclass OptionValueEnumeration : public OptionValue {
23254721Semastepublic:
24314564Sdim  typedef int64_t enum_type;
25314564Sdim  struct EnumeratorInfo {
26314564Sdim    enum_type value;
27314564Sdim    const char *description;
28314564Sdim  };
29314564Sdim  typedef UniqueCStringMap<EnumeratorInfo> EnumerationMap;
30314564Sdim  typedef EnumerationMap::Entry EnumerationMapEntry;
31254721Semaste
32344779Sdim  OptionValueEnumeration(const OptionEnumValues &enumerators, enum_type value);
33254721Semaste
34314564Sdim  ~OptionValueEnumeration() override;
35314564Sdim
36314564Sdim  // Virtual subclass pure virtual overrides
37314564Sdim
38314564Sdim  OptionValue::Type GetType() const override { return eTypeEnum; }
39314564Sdim
40314564Sdim  void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
41314564Sdim                 uint32_t dump_mask) override;
42314564Sdim
43321369Sdim  Status
44314564Sdim  SetValueFromString(llvm::StringRef value,
45314564Sdim                     VarSetOperationType op = eVarSetOperationAssign) override;
46321369Sdim  Status
47314564Sdim  SetValueFromString(const char *,
48314564Sdim                     VarSetOperationType = eVarSetOperationAssign) = delete;
49314564Sdim
50314564Sdim  bool Clear() override {
51314564Sdim    m_current_value = m_default_value;
52314564Sdim    m_value_was_set = false;
53314564Sdim    return true;
54314564Sdim  }
55314564Sdim
56314564Sdim  lldb::OptionValueSP DeepCopy() const override;
57314564Sdim
58360784Sdim  void AutoComplete(CommandInterpreter &interpreter,
59360784Sdim                    CompletionRequest &request) override;
60314564Sdim
61314564Sdim  // Subclass specific functions
62314564Sdim
63314564Sdim  enum_type operator=(enum_type value) {
64314564Sdim    m_current_value = value;
65314564Sdim    return m_current_value;
66314564Sdim  }
67314564Sdim
68314564Sdim  enum_type GetCurrentValue() const { return m_current_value; }
69314564Sdim
70314564Sdim  enum_type GetDefaultValue() const { return m_default_value; }
71314564Sdim
72314564Sdim  void SetCurrentValue(enum_type value) { m_current_value = value; }
73314564Sdim
74314564Sdim  void SetDefaultValue(enum_type value) { m_default_value = value; }
75314564Sdim
76254721Semasteprotected:
77344779Sdim  void SetEnumerations(const OptionEnumValues &enumerators);
78254721Semaste
79314564Sdim  enum_type m_current_value;
80314564Sdim  enum_type m_default_value;
81314564Sdim  EnumerationMap m_enumerations;
82254721Semaste};
83254721Semaste
84254721Semaste} // namespace lldb_private
85254721Semaste
86296417Sdim#endif // liblldb_OptionValueEnumeration_h_
87