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 
23 namespace lldb_private {
24 class TypeCategoryMap {
25 private:
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 
32 public:
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 
82 private:
83   class delete_matching_categories {
84     lldb::TypeCategoryImplSP ptr;
85 
86   public:
87     delete_matching_categories(lldb::TypeCategoryImplSP p) : ptr(p) {}
88 
89     bool operator()(const lldb::TypeCategoryImplSP &other) {
90       return ptr.get() == other.get();
91     }
92   };
93 
94   std::recursive_mutex m_map_mutex;
95   IFormatChangeListener *listener;
96 
97   MapType m_map;
98   ActiveCategoriesList m_active_categories;
99 
100   MapType &map() { return m_map; }
101 
102   ActiveCategoriesList &active_list() { return m_active_categories; }
103 
104   std::recursive_mutex &mutex() { return m_map_mutex; }
105 
106   friend class FormattersContainer<KeyType, ValueType>;
107   friend class FormatManager;
108 };
109 } // namespace lldb_private
110 
111 #endif // LLDB_DATAFORMATTERS_TYPECATEGORYMAP_H
112