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) 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