1 //===-- TypeCategoryMap.cpp ----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/lldb-python.h"
12 #include "lldb/DataFormatters/TypeCategoryMap.h"
14 #include "lldb/DataFormatters/FormatClasses.h"
15 #include "lldb/DataFormatters/FormatManager.h"
19 // Other libraries and framework includes
23 using namespace lldb_private;
25 TypeCategoryMap::TypeCategoryMap (IFormatChangeListener* lst) :
26 m_map_mutex(Mutex::eMutexTypeRecursive),
31 ConstString default_cs("default");
32 lldb::TypeCategoryImplSP default_sp = lldb::TypeCategoryImplSP(new TypeCategoryImpl(listener, default_cs));
33 Add(default_cs,default_sp);
34 Enable(default_cs,First);
38 TypeCategoryMap::Add (KeyType name, const ValueSP& entry)
40 Mutex::Locker locker(m_map_mutex);
47 TypeCategoryMap::Delete (KeyType name)
49 Mutex::Locker locker(m_map_mutex);
50 MapIterator iter = m_map.find(name);
51 if (iter == m_map.end())
61 TypeCategoryMap::Enable (KeyType category_name, Position pos)
63 Mutex::Locker locker(m_map_mutex);
65 if (!Get(category_name,category))
67 return Enable(category, pos);
71 TypeCategoryMap::Disable (KeyType category_name)
73 Mutex::Locker locker(m_map_mutex);
75 if (!Get(category_name,category))
77 return Disable(category);
81 TypeCategoryMap::Enable (ValueSP category, Position pos)
83 Mutex::Locker locker(m_map_mutex);
87 if (pos == First || m_active_categories.size() == 0)
88 m_active_categories.push_front(category);
89 else if (pos == Last || pos == m_active_categories.size())
90 m_active_categories.push_back(category);
91 else if (pos < m_active_categories.size())
93 ActiveCategoriesList::iterator iter = m_active_categories.begin();
98 m_active_categories.insert(iter,category);
102 category->Enable(true,
110 TypeCategoryMap::Disable (ValueSP category)
112 Mutex::Locker locker(m_map_mutex);
115 m_active_categories.remove_if(delete_matching_categories(category));
123 TypeCategoryMap::Clear ()
125 Mutex::Locker locker(m_map_mutex);
127 m_active_categories.clear();
133 TypeCategoryMap::Get (KeyType name, ValueSP& entry)
135 Mutex::Locker locker(m_map_mutex);
136 MapIterator iter = m_map.find(name);
137 if (iter == m_map.end())
139 entry = iter->second;
144 TypeCategoryMap::Get (uint32_t pos, ValueSP& entry)
146 Mutex::Locker locker(m_map_mutex);
147 MapIterator iter = m_map.begin();
148 MapIterator end = m_map.end();
156 entry = iter->second;
161 TypeCategoryMap::AnyMatches (ConstString type_name,
162 TypeCategoryImpl::FormatCategoryItems items,
164 const char** matching_category,
165 TypeCategoryImpl::FormatCategoryItems* matching_type)
167 Mutex::Locker locker(m_map_mutex);
169 MapIterator pos, end = m_map.end();
170 for (pos = m_map.begin(); pos != end; pos++)
172 if (pos->second->AnyMatches(type_name,
182 lldb::TypeFormatImplSP
183 TypeCategoryMap::GetFormat (ValueObject& valobj,
184 lldb::DynamicValueType use_dynamic)
186 Mutex::Locker locker(m_map_mutex);
189 ActiveCategoriesIterator begin, end = m_active_categories.end();
191 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
193 FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic);
195 for (begin = m_active_categories.begin(); begin != end; begin++)
197 lldb::TypeCategoryImplSP category_sp = *begin;
198 lldb::TypeFormatImplSP current_format;
200 log->Printf("\n[TypeCategoryMap::GetFormat] Trying to use category %s", category_sp->GetName());
201 if (!category_sp->Get(valobj, matches, current_format, &reason_why))
203 return current_format;
206 log->Printf("[TypeCategoryMap::GetFormat] nothing found - returning empty SP");
207 return lldb::TypeFormatImplSP();
210 lldb::TypeSummaryImplSP
211 TypeCategoryMap::GetSummaryFormat (ValueObject& valobj,
212 lldb::DynamicValueType use_dynamic)
214 Mutex::Locker locker(m_map_mutex);
217 ActiveCategoriesIterator begin, end = m_active_categories.end();
219 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
221 FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic);
223 for (begin = m_active_categories.begin(); begin != end; begin++)
225 lldb::TypeCategoryImplSP category_sp = *begin;
226 lldb::TypeSummaryImplSP current_format;
228 log->Printf("\n[CategoryMap::GetSummaryFormat] Trying to use category %s", category_sp->GetName());
229 if (!category_sp->Get(valobj, matches, current_format, &reason_why))
231 return current_format;
234 log->Printf("[CategoryMap::GetSummaryFormat] nothing found - returning empty SP");
235 return lldb::TypeSummaryImplSP();
238 #ifndef LLDB_DISABLE_PYTHON
239 lldb::SyntheticChildrenSP
240 TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj,
241 lldb::DynamicValueType use_dynamic)
243 Mutex::Locker locker(m_map_mutex);
247 ActiveCategoriesIterator begin, end = m_active_categories.end();
249 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
251 FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic);
253 for (begin = m_active_categories.begin(); begin != end; begin++)
255 lldb::TypeCategoryImplSP category_sp = *begin;
256 lldb::SyntheticChildrenSP current_format;
258 log->Printf("\n[CategoryMap::GetSyntheticChildren] Trying to use category %s", category_sp->GetName());
259 if (!category_sp->Get(valobj, matches, current_format, &reason_why))
261 return current_format;
264 log->Printf("[CategoryMap::GetSyntheticChildren] nothing found - returning empty SP");
265 return lldb::SyntheticChildrenSP();
270 TypeCategoryMap::LoopThrough(CallbackType callback, void* param)
274 Mutex::Locker locker(m_map_mutex);
276 // loop through enabled categories in respective order
278 ActiveCategoriesIterator begin, end = m_active_categories.end();
279 for (begin = m_active_categories.begin(); begin != end; begin++)
281 lldb::TypeCategoryImplSP category = *begin;
282 ConstString type = ConstString(category->GetName());
283 if (!callback(param, category))
288 // loop through disabled categories in just any order
290 MapIterator pos, end = m_map.end();
291 for (pos = m_map.begin(); pos != end; pos++)
293 if (pos->second->IsEnabled())
295 KeyType type = pos->first;
296 if (!callback(param, pos->second))
304 TypeCategoryMap::GetAtIndex (uint32_t index)
306 Mutex::Locker locker(m_map_mutex);
308 if (index < m_map.size())
310 MapIterator pos, end = m_map.end();
311 for (pos = m_map.begin(); pos != end; pos++)
319 return TypeCategoryImplSP();