TypeCategory.h revision 280031
1//===-- TypeCategory.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_TypeCategory_h_
11#define lldb_TypeCategory_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/FormatClasses.h"
22#include "lldb/DataFormatters/FormattersContainer.h"
23
24namespace lldb_private {
25
26    template <typename FormatterImpl>
27    class FormatterContainerPair
28    {
29    public:
30        typedef FormattersContainer<ConstString, FormatterImpl> ExactMatchContainer;
31        typedef FormattersContainer<lldb::RegularExpressionSP, FormatterImpl> RegexMatchContainer;
32
33        typedef typename ExactMatchContainer::MapType ExactMatchMap;
34        typedef typename RegexMatchContainer::MapType RegexMatchMap;
35
36        typedef typename ExactMatchContainer::MapValueType MapValueType;
37
38        typedef typename ExactMatchContainer::SharedPointer ExactMatchContainerSP;
39        typedef typename RegexMatchContainer::SharedPointer RegexMatchContainerSP;
40
41        FormatterContainerPair (const char* exact_name,
42                                const char* regex_name,
43                                IFormatChangeListener* clist) :
44            m_exact_sp(new ExactMatchContainer(std::string(exact_name),clist)),
45            m_regex_sp(new RegexMatchContainer(std::string(regex_name),clist))
46        {
47        }
48
49        ~FormatterContainerPair () = default;
50
51        ExactMatchContainerSP
52        GetExactMatch () const
53        {
54            return m_exact_sp;
55        }
56
57        RegexMatchContainerSP
58        GetRegexMatch () const
59        {
60            return m_regex_sp;
61        }
62
63    private:
64        ExactMatchContainerSP m_exact_sp;
65        RegexMatchContainerSP m_regex_sp;
66    };
67
68    class TypeCategoryImpl
69    {
70    private:
71        typedef FormatterContainerPair<TypeFormatImpl> FormatContainer;
72        typedef FormatterContainerPair<TypeSummaryImpl> SummaryContainer;
73        typedef FormatterContainerPair<TypeFilterImpl> FilterContainer;
74        typedef FormatterContainerPair<TypeValidatorImpl> ValidatorContainer;
75
76#ifndef LLDB_DISABLE_PYTHON
77        typedef FormatterContainerPair<ScriptedSyntheticChildren> SynthContainer;
78#endif // #ifndef LLDB_DISABLE_PYTHON
79
80    public:
81
82        typedef uint16_t FormatCategoryItems;
83        static const uint16_t ALL_ITEM_TYPES = UINT16_MAX;
84
85        typedef FormatContainer::ExactMatchContainerSP FormatContainerSP;
86        typedef FormatContainer::RegexMatchContainerSP RegexFormatContainerSP;
87
88        typedef SummaryContainer::ExactMatchContainerSP SummaryContainerSP;
89        typedef SummaryContainer::RegexMatchContainerSP RegexSummaryContainerSP;
90
91        typedef FilterContainer::ExactMatchContainerSP FilterContainerSP;
92        typedef FilterContainer::RegexMatchContainerSP RegexFilterContainerSP;
93#ifndef LLDB_DISABLE_PYTHON
94        typedef SynthContainer::ExactMatchContainerSP SynthContainerSP;
95        typedef SynthContainer::RegexMatchContainerSP RegexSynthContainerSP;
96#endif // #ifndef LLDB_DISABLE_PYTHON
97
98        typedef ValidatorContainer::ExactMatchContainerSP ValidatorContainerSP;
99        typedef ValidatorContainer::RegexMatchContainerSP RegexValidatorContainerSP;
100
101        TypeCategoryImpl (IFormatChangeListener* clist,
102                          ConstString name);
103
104        FormatContainerSP
105        GetTypeFormatsContainer ()
106        {
107            return m_format_cont.GetExactMatch();
108        }
109
110        RegexFormatContainerSP
111        GetRegexTypeFormatsContainer ()
112        {
113            return m_format_cont.GetRegexMatch();
114        }
115
116        SummaryContainerSP
117        GetTypeSummariesContainer ()
118        {
119            return m_summary_cont.GetExactMatch();
120        }
121
122        RegexSummaryContainerSP
123        GetRegexTypeSummariesContainer ()
124        {
125            return m_summary_cont.GetRegexMatch();
126        }
127
128        FilterContainerSP
129        GetTypeFiltersContainer ()
130        {
131            return m_filter_cont.GetExactMatch();
132        }
133
134        RegexFilterContainerSP
135        GetRegexTypeFiltersContainer ()
136        {
137            return m_filter_cont.GetRegexMatch();
138        }
139
140        FormatContainer::MapValueType
141        GetFormatForType (lldb::TypeNameSpecifierImplSP type_sp);
142
143        SummaryContainer::MapValueType
144        GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
145
146        FilterContainer::MapValueType
147        GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
148
149#ifndef LLDB_DISABLE_PYTHON
150        SynthContainer::MapValueType
151        GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
152#endif
153
154        ValidatorContainer::MapValueType
155        GetValidatorForType (lldb::TypeNameSpecifierImplSP type_sp);
156
157        lldb::TypeNameSpecifierImplSP
158        GetTypeNameSpecifierForFormatAtIndex (size_t index);
159
160        lldb::TypeNameSpecifierImplSP
161        GetTypeNameSpecifierForSummaryAtIndex (size_t index);
162
163        FormatContainer::MapValueType
164        GetFormatAtIndex (size_t index);
165
166        SummaryContainer::MapValueType
167        GetSummaryAtIndex (size_t index);
168
169        FilterContainer::MapValueType
170        GetFilterAtIndex (size_t index);
171
172        lldb::TypeNameSpecifierImplSP
173        GetTypeNameSpecifierForFilterAtIndex (size_t index);
174
175#ifndef LLDB_DISABLE_PYTHON
176        SynthContainerSP
177        GetTypeSyntheticsContainer ()
178        {
179            return m_synth_cont.GetExactMatch();
180        }
181
182        RegexSynthContainerSP
183        GetRegexTypeSyntheticsContainer ()
184        {
185            return m_synth_cont.GetRegexMatch();
186        }
187
188        SynthContainer::MapValueType
189        GetSyntheticAtIndex (size_t index);
190
191        lldb::TypeNameSpecifierImplSP
192        GetTypeNameSpecifierForSyntheticAtIndex (size_t index);
193#endif // #ifndef LLDB_DISABLE_PYTHON
194
195        ValidatorContainerSP
196        GetTypeValidatorsContainer ()
197        {
198            return m_validator_cont.GetExactMatch();
199        }
200
201        RegexValidatorContainerSP
202        GetRegexTypeValidatorsContainer ()
203        {
204            return m_validator_cont.GetRegexMatch();
205        }
206
207        ValidatorContainer::MapValueType
208        GetValidatorAtIndex (size_t index);
209
210        lldb::TypeNameSpecifierImplSP
211        GetTypeNameSpecifierForValidatorAtIndex (size_t index);
212
213        bool
214        IsEnabled () const
215        {
216            return m_enabled;
217        }
218
219        uint32_t
220        GetEnabledPosition()
221        {
222            if (m_enabled == false)
223                return UINT32_MAX;
224            else
225                return m_enabled_position;
226        }
227
228        bool
229        Get (ValueObject& valobj,
230             const FormattersMatchVector& candidates,
231             lldb::TypeFormatImplSP& entry,
232             uint32_t* reason = NULL);
233
234        bool
235        Get (ValueObject& valobj,
236             const FormattersMatchVector& candidates,
237             lldb::TypeSummaryImplSP& entry,
238             uint32_t* reason = NULL);
239
240        bool
241        Get (ValueObject& valobj,
242             const FormattersMatchVector& candidates,
243             lldb::SyntheticChildrenSP& entry,
244             uint32_t* reason = NULL);
245
246        bool
247        Get (ValueObject& valobj,
248             const FormattersMatchVector& candidates,
249             lldb::TypeValidatorImplSP& entry,
250             uint32_t* reason = NULL);
251
252        void
253        Clear (FormatCategoryItems items = ALL_ITEM_TYPES);
254
255        bool
256        Delete (ConstString name,
257                FormatCategoryItems items = ALL_ITEM_TYPES);
258
259        uint32_t
260        GetCount (FormatCategoryItems items = ALL_ITEM_TYPES);
261
262        const char*
263        GetName ()
264        {
265            return m_name.GetCString();
266        }
267
268        bool
269        AnyMatches (ConstString type_name,
270                    FormatCategoryItems items = ALL_ITEM_TYPES,
271                    bool only_enabled = true,
272                    const char** matching_category = NULL,
273                    FormatCategoryItems* matching_type = NULL);
274
275        typedef std::shared_ptr<TypeCategoryImpl> SharedPointer;
276
277    private:
278        FormatContainer m_format_cont;
279        SummaryContainer m_summary_cont;
280        FilterContainer m_filter_cont;
281#ifndef LLDB_DISABLE_PYTHON
282        SynthContainer m_synth_cont;
283#endif // #ifndef LLDB_DISABLE_PYTHON
284        ValidatorContainer m_validator_cont;
285
286        bool m_enabled;
287
288        IFormatChangeListener* m_change_listener;
289
290        Mutex m_mutex;
291
292        ConstString m_name;
293
294        uint32_t m_enabled_position;
295
296        void
297        Enable (bool value, uint32_t position);
298
299        void
300        Disable ()
301        {
302            Enable(false, UINT32_MAX);
303        }
304
305        uint32_t
306        GetLastEnabledPosition ()
307        {
308            return m_enabled_position;
309        }
310
311        void
312        SetEnabledPosition (uint32_t p)
313        {
314            m_enabled_position = p;
315        }
316
317        friend class TypeCategoryMap;
318
319        friend class FormattersContainer<ConstString, TypeFormatImpl>;
320        friend class FormattersContainer<lldb::RegularExpressionSP, TypeFormatImpl>;
321
322        friend class FormattersContainer<ConstString, TypeSummaryImpl>;
323        friend class FormattersContainer<lldb::RegularExpressionSP, TypeSummaryImpl>;
324
325        friend class FormattersContainer<ConstString, TypeFilterImpl>;
326        friend class FormattersContainer<lldb::RegularExpressionSP, TypeFilterImpl>;
327
328#ifndef LLDB_DISABLE_PYTHON
329        friend class FormattersContainer<ConstString, ScriptedSyntheticChildren>;
330        friend class FormattersContainer<lldb::RegularExpressionSP, ScriptedSyntheticChildren>;
331#endif // #ifndef LLDB_DISABLE_PYTHON
332
333        friend class FormattersContainer<ConstString, TypeValidatorImpl>;
334        friend class FormattersContainer<lldb::RegularExpressionSP, TypeValidatorImpl>;
335    };
336
337} // namespace lldb_private
338
339#endif	// lldb_TypeCategory_h_
340