1f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===-- TypeCategory.h -------------------------------------------*- C++ -*-===//
2f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
3f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//                     The LLVM Compiler Infrastructure
4f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
5f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// This file is distributed under the University of Illinois Open Source
6f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// License. See LICENSE.TXT for details.
7f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
8f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===----------------------------------------------------------------------===//
9f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
10f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef lldb_TypeCategory_h_
11f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#define lldb_TypeCategory_h_
12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
13f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C Includes
14f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C++ Includes
15f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
16f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Other libraries and framework includes
17f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Project includes
18f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/lldb-public.h"
19f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/lldb-enumerations.h"
20f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
21f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/FormatNavigator.h"
22f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
23f509c5ec066599a3399fced39ea36996184939e8Enrico Granatanamespace lldb_private {
24f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    class TypeCategoryImpl
25f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
26f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    private:
27f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
28f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef FormatNavigator<ConstString, TypeSummaryImpl> SummaryNavigator;
29f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef FormatNavigator<lldb::RegularExpressionSP, TypeSummaryImpl> RegexSummaryNavigator;
30f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
31f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef FormatNavigator<ConstString, TypeFilterImpl> FilterNavigator;
32f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef FormatNavigator<lldb::RegularExpressionSP, TypeFilterImpl> RegexFilterNavigator;
33f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
34f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
35f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef FormatNavigator<ConstString, ScriptedSyntheticChildren> SynthNavigator;
36f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef FormatNavigator<lldb::RegularExpressionSP, ScriptedSyntheticChildren> RegexSynthNavigator;
37f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif // #ifndef LLDB_DISABLE_PYTHON
38f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
39f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef SummaryNavigator::MapType SummaryMap;
40f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef RegexSummaryNavigator::MapType RegexSummaryMap;
41f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef FilterNavigator::MapType FilterMap;
42f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef RegexFilterNavigator::MapType RegexFilterMap;
43f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
44f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef SynthNavigator::MapType SynthMap;
45f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef RegexSynthNavigator::MapType RegexSynthMap;
46f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif // #ifndef LLDB_DISABLE_PYTHON
47f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
48f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    public:
49f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
50f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef uint16_t FormatCategoryItems;
51f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        static const uint16_t ALL_ITEM_TYPES = UINT16_MAX;
52f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
53f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef SummaryNavigator::SharedPointer SummaryNavigatorSP;
54f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef RegexSummaryNavigator::SharedPointer RegexSummaryNavigatorSP;
55f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef FilterNavigator::SharedPointer FilterNavigatorSP;
56f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef RegexFilterNavigator::SharedPointer RegexFilterNavigatorSP;
57f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
58f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef SynthNavigator::SharedPointer SynthNavigatorSP;
59f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef RegexSynthNavigator::SharedPointer RegexSynthNavigatorSP;
60f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif // #ifndef LLDB_DISABLE_PYTHON
61f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
62f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        TypeCategoryImpl (IFormatChangeListener* clist,
63f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                          ConstString name);
64f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
65f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        SummaryNavigatorSP
66f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetSummaryNavigator ()
67f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
68f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return SummaryNavigatorSP(m_summary_nav);
69f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
70f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
71f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        RegexSummaryNavigatorSP
72f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetRegexSummaryNavigator ()
73f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
74f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return RegexSummaryNavigatorSP(m_regex_summary_nav);
75f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
76f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
77f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        FilterNavigatorSP
78f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetFilterNavigator ()
79f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
80f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return FilterNavigatorSP(m_filter_nav);
81f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
82f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
83f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        RegexFilterNavigatorSP
84f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetRegexFilterNavigator ()
85f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
86f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return RegexFilterNavigatorSP(m_regex_filter_nav);
87f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
88f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
89f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        SummaryNavigator::MapValueType
90f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
91f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
92f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        FilterNavigator::MapValueType
93f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
94f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
95f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
96f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        SynthNavigator::MapValueType
97f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
98f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
99f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
100f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        lldb::TypeNameSpecifierImplSP
101f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetTypeNameSpecifierForSummaryAtIndex (size_t index);
102f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
103f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        SummaryNavigator::MapValueType
104f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetSummaryAtIndex (size_t index);
105f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
106f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        FilterNavigator::MapValueType
107f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetFilterAtIndex (size_t index);
108f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
109f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        lldb::TypeNameSpecifierImplSP
110f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetTypeNameSpecifierForFilterAtIndex (size_t index);
111f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
112f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
113f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        SynthNavigatorSP
114f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetSyntheticNavigator ()
115f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
116f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return SynthNavigatorSP(m_synth_nav);
117f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
118f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
119f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        RegexSynthNavigatorSP
120f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetRegexSyntheticNavigator ()
121f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
122f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return RegexSynthNavigatorSP(m_regex_synth_nav);
123f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
124f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
125f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        SynthNavigator::MapValueType
126f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetSyntheticAtIndex (size_t index);
127f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
128f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        lldb::TypeNameSpecifierImplSP
129f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetTypeNameSpecifierForSyntheticAtIndex (size_t index);
130f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
131f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif // #ifndef LLDB_DISABLE_PYTHON
132f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
133f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
134f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        IsEnabled () const
135f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
136f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return m_enabled;
137f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
138f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
139f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        uint32_t
140f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetEnabledPosition()
141f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
142f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            if (m_enabled == false)
143f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                return UINT32_MAX;
144f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            else
145f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                return m_enabled_position;
146f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
147f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
148f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
149f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Get (ValueObject& valobj,
150f509c5ec066599a3399fced39ea36996184939e8Enrico Granata             lldb::TypeSummaryImplSP& entry,
151f509c5ec066599a3399fced39ea36996184939e8Enrico Granata             lldb::DynamicValueType use_dynamic,
152f509c5ec066599a3399fced39ea36996184939e8Enrico Granata             uint32_t* reason = NULL);
153f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
154f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
155f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Get (ValueObject& valobj,
156f509c5ec066599a3399fced39ea36996184939e8Enrico Granata             lldb::SyntheticChildrenSP& entry,
157f509c5ec066599a3399fced39ea36996184939e8Enrico Granata             lldb::DynamicValueType use_dynamic,
158f509c5ec066599a3399fced39ea36996184939e8Enrico Granata             uint32_t* reason = NULL);
159f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
160f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        void
161f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Clear (FormatCategoryItems items = ALL_ITEM_TYPES);
162f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
163f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
164f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Delete (ConstString name,
165f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                FormatCategoryItems items = ALL_ITEM_TYPES);
166f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
167f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        uint32_t
168f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetCount (FormatCategoryItems items = ALL_ITEM_TYPES);
169f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
170f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        const char*
171f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetName ()
172f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
173f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return m_name.GetCString();
174f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
175f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
176f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
177f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        AnyMatches (ConstString type_name,
178f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                    FormatCategoryItems items = ALL_ITEM_TYPES,
179f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                    bool only_enabled = true,
180f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                    const char** matching_category = NULL,
181f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                    FormatCategoryItems* matching_type = NULL);
182f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
183102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton        typedef std::shared_ptr<TypeCategoryImpl> SharedPointer;
184f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
185f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    private:
186f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        SummaryNavigator::SharedPointer m_summary_nav;
187f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        RegexSummaryNavigator::SharedPointer m_regex_summary_nav;
188f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        FilterNavigator::SharedPointer m_filter_nav;
189f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        RegexFilterNavigator::SharedPointer m_regex_filter_nav;
190f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
191f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        SynthNavigator::SharedPointer m_synth_nav;
192f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        RegexSynthNavigator::SharedPointer m_regex_synth_nav;
193f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif // #ifndef LLDB_DISABLE_PYTHON
194f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
195f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool m_enabled;
196f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
197f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        IFormatChangeListener* m_change_listener;
198f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
199f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Mutex m_mutex;
200f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
201f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        ConstString m_name;
202f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
203f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        uint32_t m_enabled_position;
204f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
205f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        void
206f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Enable (bool value, uint32_t position);
207f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
208f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        void
209f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Disable ()
210f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
211f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            Enable(false, UINT32_MAX);
212f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
213f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
214f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        friend class TypeCategoryMap;
215f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
216f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        friend class FormatNavigator<ConstString, TypeSummaryImpl>;
217f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        friend class FormatNavigator<lldb::RegularExpressionSP, TypeSummaryImpl>;
218f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
219f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        friend class FormatNavigator<ConstString, TypeFilterImpl>;
220f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        friend class FormatNavigator<lldb::RegularExpressionSP, TypeFilterImpl>;
221f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
222f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
223f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        friend class FormatNavigator<ConstString, ScriptedSyntheticChildren>;
224f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        friend class FormatNavigator<lldb::RegularExpressionSP, ScriptedSyntheticChildren>;
225f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif // #ifndef LLDB_DISABLE_PYTHON
226f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    };
227f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
228f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} // namespace lldb_private
229f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
230f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif	// lldb_TypeCategory_h_
231