1//===-- TypeCategoryMap.h ---------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_DATAFORMATTERS_TYPECATEGORYMAP_H
10#define LLDB_DATAFORMATTERS_TYPECATEGORYMAP_H
11
12#include <functional>
13#include <list>
14#include <map>
15#include <mutex>
16
17#include "lldb/lldb-enumerations.h"
18#include "lldb/lldb-public.h"
19
20#include "lldb/DataFormatters/FormattersContainer.h"
21#include "lldb/DataFormatters/TypeCategory.h"
22
23namespace lldb_private {
24class TypeCategoryMap {
25private:
26 typedef ConstString KeyType;
27 typedef TypeCategoryImpl ValueType;
28 typedef ValueType::SharedPointer ValueSP;
29 typedef std::list<lldb::TypeCategoryImplSP> ActiveCategoriesList;
30 typedef ActiveCategoriesList::iterator ActiveCategoriesIterator;
31
32public:
33 typedef std::map<KeyType, ValueSP> MapType;
34 typedef MapType::iterator MapIterator;
35 typedef std::function<bool(const ValueSP &)> ForEachCallback;
36
37 typedef uint32_t Position;
38
39 static const Position First = 0;
40 static const Position Default = 1;
41 static const Position Last = UINT32_MAX;
42
43 TypeCategoryMap(IFormatChangeListener *lst);
44
45 void Add(KeyType name, const ValueSP &entry);
46
47 bool Delete(KeyType name);
48
49 bool Enable(KeyType category_name, Position pos = Default);
50
51 bool Disable(KeyType category_name);
52
53 bool Enable(ValueSP category, Position pos = Default);
54
55 bool Disable(ValueSP category);
56
57 void EnableAllCategories();
58
59 void DisableAllCategories();
60
61 void Clear();
62
63 bool Get(KeyType name, ValueSP &entry);
64
65 bool Get(uint32_t pos, ValueSP &entry);
66
67 void ForEach(ForEachCallback callback);
68
69 lldb::TypeCategoryImplSP GetAtIndex(uint32_t);
70
71 bool
72 AnyMatches(ConstString type_name,
73 TypeCategoryImpl::FormatCategoryItems items =
74 TypeCategoryImpl::ALL_ITEM_TYPES,
75 bool only_enabled = true, const char **matching_category = nullptr,
76 TypeCategoryImpl::FormatCategoryItems *matching_type = nullptr);
77
78 uint32_t GetCount() { return m_map.size(); }
79
80 template <typename ImplSP> void Get(FormattersMatchData &, ImplSP &);
81
82private:
83 class delete_matching_categories {
84 lldb::TypeCategoryImplSP ptr;
85
86 public:
87 delete_matching_categories(lldb::TypeCategoryImplSP p)
88 : ptr(std::move(p)) {}
89
90 bool operator()(const lldb::TypeCategoryImplSP &other) {
91 return ptr.get() == other.get();
92 }
93 };
94
95 std::recursive_mutex m_map_mutex;
96 IFormatChangeListener *listener;
97
98 MapType m_map;
99 ActiveCategoriesList m_active_categories;
100
101 MapType &map() { return m_map; }
102
103 ActiveCategoriesList &active_list() { return m_active_categories; }
104
105 std::recursive_mutex &mutex() { return m_map_mutex; }
106
107 friend class FormattersContainer<ValueType>;
108 friend class FormatManager;
109};
110} // namespace lldb_private
111
112#endif // LLDB_DATAFORMATTERS_TYPECATEGORYMAP_H
113