1 //===-- TypeCategoryMap.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 lldb_TypeCategoryMap_h_
11 #define lldb_TypeCategoryMap_h_
12 
13 // C Includes
14 // C++ Includes
15 
16 // Other libraries and framework includes
17 // Project includes
18 #include "lldb/lldb-public.h"
19 #include "lldb/lldb-enumerations.h"
20 
21 #include "lldb/DataFormatters/FormatNavigator.h"
22 #include "lldb/DataFormatters/TypeCategory.h"
23 
24 namespace lldb_private {
25     class TypeCategoryMap
26     {
27     private:
28         typedef ConstString KeyType;
29         typedef TypeCategoryImpl ValueType;
30         typedef ValueType::SharedPointer ValueSP;
31         typedef std::list<lldb::TypeCategoryImplSP> ActiveCategoriesList;
32         typedef ActiveCategoriesList::iterator ActiveCategoriesIterator;
33 
34     public:
35         typedef std::map<KeyType, ValueSP> MapType;
36         typedef MapType::iterator MapIterator;
37         typedef bool(*CallbackType)(void*, const ValueSP&);
38         typedef uint32_t Position;
39 
40         static const Position First = 0;
41         static const Position Default = 1;
42         static const Position Last = UINT32_MAX;
43 
44         TypeCategoryMap (IFormatChangeListener* lst);
45 
46         void
47         Add (KeyType name,
48              const ValueSP& entry);
49 
50         bool
51         Delete (KeyType name);
52 
53         bool
54         Enable (KeyType category_name,
55                 Position pos = Default);
56 
57         bool
58         Disable (KeyType category_name);
59 
60         bool
61         Enable (ValueSP category,
62                 Position pos = Default);
63 
64         bool
65         Disable (ValueSP category);
66 
67         void
68         Clear ();
69 
70         bool
71         Get (KeyType name,
72              ValueSP& entry);
73 
74         bool
75         Get (uint32_t pos,
76              ValueSP& entry);
77 
78         void
79         LoopThrough (CallbackType callback, void* param);
80 
81         lldb::TypeCategoryImplSP
82         GetAtIndex (uint32_t);
83 
84         bool
85         AnyMatches (ConstString type_name,
86                     TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
87                     bool only_enabled = true,
88                     const char** matching_category = NULL,
89                     TypeCategoryImpl::FormatCategoryItems* matching_type = NULL);
90 
91         uint32_t
GetCount()92         GetCount ()
93         {
94             return m_map.size();
95         }
96 
97         lldb::TypeSummaryImplSP
98         GetSummaryFormat (ValueObject& valobj,
99                           lldb::DynamicValueType use_dynamic);
100 
101 #ifndef LLDB_DISABLE_PYTHON
102         lldb::SyntheticChildrenSP
103         GetSyntheticChildren (ValueObject& valobj,
104                               lldb::DynamicValueType use_dynamic);
105 #endif
106 
107     private:
108 
109         class delete_matching_categories
110         {
111             lldb::TypeCategoryImplSP ptr;
112         public:
delete_matching_categories(lldb::TypeCategoryImplSP p)113             delete_matching_categories(lldb::TypeCategoryImplSP p) : ptr(p)
114             {}
115 
operator()116             bool operator()(const lldb::TypeCategoryImplSP& other)
117             {
118                 return ptr.get() == other.get();
119             }
120         };
121 
122         Mutex m_map_mutex;
123         IFormatChangeListener* listener;
124 
125         MapType m_map;
126         ActiveCategoriesList m_active_categories;
127 
map()128         MapType& map ()
129         {
130             return m_map;
131         }
132 
active_list()133         ActiveCategoriesList& active_list ()
134         {
135             return m_active_categories;
136         }
137 
mutex()138         Mutex& mutex ()
139         {
140             return m_map_mutex;
141         }
142 
143         friend class FormatNavigator<KeyType, ValueType>;
144         friend class FormatManager;
145     };
146 } // namespace lldb_private
147 
148 #endif	// lldb_TypeCategoryMap_h_
149