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/Core/Log.h"
13 #include "lldb/DataFormatters/FormatClasses.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 (FormattersMatchData& match_data)
223 Mutex::Locker locker(m_map_mutex);
226 ActiveCategoriesIterator begin, end = m_active_categories.end();
228 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS));
232 for (auto match : match_data.GetMatchesVector())
234 log->Printf("[CategoryMap::GetSummaryFormat] candidate match = %s %s %s %s reason = %" PRIu32,
235 match.GetTypeName().GetCString(),
236 match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers",
237 match.DidStripReference() ? "strip-reference" : "no-strip-reference",
238 match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef",
243 for (begin = m_active_categories.begin(); begin != end; begin++)
245 lldb::TypeCategoryImplSP category_sp = *begin;
246 lldb::TypeFormatImplSP current_format;
248 log->Printf("[TypeCategoryMap::GetFormat] Trying to use category %s", category_sp->GetName());
249 if (!category_sp->Get(match_data.GetValueObject(), match_data.GetMatchesVector(), current_format, &reason_why))
251 return current_format;
254 log->Printf("[TypeCategoryMap::GetFormat] nothing found - returning empty SP");
255 return lldb::TypeFormatImplSP();
258 lldb::TypeSummaryImplSP
259 TypeCategoryMap::GetSummaryFormat (FormattersMatchData& match_data)
261 Mutex::Locker locker(m_map_mutex);
264 ActiveCategoriesIterator begin, end = m_active_categories.end();
266 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS));
270 for (auto match : match_data.GetMatchesVector())
272 log->Printf("[CategoryMap::GetSummaryFormat] candidate match = %s %s %s %s reason = %" PRIu32,
273 match.GetTypeName().GetCString(),
274 match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers",
275 match.DidStripReference() ? "strip-reference" : "no-strip-reference",
276 match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef",
281 for (begin = m_active_categories.begin(); begin != end; begin++)
283 lldb::TypeCategoryImplSP category_sp = *begin;
284 lldb::TypeSummaryImplSP current_format;
286 log->Printf("[CategoryMap::GetSummaryFormat] Trying to use category %s", category_sp->GetName());
287 if (!category_sp->Get(match_data.GetValueObject(), match_data.GetMatchesVector(), current_format, &reason_why))
289 return current_format;
292 log->Printf("[CategoryMap::GetSummaryFormat] nothing found - returning empty SP");
293 return lldb::TypeSummaryImplSP();
296 #ifndef LLDB_DISABLE_PYTHON
297 lldb::SyntheticChildrenSP
298 TypeCategoryMap::GetSyntheticChildren (FormattersMatchData& match_data)
300 Mutex::Locker locker(m_map_mutex);
304 ActiveCategoriesIterator begin, end = m_active_categories.end();
306 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS));
310 for (auto match : match_data.GetMatchesVector())
312 log->Printf("[CategoryMap::GetSummaryFormat] candidate match = %s %s %s %s reason = %" PRIu32,
313 match.GetTypeName().GetCString(),
314 match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers",
315 match.DidStripReference() ? "strip-reference" : "no-strip-reference",
316 match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef",
321 for (begin = m_active_categories.begin(); begin != end; begin++)
323 lldb::TypeCategoryImplSP category_sp = *begin;
324 lldb::SyntheticChildrenSP current_format;
326 log->Printf("[CategoryMap::GetSyntheticChildren] Trying to use category %s", category_sp->GetName());
327 if (!category_sp->Get(match_data.GetValueObject(), match_data.GetMatchesVector(), current_format, &reason_why))
329 return current_format;
332 log->Printf("[CategoryMap::GetSyntheticChildren] nothing found - returning empty SP");
333 return lldb::SyntheticChildrenSP();
337 lldb::TypeValidatorImplSP
338 TypeCategoryMap::GetValidator (FormattersMatchData& match_data)
340 Mutex::Locker locker(m_map_mutex);
343 ActiveCategoriesIterator begin, end = m_active_categories.end();
345 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS));
349 for (auto match : match_data.GetMatchesVector())
351 log->Printf("[CategoryMap::GetValidator] candidate match = %s %s %s %s reason = %" PRIu32,
352 match.GetTypeName().GetCString(),
353 match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers",
354 match.DidStripReference() ? "strip-reference" : "no-strip-reference",
355 match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef",
360 for (begin = m_active_categories.begin(); begin != end; begin++)
362 lldb::TypeCategoryImplSP category_sp = *begin;
363 lldb::TypeValidatorImplSP current_format;
365 log->Printf("[CategoryMap::GetValidator] Trying to use category %s", category_sp->GetName());
366 if (!category_sp->Get(match_data.GetValueObject(), match_data.GetMatchesVector(), current_format, &reason_why))
368 return current_format;
371 log->Printf("[CategoryMap::GetValidator] nothing found - returning empty SP");
372 return lldb::TypeValidatorImplSP();
376 TypeCategoryMap::ForEach(ForEachCallback callback)
380 Mutex::Locker locker(m_map_mutex);
382 // loop through enabled categories in respective order
384 ActiveCategoriesIterator begin, end = m_active_categories.end();
385 for (begin = m_active_categories.begin(); begin != end; begin++)
387 lldb::TypeCategoryImplSP category = *begin;
388 if (!callback(category))
393 // loop through disabled categories in just any order
395 MapIterator pos, end = m_map.end();
396 for (pos = m_map.begin(); pos != end; pos++)
398 if (pos->second->IsEnabled())
400 KeyType type = pos->first;
401 if (!callback(pos->second))
409 TypeCategoryMap::GetAtIndex (uint32_t index)
411 Mutex::Locker locker(m_map_mutex);
413 if (index < m_map.size())
415 MapIterator pos, end = m_map.end();
416 for (pos = m_map.begin(); pos != end; pos++)
424 return TypeCategoryImplSP();