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/DataFormatters/TypeCategoryMap.h"
12 #include "lldb/DataFormatters/FormatClasses.h"
13 #include "lldb/DataFormatters/FormatManager.h"
17 // Other libraries and framework includes
21 using namespace lldb_private;
23 TypeCategoryMap::TypeCategoryMap (IFormatChangeListener* lst) :
24 m_map_mutex(Mutex::eMutexTypeRecursive),
29 ConstString default_cs("default");
30 lldb::TypeCategoryImplSP default_sp = lldb::TypeCategoryImplSP(new TypeCategoryImpl(listener, default_cs));
31 Add(default_cs,default_sp);
32 Enable(default_cs,First);
36 TypeCategoryMap::Add (KeyType name, const ValueSP& entry)
38 Mutex::Locker locker(m_map_mutex);
45 TypeCategoryMap::Delete (KeyType name)
47 Mutex::Locker locker(m_map_mutex);
48 MapIterator iter = m_map.find(name);
49 if (iter == m_map.end())
59 TypeCategoryMap::Enable (KeyType category_name, Position pos)
61 Mutex::Locker locker(m_map_mutex);
63 if (!Get(category_name,category))
65 return Enable(category, pos);
69 TypeCategoryMap::Disable (KeyType category_name)
71 Mutex::Locker locker(m_map_mutex);
73 if (!Get(category_name,category))
75 return Disable(category);
79 TypeCategoryMap::Enable (ValueSP category, Position pos)
81 Mutex::Locker locker(m_map_mutex);
85 if (pos == First || m_active_categories.size() == 0)
86 m_active_categories.push_front(category);
87 else if (pos == Last || pos == m_active_categories.size())
88 m_active_categories.push_back(category);
89 else if (pos < m_active_categories.size())
91 ActiveCategoriesList::iterator iter = m_active_categories.begin();
96 m_active_categories.insert(iter,category);
100 category->Enable(true,
108 TypeCategoryMap::Disable (ValueSP category)
110 Mutex::Locker locker(m_map_mutex);
113 m_active_categories.remove_if(delete_matching_categories(category));
121 TypeCategoryMap::EnableAllCategories ()
123 Mutex::Locker locker(m_map_mutex);
124 std::vector<ValueSP> sorted_categories(m_map.size(), ValueSP());
125 MapType::iterator iter = m_map.begin(), end = m_map.end();
126 for (; iter != end; ++iter)
128 if (iter->second->IsEnabled())
130 auto pos = iter->second->GetLastEnabledPosition();
131 if (pos >= sorted_categories.size())
133 auto iter = std::find_if(sorted_categories.begin(),
134 sorted_categories.end(),
135 [] (const ValueSP& sp) -> bool {
136 return sp.get() == nullptr;
138 pos = std::distance(sorted_categories.begin(), iter);
140 sorted_categories.at(pos) = iter->second;
142 decltype(sorted_categories)::iterator viter = sorted_categories.begin(), vend = sorted_categories.end();
143 for (; viter != vend; viter++)
145 Enable(*viter, Last);
149 TypeCategoryMap::DisableAllCategories ()
151 Mutex::Locker locker(m_map_mutex);
153 for (; false == m_active_categories.empty(); p++)
155 m_active_categories.front()->SetEnabledPosition(p);
156 Disable(m_active_categories.front());
161 TypeCategoryMap::Clear ()
163 Mutex::Locker locker(m_map_mutex);
165 m_active_categories.clear();
171 TypeCategoryMap::Get (KeyType name, ValueSP& entry)
173 Mutex::Locker locker(m_map_mutex);
174 MapIterator iter = m_map.find(name);
175 if (iter == m_map.end())
177 entry = iter->second;
182 TypeCategoryMap::Get (uint32_t pos, ValueSP& entry)
184 Mutex::Locker locker(m_map_mutex);
185 MapIterator iter = m_map.begin();
186 MapIterator end = m_map.end();
194 entry = iter->second;
199 TypeCategoryMap::AnyMatches (ConstString type_name,
200 TypeCategoryImpl::FormatCategoryItems items,
202 const char** matching_category,
203 TypeCategoryImpl::FormatCategoryItems* matching_type)
205 Mutex::Locker locker(m_map_mutex);
207 MapIterator pos, end = m_map.end();
208 for (pos = m_map.begin(); pos != end; pos++)
210 if (pos->second->AnyMatches(type_name,
220 lldb::TypeFormatImplSP
221 TypeCategoryMap::GetFormat (ValueObject& valobj,
222 lldb::DynamicValueType use_dynamic)
224 Mutex::Locker locker(m_map_mutex);
227 ActiveCategoriesIterator begin, end = m_active_categories.end();
229 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
231 FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic);
233 for (begin = m_active_categories.begin(); begin != end; begin++)
235 lldb::TypeCategoryImplSP category_sp = *begin;
236 lldb::TypeFormatImplSP current_format;
238 log->Printf("\n[TypeCategoryMap::GetFormat] Trying to use category %s", category_sp->GetName());
239 if (!category_sp->Get(valobj, matches, current_format, &reason_why))
241 return current_format;
244 log->Printf("[TypeCategoryMap::GetFormat] nothing found - returning empty SP");
245 return lldb::TypeFormatImplSP();
248 lldb::TypeSummaryImplSP
249 TypeCategoryMap::GetSummaryFormat (ValueObject& valobj,
250 lldb::DynamicValueType use_dynamic)
252 Mutex::Locker locker(m_map_mutex);
255 ActiveCategoriesIterator begin, end = m_active_categories.end();
257 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
259 FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic);
261 for (begin = m_active_categories.begin(); begin != end; begin++)
263 lldb::TypeCategoryImplSP category_sp = *begin;
264 lldb::TypeSummaryImplSP current_format;
266 log->Printf("\n[CategoryMap::GetSummaryFormat] Trying to use category %s", category_sp->GetName());
267 if (!category_sp->Get(valobj, matches, current_format, &reason_why))
269 return current_format;
272 log->Printf("[CategoryMap::GetSummaryFormat] nothing found - returning empty SP");
273 return lldb::TypeSummaryImplSP();
276 #ifndef LLDB_DISABLE_PYTHON
277 lldb::SyntheticChildrenSP
278 TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj,
279 lldb::DynamicValueType use_dynamic)
281 Mutex::Locker locker(m_map_mutex);
285 ActiveCategoriesIterator begin, end = m_active_categories.end();
287 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
289 FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic);
291 for (begin = m_active_categories.begin(); begin != end; begin++)
293 lldb::TypeCategoryImplSP category_sp = *begin;
294 lldb::SyntheticChildrenSP current_format;
296 log->Printf("\n[CategoryMap::GetSyntheticChildren] Trying to use category %s", category_sp->GetName());
297 if (!category_sp->Get(valobj, matches, current_format, &reason_why))
299 return current_format;
302 log->Printf("[CategoryMap::GetSyntheticChildren] nothing found - returning empty SP");
303 return lldb::SyntheticChildrenSP();
307 lldb::TypeValidatorImplSP
308 TypeCategoryMap::GetValidator (ValueObject& valobj,
309 lldb::DynamicValueType use_dynamic)
311 Mutex::Locker locker(m_map_mutex);
314 ActiveCategoriesIterator begin, end = m_active_categories.end();
316 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
318 FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic);
320 for (begin = m_active_categories.begin(); begin != end; begin++)
322 lldb::TypeCategoryImplSP category_sp = *begin;
323 lldb::TypeValidatorImplSP current_format;
325 log->Printf("\n[CategoryMap::GetValidator] Trying to use category %s", category_sp->GetName());
326 if (!category_sp->Get(valobj, matches, current_format, &reason_why))
328 return current_format;
331 log->Printf("[CategoryMap::GetValidator] nothing found - returning empty SP");
332 return lldb::TypeValidatorImplSP();
336 TypeCategoryMap::LoopThrough(CallbackType callback, void* param)
340 Mutex::Locker locker(m_map_mutex);
342 // loop through enabled categories in respective order
344 ActiveCategoriesIterator begin, end = m_active_categories.end();
345 for (begin = m_active_categories.begin(); begin != end; begin++)
347 lldb::TypeCategoryImplSP category = *begin;
348 ConstString type = ConstString(category->GetName());
349 if (!callback(param, category))
354 // loop through disabled categories in just any order
356 MapIterator pos, end = m_map.end();
357 for (pos = m_map.begin(); pos != end; pos++)
359 if (pos->second->IsEnabled())
361 KeyType type = pos->first;
362 if (!callback(param, pos->second))
370 TypeCategoryMap::GetAtIndex (uint32_t index)
372 Mutex::Locker locker(m_map_mutex);
374 if (index < m_map.size())
376 MapIterator pos, end = m_map.end();
377 for (pos = m_map.begin(); pos != end; pos++)
385 return TypeCategoryImplSP();