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