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"
16 // Other libraries and framework includes
20 using namespace lldb_private;
22 TypeCategoryMap::TypeCategoryMap (IFormatChangeListener* lst) :
23 m_map_mutex(Mutex::eMutexTypeRecursive),
28 ConstString default_cs("default");
29 lldb::TypeCategoryImplSP default_sp = lldb::TypeCategoryImplSP(new TypeCategoryImpl(listener, default_cs));
30 Add(default_cs,default_sp);
31 Enable(default_cs,First);
35 TypeCategoryMap::Add (KeyType name, const ValueSP& entry)
37 Mutex::Locker locker(m_map_mutex);
44 TypeCategoryMap::Delete (KeyType name)
46 Mutex::Locker locker(m_map_mutex);
47 MapIterator iter = m_map.find(name);
48 if (iter == m_map.end())
58 TypeCategoryMap::Enable (KeyType category_name, Position pos)
60 Mutex::Locker locker(m_map_mutex);
62 if (!Get(category_name,category))
64 return Enable(category, pos);
68 TypeCategoryMap::Disable (KeyType category_name)
70 Mutex::Locker locker(m_map_mutex);
72 if (!Get(category_name,category))
74 return Disable(category);
78 TypeCategoryMap::Enable (ValueSP category, Position pos)
80 Mutex::Locker locker(m_map_mutex);
84 if (pos == First || m_active_categories.size() == 0)
85 m_active_categories.push_front(category);
86 else if (pos == Last || pos == m_active_categories.size())
87 m_active_categories.push_back(category);
88 else if (pos < m_active_categories.size())
90 ActiveCategoriesList::iterator iter = m_active_categories.begin();
95 m_active_categories.insert(iter,category);
99 category->Enable(true,
107 TypeCategoryMap::Disable (ValueSP category)
109 Mutex::Locker locker(m_map_mutex);
112 m_active_categories.remove_if(delete_matching_categories(category));
120 TypeCategoryMap::Clear ()
122 Mutex::Locker locker(m_map_mutex);
124 m_active_categories.clear();
130 TypeCategoryMap::Get (KeyType name, ValueSP& entry)
132 Mutex::Locker locker(m_map_mutex);
133 MapIterator iter = m_map.find(name);
134 if (iter == m_map.end())
136 entry = iter->second;
141 TypeCategoryMap::Get (uint32_t pos, ValueSP& entry)
143 Mutex::Locker locker(m_map_mutex);
144 MapIterator iter = m_map.begin();
145 MapIterator end = m_map.end();
153 entry = iter->second;
158 TypeCategoryMap::AnyMatches (ConstString type_name,
159 TypeCategoryImpl::FormatCategoryItems items,
161 const char** matching_category,
162 TypeCategoryImpl::FormatCategoryItems* matching_type)
164 Mutex::Locker locker(m_map_mutex);
166 MapIterator pos, end = m_map.end();
167 for (pos = m_map.begin(); pos != end; pos++)
169 if (pos->second->AnyMatches(type_name,
179 lldb::TypeSummaryImplSP
180 TypeCategoryMap::GetSummaryFormat (ValueObject& valobj,
181 lldb::DynamicValueType use_dynamic)
183 Mutex::Locker locker(m_map_mutex);
186 ActiveCategoriesIterator begin, end = m_active_categories.end();
188 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
190 for (begin = m_active_categories.begin(); begin != end; begin++)
192 lldb::TypeCategoryImplSP category_sp = *begin;
193 lldb::TypeSummaryImplSP current_format;
195 log->Printf("\n[CategoryMap::GetSummaryFormat] Trying to use category %s", category_sp->GetName());
196 if (!category_sp->Get(valobj, current_format, use_dynamic, &reason_why))
198 return current_format;
201 log->Printf("[CategoryMap::GetSummaryFormat] nothing found - returning empty SP");
202 return lldb::TypeSummaryImplSP();
205 #ifndef LLDB_DISABLE_PYTHON
206 lldb::SyntheticChildrenSP
207 TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj,
208 lldb::DynamicValueType use_dynamic)
210 Mutex::Locker locker(m_map_mutex);
214 ActiveCategoriesIterator begin, end = m_active_categories.end();
216 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
218 for (begin = m_active_categories.begin(); begin != end; begin++)
220 lldb::TypeCategoryImplSP category_sp = *begin;
221 lldb::SyntheticChildrenSP current_format;
223 log->Printf("\n[CategoryMap::GetSyntheticChildren] Trying to use category %s", category_sp->GetName());
224 if (!category_sp->Get(valobj, current_format, use_dynamic, &reason_why))
226 return current_format;
229 log->Printf("[CategoryMap::GetSyntheticChildren] nothing found - returning empty SP");
230 return lldb::SyntheticChildrenSP();
235 TypeCategoryMap::LoopThrough(CallbackType callback, void* param)
239 Mutex::Locker locker(m_map_mutex);
241 // loop through enabled categories in respective order
243 ActiveCategoriesIterator begin, end = m_active_categories.end();
244 for (begin = m_active_categories.begin(); begin != end; begin++)
246 lldb::TypeCategoryImplSP category = *begin;
247 ConstString type = ConstString(category->GetName());
248 if (!callback(param, category))
253 // loop through disabled categories in just any order
255 MapIterator pos, end = m_map.end();
256 for (pos = m_map.begin(); pos != end; pos++)
258 if (pos->second->IsEnabled())
260 KeyType type = pos->first;
261 if (!callback(param, pos->second))
269 TypeCategoryMap::GetAtIndex (uint32_t index)
271 Mutex::Locker locker(m_map_mutex);
273 if (index < m_map.size())
275 MapIterator pos, end = m_map.end();
276 for (pos = m_map.begin(); pos != end; pos++)
284 return TypeCategoryImplSP();