1 //===-- TypeCategory.h ------------------------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef lldb_TypeCategory_h_
10 #define lldb_TypeCategory_h_
12 #include <initializer_list>
18 #include "lldb/lldb-enumerations.h"
19 #include "lldb/lldb-public.h"
21 #include "lldb/DataFormatters/FormatClasses.h"
22 #include "lldb/DataFormatters/FormattersContainer.h"
24 namespace lldb_private {
26 template <typename FormatterImpl> class FormatterContainerPair {
28 typedef FormattersContainer<ConstString, FormatterImpl> ExactMatchContainer;
29 typedef FormattersContainer<lldb::RegularExpressionSP, FormatterImpl>
32 typedef typename ExactMatchContainer::MapType ExactMatchMap;
33 typedef typename RegexMatchContainer::MapType RegexMatchMap;
35 typedef typename ExactMatchContainer::MapValueType MapValueType;
37 typedef typename ExactMatchContainer::SharedPointer ExactMatchContainerSP;
38 typedef typename RegexMatchContainer::SharedPointer RegexMatchContainerSP;
41 typename ExactMatchContainer::ForEachCallback ExactMatchForEachCallback;
43 typename RegexMatchContainer::ForEachCallback RegexMatchForEachCallback;
45 FormatterContainerPair(const char *exact_name, const char *regex_name,
46 IFormatChangeListener *clist)
47 : m_exact_sp(new ExactMatchContainer(std::string(exact_name), clist)),
48 m_regex_sp(new RegexMatchContainer(std::string(regex_name), clist)) {}
50 ~FormatterContainerPair() = default;
52 ExactMatchContainerSP GetExactMatch() const { return m_exact_sp; }
54 RegexMatchContainerSP GetRegexMatch() const { return m_regex_sp; }
57 return GetExactMatch()->GetCount() + GetRegexMatch()->GetCount();
61 ExactMatchContainerSP m_exact_sp;
62 RegexMatchContainerSP m_regex_sp;
65 class TypeCategoryImpl {
67 typedef FormatterContainerPair<TypeFormatImpl> FormatContainer;
68 typedef FormatterContainerPair<TypeSummaryImpl> SummaryContainer;
69 typedef FormatterContainerPair<TypeFilterImpl> FilterContainer;
70 typedef FormatterContainerPair<TypeValidatorImpl> ValidatorContainer;
71 typedef FormatterContainerPair<SyntheticChildren> SynthContainer;
74 typedef uint16_t FormatCategoryItems;
75 static const uint16_t ALL_ITEM_TYPES = UINT16_MAX;
77 typedef FormatContainer::ExactMatchContainerSP FormatContainerSP;
78 typedef FormatContainer::RegexMatchContainerSP RegexFormatContainerSP;
80 typedef SummaryContainer::ExactMatchContainerSP SummaryContainerSP;
81 typedef SummaryContainer::RegexMatchContainerSP RegexSummaryContainerSP;
83 typedef FilterContainer::ExactMatchContainerSP FilterContainerSP;
84 typedef FilterContainer::RegexMatchContainerSP RegexFilterContainerSP;
86 typedef SynthContainer::ExactMatchContainerSP SynthContainerSP;
87 typedef SynthContainer::RegexMatchContainerSP RegexSynthContainerSP;
89 typedef ValidatorContainer::ExactMatchContainerSP ValidatorContainerSP;
90 typedef ValidatorContainer::RegexMatchContainerSP RegexValidatorContainerSP;
92 template <typename T> class ForEachCallbacks {
94 ForEachCallbacks() = default;
95 ~ForEachCallbacks() = default;
97 template <typename U = TypeFormatImpl>
98 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
99 SetExact(FormatContainer::ExactMatchForEachCallback callback) {
100 m_format_exact = callback;
103 template <typename U = TypeFormatImpl>
104 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
105 SetWithRegex(FormatContainer::RegexMatchForEachCallback callback) {
106 m_format_regex = callback;
110 template <typename U = TypeSummaryImpl>
111 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
112 SetExact(SummaryContainer::ExactMatchForEachCallback callback) {
113 m_summary_exact = callback;
116 template <typename U = TypeSummaryImpl>
117 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
118 SetWithRegex(SummaryContainer::RegexMatchForEachCallback callback) {
119 m_summary_regex = callback;
123 template <typename U = TypeFilterImpl>
124 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
125 SetExact(FilterContainer::ExactMatchForEachCallback callback) {
126 m_filter_exact = callback;
129 template <typename U = TypeFilterImpl>
130 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
131 SetWithRegex(FilterContainer::RegexMatchForEachCallback callback) {
132 m_filter_regex = callback;
136 template <typename U = SyntheticChildren>
137 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
138 SetExact(SynthContainer::ExactMatchForEachCallback callback) {
139 m_synth_exact = callback;
142 template <typename U = SyntheticChildren>
143 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
144 SetWithRegex(SynthContainer::RegexMatchForEachCallback callback) {
145 m_synth_regex = callback;
148 template <typename U = TypeValidatorImpl>
149 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
150 SetExact(ValidatorContainer::ExactMatchForEachCallback callback) {
151 m_validator_exact = callback;
154 template <typename U = TypeValidatorImpl>
155 typename std::enable_if<std::is_same<U, T>::value, ForEachCallbacks &>::type
156 SetWithRegex(ValidatorContainer::RegexMatchForEachCallback callback) {
157 m_validator_regex = callback;
161 FormatContainer::ExactMatchForEachCallback GetFormatExactCallback() const {
162 return m_format_exact;
164 FormatContainer::RegexMatchForEachCallback GetFormatRegexCallback() const {
165 return m_format_regex;
168 SummaryContainer::ExactMatchForEachCallback
169 GetSummaryExactCallback() const {
170 return m_summary_exact;
172 SummaryContainer::RegexMatchForEachCallback
173 GetSummaryRegexCallback() const {
174 return m_summary_regex;
177 FilterContainer::ExactMatchForEachCallback GetFilterExactCallback() const {
178 return m_filter_exact;
180 FilterContainer::RegexMatchForEachCallback GetFilterRegexCallback() const {
181 return m_filter_regex;
184 SynthContainer::ExactMatchForEachCallback GetSynthExactCallback() const {
185 return m_synth_exact;
187 SynthContainer::RegexMatchForEachCallback GetSynthRegexCallback() const {
188 return m_synth_regex;
191 ValidatorContainer::ExactMatchForEachCallback
192 GetValidatorExactCallback() const {
193 return m_validator_exact;
195 ValidatorContainer::RegexMatchForEachCallback
196 GetValidatorRegexCallback() const {
197 return m_validator_regex;
201 FormatContainer::ExactMatchForEachCallback m_format_exact;
202 FormatContainer::RegexMatchForEachCallback m_format_regex;
204 SummaryContainer::ExactMatchForEachCallback m_summary_exact;
205 SummaryContainer::RegexMatchForEachCallback m_summary_regex;
207 FilterContainer::ExactMatchForEachCallback m_filter_exact;
208 FilterContainer::RegexMatchForEachCallback m_filter_regex;
210 SynthContainer::ExactMatchForEachCallback m_synth_exact;
211 SynthContainer::RegexMatchForEachCallback m_synth_regex;
213 ValidatorContainer::ExactMatchForEachCallback m_validator_exact;
214 ValidatorContainer::RegexMatchForEachCallback m_validator_regex;
217 TypeCategoryImpl(IFormatChangeListener *clist, ConstString name,
218 std::initializer_list<lldb::LanguageType> langs = {});
220 template <typename T> void ForEach(const ForEachCallbacks<T> &foreach) {
221 GetTypeFormatsContainer()->ForEach(foreach.GetFormatExactCallback());
222 GetRegexTypeFormatsContainer()->ForEach(foreach.GetFormatRegexCallback());
224 GetTypeSummariesContainer()->ForEach(foreach.GetSummaryExactCallback());
225 GetRegexTypeSummariesContainer()->ForEach(
226 foreach.GetSummaryRegexCallback());
228 GetTypeFiltersContainer()->ForEach(foreach.GetFilterExactCallback());
229 GetRegexTypeFiltersContainer()->ForEach(foreach.GetFilterRegexCallback());
231 GetTypeSyntheticsContainer()->ForEach(foreach.GetSynthExactCallback());
232 GetRegexTypeSyntheticsContainer()->ForEach(foreach.GetSynthRegexCallback());
234 GetTypeValidatorsContainer()->ForEach(foreach.GetValidatorExactCallback());
235 GetRegexTypeValidatorsContainer()->ForEach(
236 foreach.GetValidatorRegexCallback());
239 FormatContainerSP GetTypeFormatsContainer() {
240 return m_format_cont.GetExactMatch();
243 RegexFormatContainerSP GetRegexTypeFormatsContainer() {
244 return m_format_cont.GetRegexMatch();
247 FormatContainer &GetFormatContainer() { return m_format_cont; }
249 SummaryContainerSP GetTypeSummariesContainer() {
250 return m_summary_cont.GetExactMatch();
253 RegexSummaryContainerSP GetRegexTypeSummariesContainer() {
254 return m_summary_cont.GetRegexMatch();
257 SummaryContainer &GetSummaryContainer() { return m_summary_cont; }
259 FilterContainerSP GetTypeFiltersContainer() {
260 return m_filter_cont.GetExactMatch();
263 RegexFilterContainerSP GetRegexTypeFiltersContainer() {
264 return m_filter_cont.GetRegexMatch();
267 FilterContainer &GetFilterContainer() { return m_filter_cont; }
269 FormatContainer::MapValueType
270 GetFormatForType(lldb::TypeNameSpecifierImplSP type_sp);
272 SummaryContainer::MapValueType
273 GetSummaryForType(lldb::TypeNameSpecifierImplSP type_sp);
275 FilterContainer::MapValueType
276 GetFilterForType(lldb::TypeNameSpecifierImplSP type_sp);
278 SynthContainer::MapValueType
279 GetSyntheticForType(lldb::TypeNameSpecifierImplSP type_sp);
281 ValidatorContainer::MapValueType
282 GetValidatorForType(lldb::TypeNameSpecifierImplSP type_sp);
284 lldb::TypeNameSpecifierImplSP
285 GetTypeNameSpecifierForFormatAtIndex(size_t index);
287 lldb::TypeNameSpecifierImplSP
288 GetTypeNameSpecifierForSummaryAtIndex(size_t index);
290 FormatContainer::MapValueType GetFormatAtIndex(size_t index);
292 SummaryContainer::MapValueType GetSummaryAtIndex(size_t index);
294 FilterContainer::MapValueType GetFilterAtIndex(size_t index);
296 lldb::TypeNameSpecifierImplSP
297 GetTypeNameSpecifierForFilterAtIndex(size_t index);
299 SynthContainerSP GetTypeSyntheticsContainer() {
300 return m_synth_cont.GetExactMatch();
303 RegexSynthContainerSP GetRegexTypeSyntheticsContainer() {
304 return m_synth_cont.GetRegexMatch();
307 SynthContainer &GetSyntheticsContainer() { return m_synth_cont; }
309 SynthContainer::MapValueType GetSyntheticAtIndex(size_t index);
311 lldb::TypeNameSpecifierImplSP
312 GetTypeNameSpecifierForSyntheticAtIndex(size_t index);
314 ValidatorContainerSP GetTypeValidatorsContainer() {
315 return m_validator_cont.GetExactMatch();
318 RegexValidatorContainerSP GetRegexTypeValidatorsContainer() {
319 return m_validator_cont.GetRegexMatch();
322 ValidatorContainer::MapValueType GetValidatorAtIndex(size_t index);
324 lldb::TypeNameSpecifierImplSP
325 GetTypeNameSpecifierForValidatorAtIndex(size_t index);
327 bool IsEnabled() const { return m_enabled; }
329 uint32_t GetEnabledPosition() {
333 return m_enabled_position;
336 bool Get(ValueObject &valobj, const FormattersMatchVector &candidates,
337 lldb::TypeFormatImplSP &entry, uint32_t *reason = nullptr);
339 bool Get(ValueObject &valobj, const FormattersMatchVector &candidates,
340 lldb::TypeSummaryImplSP &entry, uint32_t *reason = nullptr);
342 bool Get(ValueObject &valobj, const FormattersMatchVector &candidates,
343 lldb::SyntheticChildrenSP &entry, uint32_t *reason = nullptr);
345 bool Get(ValueObject &valobj, const FormattersMatchVector &candidates,
346 lldb::TypeValidatorImplSP &entry, uint32_t *reason = nullptr);
348 void Clear(FormatCategoryItems items = ALL_ITEM_TYPES);
350 bool Delete(ConstString name, FormatCategoryItems items = ALL_ITEM_TYPES);
352 uint32_t GetCount(FormatCategoryItems items = ALL_ITEM_TYPES);
354 const char *GetName() { return m_name.GetCString(); }
356 size_t GetNumLanguages();
358 lldb::LanguageType GetLanguageAtIndex(size_t idx);
360 void AddLanguage(lldb::LanguageType lang);
362 bool HasLanguage(lldb::LanguageType lang);
364 std::string GetDescription();
366 bool AnyMatches(ConstString type_name,
367 FormatCategoryItems items = ALL_ITEM_TYPES,
368 bool only_enabled = true,
369 const char **matching_category = nullptr,
370 FormatCategoryItems *matching_type = nullptr);
372 typedef std::shared_ptr<TypeCategoryImpl> SharedPointer;
375 FormatContainer m_format_cont;
376 SummaryContainer m_summary_cont;
377 FilterContainer m_filter_cont;
378 SynthContainer m_synth_cont;
379 ValidatorContainer m_validator_cont;
383 IFormatChangeListener *m_change_listener;
385 std::recursive_mutex m_mutex;
389 std::vector<lldb::LanguageType> m_languages;
391 uint32_t m_enabled_position;
393 void Enable(bool value, uint32_t position);
395 void Disable() { Enable(false, UINT32_MAX); }
397 bool IsApplicable(ValueObject &valobj);
399 uint32_t GetLastEnabledPosition() { return m_enabled_position; }
401 void SetEnabledPosition(uint32_t p) { m_enabled_position = p; }
403 friend class FormatManager;
404 friend class LanguageCategory;
405 friend class TypeCategoryMap;
407 friend class FormattersContainer<ConstString, TypeFormatImpl>;
408 friend class FormattersContainer<lldb::RegularExpressionSP, TypeFormatImpl>;
410 friend class FormattersContainer<ConstString, TypeSummaryImpl>;
411 friend class FormattersContainer<lldb::RegularExpressionSP, TypeSummaryImpl>;
413 friend class FormattersContainer<ConstString, TypeFilterImpl>;
414 friend class FormattersContainer<lldb::RegularExpressionSP, TypeFilterImpl>;
416 friend class FormattersContainer<ConstString, ScriptedSyntheticChildren>;
417 friend class FormattersContainer<lldb::RegularExpressionSP,
418 ScriptedSyntheticChildren>;
420 friend class FormattersContainer<ConstString, TypeValidatorImpl>;
421 friend class FormattersContainer<lldb::RegularExpressionSP,
425 } // namespace lldb_private
427 #endif // lldb_TypeCategory_h_