TypeCategory.h revision 262528
1356290Sjkim//===-- TypeCategory.h -------------------------------------------*- C++ -*-===//
2238405Sjkim//
3238405Sjkim//                     The LLVM Compiler Infrastructure
4238405Sjkim//
5238405Sjkim// This file is distributed under the University of Illinois Open Source
6238405Sjkim// License. See LICENSE.TXT for details.
7238405Sjkim//
8238405Sjkim//===----------------------------------------------------------------------===//
9238405Sjkim
10238405Sjkim#ifndef lldb_TypeCategory_h_
11238405Sjkim#define lldb_TypeCategory_h_
12238405Sjkim
13238405Sjkim// C Includes
14238405Sjkim// C++ Includes
15238405Sjkim
16238405Sjkim// Other libraries and framework includes
17238405Sjkim// Project includes
18238405Sjkim#include "lldb/lldb-public.h"
19238405Sjkim#include "lldb/lldb-enumerations.h"
20238405Sjkim
21238405Sjkim#include "lldb/DataFormatters/FormatClasses.h"
22238405Sjkim#include "lldb/DataFormatters/FormattersContainer.h"
23238405Sjkim
24238405Sjkimnamespace lldb_private {
25238405Sjkim
26238405Sjkim    template <typename FormatterImpl>
27238405Sjkim    class FormatterContainerPair
28238405Sjkim    {
29238405Sjkim    public:
30238405Sjkim        typedef FormattersContainer<ConstString, FormatterImpl> ExactMatchContainer;
31238405Sjkim        typedef FormattersContainer<lldb::RegularExpressionSP, FormatterImpl> RegexMatchContainer;
32238405Sjkim
33238405Sjkim        typedef typename ExactMatchContainer::MapType ExactMatchMap;
34238405Sjkim        typedef typename RegexMatchContainer::MapType RegexMatchMap;
35238405Sjkim
36238405Sjkim        typedef typename ExactMatchContainer::MapValueType MapValueType;
37238405Sjkim
38238405Sjkim        typedef typename ExactMatchContainer::SharedPointer ExactMatchContainerSP;
39238405Sjkim        typedef typename RegexMatchContainer::SharedPointer RegexMatchContainerSP;
40238405Sjkim
41276861Sjkim        FormatterContainerPair (const char* exact_name,
42276861Sjkim                                const char* regex_name,
43238405Sjkim                                IFormatChangeListener* clist) :
44238405Sjkim            m_exact_sp(new ExactMatchContainer(std::string(exact_name),clist)),
45238405Sjkim            m_regex_sp(new RegexMatchContainer(std::string(regex_name),clist))
46238405Sjkim        {
47238405Sjkim        }
48238405Sjkim
49312826Sjkim        ~FormatterContainerPair () = default;
50238405Sjkim
51238405Sjkim        ExactMatchContainerSP
52238405Sjkim        GetExactMatch () const
53276861Sjkim        {
54276861Sjkim            return m_exact_sp;
55276861Sjkim        }
56238405Sjkim
57344604Sjkim        RegexMatchContainerSP
58344604Sjkim        GetRegexMatch () const
59344604Sjkim        {
60344604Sjkim            return m_regex_sp;
61344604Sjkim        }
62344604Sjkim
63238405Sjkim    private:
64344604Sjkim        ExactMatchContainerSP m_exact_sp;
65344604Sjkim        RegexMatchContainerSP m_regex_sp;
66344604Sjkim    };
67344604Sjkim
68276861Sjkim    class TypeCategoryImpl
69238405Sjkim    {
70344604Sjkim    private:
71238405Sjkim        typedef FormatterContainerPair<TypeFormatImpl> FormatContainer;
72238405Sjkim        typedef FormatterContainerPair<TypeSummaryImpl> SummaryContainer;
73238405Sjkim        typedef FormatterContainerPair<TypeFilterImpl> FilterContainer;
74238405Sjkim
75238405Sjkim#ifndef LLDB_DISABLE_PYTHON
76238405Sjkim        typedef FormatterContainerPair<ScriptedSyntheticChildren> SynthContainer;
77238405Sjkim#endif // #ifndef LLDB_DISABLE_PYTHON
78238405Sjkim
79238405Sjkim    public:
80238405Sjkim
81238405Sjkim        typedef uint16_t FormatCategoryItems;
82238405Sjkim        static const uint16_t ALL_ITEM_TYPES = UINT16_MAX;
83238405Sjkim
84238405Sjkim        typedef FormatContainer::ExactMatchContainerSP FormatContainerSP;
85238405Sjkim        typedef FormatContainer::RegexMatchContainerSP RegexFormatContainerSP;
86238405Sjkim
87238405Sjkim        typedef SummaryContainer::ExactMatchContainerSP SummaryContainerSP;
88238405Sjkim        typedef SummaryContainer::RegexMatchContainerSP RegexSummaryContainerSP;
89238405Sjkim
90238405Sjkim        typedef FilterContainer::ExactMatchContainerSP FilterContainerSP;
91238405Sjkim        typedef FilterContainer::RegexMatchContainerSP RegexFilterContainerSP;
92238405Sjkim#ifndef LLDB_DISABLE_PYTHON
93238405Sjkim        typedef SynthContainer::ExactMatchContainerSP SynthContainerSP;
94238405Sjkim        typedef SynthContainer::RegexMatchContainerSP RegexSynthContainerSP;
95238405Sjkim#endif // #ifndef LLDB_DISABLE_PYTHON
96238405Sjkim
97238405Sjkim        TypeCategoryImpl (IFormatChangeListener* clist,
98238405Sjkim                          ConstString name);
99238405Sjkim
100238405Sjkim        FormatContainerSP
101238405Sjkim        GetTypeFormatsContainer ()
102238405Sjkim        {
103238405Sjkim            return m_format_cont.GetExactMatch();
104238405Sjkim        }
105238405Sjkim
106238405Sjkim        RegexFormatContainerSP
107238405Sjkim        GetRegexTypeFormatsContainer ()
108238405Sjkim        {
109238405Sjkim            return m_format_cont.GetRegexMatch();
110238405Sjkim        }
111238405Sjkim
112238405Sjkim        SummaryContainerSP
113238405Sjkim        GetTypeSummariesContainer ()
114238405Sjkim        {
115238405Sjkim            return m_summary_cont.GetExactMatch();
116238405Sjkim        }
117238405Sjkim
118238405Sjkim        RegexSummaryContainerSP
119238405Sjkim        GetRegexTypeSummariesContainer ()
120238405Sjkim        {
121238405Sjkim            return m_summary_cont.GetRegexMatch();
122238405Sjkim        }
123238405Sjkim
124238405Sjkim        FilterContainerSP
125238405Sjkim        GetTypeFiltersContainer ()
126238405Sjkim        {
127238405Sjkim            return m_filter_cont.GetExactMatch();
128238405Sjkim        }
129238405Sjkim
130238405Sjkim        RegexFilterContainerSP
131238405Sjkim        GetRegexTypeFiltersContainer ()
132238405Sjkim        {
133238405Sjkim            return m_filter_cont.GetRegexMatch();
134238405Sjkim        }
135238405Sjkim
136356290Sjkim        FormatContainer::MapValueType
137238405Sjkim        GetFormatForType (lldb::TypeNameSpecifierImplSP type_sp);
138238405Sjkim
139238405Sjkim        SummaryContainer::MapValueType
140238405Sjkim        GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
141238405Sjkim
142238405Sjkim        FilterContainer::MapValueType
143238405Sjkim        GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
144238405Sjkim
145238405Sjkim#ifndef LLDB_DISABLE_PYTHON
146238405Sjkim        SynthContainer::MapValueType
147238405Sjkim        GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
148238405Sjkim#endif
149238405Sjkim
150238405Sjkim        lldb::TypeNameSpecifierImplSP
151238405Sjkim        GetTypeNameSpecifierForFormatAtIndex (size_t index);
152238405Sjkim
153238405Sjkim        lldb::TypeNameSpecifierImplSP
154238405Sjkim        GetTypeNameSpecifierForSummaryAtIndex (size_t index);
155238405Sjkim
156238405Sjkim        FormatContainer::MapValueType
157238405Sjkim        GetFormatAtIndex (size_t index);
158238405Sjkim
159238405Sjkim        SummaryContainer::MapValueType
160344604Sjkim        GetSummaryAtIndex (size_t index);
161238405Sjkim
162238405Sjkim        FilterContainer::MapValueType
163344604Sjkim        GetFilterAtIndex (size_t index);
164276861Sjkim
165238405Sjkim        lldb::TypeNameSpecifierImplSP
166344604Sjkim        GetTypeNameSpecifierForFilterAtIndex (size_t index);
167238405Sjkim
168238405Sjkim#ifndef LLDB_DISABLE_PYTHON
169238405Sjkim        SynthContainerSP
170344604Sjkim        GetTypeSyntheticsContainer ()
171238405Sjkim        {
172290207Sjkim            return m_synth_cont.GetExactMatch();
173238405Sjkim        }
174238405Sjkim
175344604Sjkim        RegexSynthContainerSP
176238405Sjkim        GetRegexTypeSyntheticsContainer ()
177238405Sjkim        {
178344604Sjkim            return m_synth_cont.GetRegexMatch();
179344604Sjkim        }
180238405Sjkim
181238405Sjkim        SynthContainer::MapValueType
182238405Sjkim        GetSyntheticAtIndex (size_t index);
183238405Sjkim
184238405Sjkim        lldb::TypeNameSpecifierImplSP
185238405Sjkim        GetTypeNameSpecifierForSyntheticAtIndex (size_t index);
186238405Sjkim
187238405Sjkim#endif // #ifndef LLDB_DISABLE_PYTHON
188344604Sjkim
189238405Sjkim        bool
190238405Sjkim        IsEnabled () const
191238405Sjkim        {
192344604Sjkim            return m_enabled;
193238405Sjkim        }
194344604Sjkim
195238405Sjkim        uint32_t
196344604Sjkim        GetEnabledPosition()
197238405Sjkim        {
198238405Sjkim            if (m_enabled == false)
199344604Sjkim                return UINT32_MAX;
200238405Sjkim            else
201238405Sjkim                return m_enabled_position;
202238405Sjkim        }
203238405Sjkim
204238405Sjkim        bool
205238405Sjkim        Get (ValueObject& valobj,
206238405Sjkim             const FormattersMatchVector& candidates,
207238405Sjkim             lldb::TypeFormatImplSP& entry,
208238405Sjkim             uint32_t* reason = NULL);
209238405Sjkim
210238405Sjkim        bool
211238405Sjkim        Get (ValueObject& valobj,
212238405Sjkim             const FormattersMatchVector& candidates,
213238405Sjkim             lldb::TypeSummaryImplSP& entry,
214238405Sjkim             uint32_t* reason = NULL);
215238405Sjkim
216238405Sjkim        bool
217238405Sjkim        Get (ValueObject& valobj,
218238405Sjkim             const FormattersMatchVector& candidates,
219238405Sjkim             lldb::SyntheticChildrenSP& entry,
220238405Sjkim             uint32_t* reason = NULL);
221238405Sjkim
222238405Sjkim        void
223238405Sjkim        Clear (FormatCategoryItems items = ALL_ITEM_TYPES);
224238405Sjkim
225238405Sjkim        bool
226238405Sjkim        Delete (ConstString name,
227238405Sjkim                FormatCategoryItems items = ALL_ITEM_TYPES);
228238405Sjkim
229238405Sjkim        uint32_t
230238405Sjkim        GetCount (FormatCategoryItems items = ALL_ITEM_TYPES);
231238405Sjkim
232238405Sjkim        const char*
233238405Sjkim        GetName ()
234238405Sjkim        {
235238405Sjkim            return m_name.GetCString();
236238405Sjkim        }
237238405Sjkim
238238405Sjkim        bool
239238405Sjkim        AnyMatches (ConstString type_name,
240238405Sjkim                    FormatCategoryItems items = ALL_ITEM_TYPES,
241238405Sjkim                    bool only_enabled = true,
242238405Sjkim                    const char** matching_category = NULL,
243238405Sjkim                    FormatCategoryItems* matching_type = NULL);
244238405Sjkim
245238405Sjkim        typedef std::shared_ptr<TypeCategoryImpl> SharedPointer;
246238405Sjkim
247238405Sjkim    private:
248238405Sjkim        FormatContainer m_format_cont;
249238405Sjkim
250238405Sjkim        SummaryContainer m_summary_cont;
251238405Sjkim
252238405Sjkim        FilterContainer m_filter_cont;
253238405Sjkim
254238405Sjkim#ifndef LLDB_DISABLE_PYTHON
255238405Sjkim        SynthContainer m_synth_cont;
256238405Sjkim#endif // #ifndef LLDB_DISABLE_PYTHON
257238405Sjkim
258238405Sjkim        bool m_enabled;
259238405Sjkim
260238405Sjkim        IFormatChangeListener* m_change_listener;
261238405Sjkim
262238405Sjkim        Mutex m_mutex;
263238405Sjkim
264238405Sjkim        ConstString m_name;
265238405Sjkim
266238405Sjkim        uint32_t m_enabled_position;
267238405Sjkim
268238405Sjkim        void
269238405Sjkim        Enable (bool value, uint32_t position);
270238405Sjkim
271238405Sjkim        void
272238405Sjkim        Disable ()
273238405Sjkim        {
274238405Sjkim            Enable(false, UINT32_MAX);
275238405Sjkim        }
276238405Sjkim
277238405Sjkim        friend class TypeCategoryMap;
278238405Sjkim
279238405Sjkim        friend class FormattersContainer<ConstString, TypeFormatImpl>;
280238405Sjkim        friend class FormattersContainer<lldb::RegularExpressionSP, TypeFormatImpl>;
281238405Sjkim
282238405Sjkim        friend class FormattersContainer<ConstString, TypeSummaryImpl>;
283238405Sjkim        friend class FormattersContainer<lldb::RegularExpressionSP, TypeSummaryImpl>;
284238405Sjkim
285238405Sjkim        friend class FormattersContainer<ConstString, TypeFilterImpl>;
286238405Sjkim        friend class FormattersContainer<lldb::RegularExpressionSP, TypeFilterImpl>;
287238405Sjkim
288238405Sjkim#ifndef LLDB_DISABLE_PYTHON
289238405Sjkim        friend class FormattersContainer<ConstString, ScriptedSyntheticChildren>;
290238405Sjkim        friend class FormattersContainer<lldb::RegularExpressionSP, ScriptedSyntheticChildren>;
291238405Sjkim#endif // #ifndef LLDB_DISABLE_PYTHON
292238405Sjkim    };
293238405Sjkim
294238405Sjkim} // namespace lldb_private
295238405Sjkim
296238405Sjkim#endif	// lldb_TypeCategory_h_
297238405Sjkim