aboutsummaryrefslogtreecommitdiff
path: root/source/Symbol/TypeMap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Symbol/TypeMap.cpp')
-rw-r--r--source/Symbol/TypeMap.cpp382
1 files changed, 163 insertions, 219 deletions
diff --git a/source/Symbol/TypeMap.cpp b/source/Symbol/TypeMap.cpp
index 6dc22ccbda96..21eb611e7b86 100644
--- a/source/Symbol/TypeMap.cpp
+++ b/source/Symbol/TypeMap.cpp
@@ -7,7 +7,6 @@
//
//===----------------------------------------------------------------------===//
-
// C Includes
// C++ Includes
#include <vector>
@@ -38,50 +37,39 @@ using namespace lldb;
using namespace lldb_private;
using namespace clang;
-TypeMap::TypeMap() :
- m_types ()
-{
-}
+TypeMap::TypeMap() : m_types() {}
//----------------------------------------------------------------------
// Destructor
//----------------------------------------------------------------------
-TypeMap::~TypeMap()
-{
-}
+TypeMap::~TypeMap() {}
-void
-TypeMap::Insert (const TypeSP& type_sp)
-{
- // Just push each type on the back for now. We will worry about uniquing later
- if (type_sp)
- m_types.insert(std::make_pair(type_sp->GetID(), type_sp));
+void TypeMap::Insert(const TypeSP &type_sp) {
+ // Just push each type on the back for now. We will worry about uniquing later
+ if (type_sp)
+ m_types.insert(std::make_pair(type_sp->GetID(), type_sp));
}
+bool TypeMap::InsertUnique(const TypeSP &type_sp) {
+ if (type_sp) {
+ user_id_t type_uid = type_sp->GetID();
+ iterator pos, end = m_types.end();
-bool
-TypeMap::InsertUnique (const TypeSP& type_sp)
-{
- if (type_sp)
- {
- user_id_t type_uid = type_sp->GetID();
- iterator pos, end = m_types.end();
-
- for (pos = m_types.find(type_uid); pos != end && pos->second->GetID() == type_uid; ++pos)
- {
- if (pos->second.get() == type_sp.get())
- return false;
- }
- Insert (type_sp);
+ for (pos = m_types.find(type_uid);
+ pos != end && pos->second->GetID() == type_uid; ++pos) {
+ if (pos->second.get() == type_sp.get())
+ return false;
}
- return true;
+ Insert(type_sp);
+ }
+ return true;
}
//----------------------------------------------------------------------
// Find a base type by its unique ID.
//----------------------------------------------------------------------
-//TypeSP
-//TypeMap::FindType(lldb::user_id_t uid)
+// TypeSP
+// TypeMap::FindType(lldb::user_id_t uid)
//{
// iterator pos = m_types.find(uid);
// if (pos != m_types.end())
@@ -92,8 +80,8 @@ TypeMap::InsertUnique (const TypeSP& type_sp)
//----------------------------------------------------------------------
// Find a type by name.
//----------------------------------------------------------------------
-//TypeMap
-//TypeMap::FindTypes (const ConstString &name)
+// TypeMap
+// TypeMap::FindTypes (const ConstString &name)
//{
// // Do we ever need to make a lookup by name map? Here we are doing
// // a linear search which isn't going to be fast.
@@ -105,218 +93,174 @@ TypeMap::InsertUnique (const TypeSP& type_sp)
// return types;
//}
-void
-TypeMap::Clear()
-{
- m_types.clear();
-}
+void TypeMap::Clear() { m_types.clear(); }
-uint32_t
-TypeMap::GetSize() const
-{
- return m_types.size();
-}
+uint32_t TypeMap::GetSize() const { return m_types.size(); }
-bool
-TypeMap::Empty() const
-{
- return m_types.empty();
-}
+bool TypeMap::Empty() const { return m_types.empty(); }
// GetTypeAtIndex isn't used a lot for large type lists, currently only for
// type lists that are returned for "image dump -t TYPENAME" commands and other
// simple symbol queries that grab the first result...
-TypeSP
-TypeMap::GetTypeAtIndex(uint32_t idx)
-{
- iterator pos, end;
- uint32_t i = idx;
- for (pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)
- {
- if (i == 0)
- return pos->second;
- --i;
- }
- return TypeSP();
+TypeSP TypeMap::GetTypeAtIndex(uint32_t idx) {
+ iterator pos, end;
+ uint32_t i = idx;
+ for (pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) {
+ if (i == 0)
+ return pos->second;
+ --i;
+ }
+ return TypeSP();
}
-void
-TypeMap::ForEach (std::function <bool(const lldb::TypeSP &type_sp)> const &callback) const
-{
- for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)
- {
- if (!callback(pos->second))
- break;
- }
+void TypeMap::ForEach(
+ std::function<bool(const lldb::TypeSP &type_sp)> const &callback) const {
+ for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) {
+ if (!callback(pos->second))
+ break;
+ }
}
-void
-TypeMap::ForEach (std::function <bool(lldb::TypeSP &type_sp)> const &callback)
-{
- for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)
- {
- if (!callback(pos->second))
- break;
- }
+void TypeMap::ForEach(
+ std::function<bool(lldb::TypeSP &type_sp)> const &callback) {
+ for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) {
+ if (!callback(pos->second))
+ break;
+ }
}
-bool
-TypeMap::Remove (const lldb::TypeSP &type_sp)
-{
- if (type_sp)
- {
- lldb::user_id_t uid = type_sp->GetID();
- for (iterator pos = m_types.find(uid), end = m_types.end(); pos != end && pos->first == uid; ++pos)
- {
- if (pos->second == type_sp)
- {
- m_types.erase(pos);
- return true;
- }
- }
+bool TypeMap::Remove(const lldb::TypeSP &type_sp) {
+ if (type_sp) {
+ lldb::user_id_t uid = type_sp->GetID();
+ for (iterator pos = m_types.find(uid), end = m_types.end();
+ pos != end && pos->first == uid; ++pos) {
+ if (pos->second == type_sp) {
+ m_types.erase(pos);
+ return true;
+ }
}
- return false;
+ }
+ return false;
}
-void
-TypeMap::Dump(Stream *s, bool show_context)
-{
- for (iterator pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)
- {
- pos->second->Dump(s, show_context);
- }
+void TypeMap::Dump(Stream *s, bool show_context) {
+ for (iterator pos = m_types.begin(), end = m_types.end(); pos != end; ++pos) {
+ pos->second->Dump(s, show_context);
+ }
}
-void
-TypeMap::RemoveMismatchedTypes (const char *qualified_typename,
- bool exact_match)
-{
- std::string type_scope;
- std::string type_basename;
- TypeClass type_class = eTypeClassAny;
- if (!Type::GetTypeScopeAndBasename (qualified_typename, type_scope, type_basename, type_class))
- {
- type_basename = qualified_typename;
- type_scope.clear();
- }
- return RemoveMismatchedTypes (type_scope, type_basename, type_class, exact_match);
+void TypeMap::RemoveMismatchedTypes(const char *qualified_typename,
+ bool exact_match) {
+ std::string type_scope;
+ std::string type_basename;
+ TypeClass type_class = eTypeClassAny;
+ if (!Type::GetTypeScopeAndBasename(qualified_typename, type_scope,
+ type_basename, type_class)) {
+ type_basename = qualified_typename;
+ type_scope.clear();
+ }
+ return RemoveMismatchedTypes(type_scope, type_basename, type_class,
+ exact_match);
}
-void
-TypeMap::RemoveMismatchedTypes (const std::string &type_scope,
- const std::string &type_basename,
- TypeClass type_class,
- bool exact_match)
-{
- // Our "collection" type currently is a std::map which doesn't
- // have any good way to iterate and remove items from the map
- // so we currently just make a new list and add all of the matching
- // types to it, and then swap it into m_types at the end
- collection matching_types;
+void TypeMap::RemoveMismatchedTypes(const std::string &type_scope,
+ const std::string &type_basename,
+ TypeClass type_class, bool exact_match) {
+ // Our "collection" type currently is a std::map which doesn't
+ // have any good way to iterate and remove items from the map
+ // so we currently just make a new list and add all of the matching
+ // types to it, and then swap it into m_types at the end
+ collection matching_types;
- iterator pos, end = m_types.end();
-
- for (pos = m_types.begin(); pos != end; ++pos)
- {
- Type* the_type = pos->second.get();
- bool keep_match = false;
- TypeClass match_type_class = eTypeClassAny;
-
- if (type_class != eTypeClassAny)
- {
- match_type_class = the_type->GetForwardCompilerType ().GetTypeClass ();
- if ((match_type_class & type_class) == 0)
- continue;
- }
+ iterator pos, end = m_types.end();
- ConstString match_type_name_const_str (the_type->GetQualifiedName());
- if (match_type_name_const_str)
- {
- const char *match_type_name = match_type_name_const_str.GetCString();
- std::string match_type_scope;
- std::string match_type_basename;
- if (Type::GetTypeScopeAndBasename (match_type_name,
- match_type_scope,
- match_type_basename,
- match_type_class))
- {
- if (match_type_basename == type_basename)
- {
- const size_t type_scope_size = type_scope.size();
- const size_t match_type_scope_size = match_type_scope.size();
- if (exact_match || (type_scope_size == match_type_scope_size))
- {
- keep_match = match_type_scope == type_scope;
- }
- else
- {
- if (match_type_scope_size > type_scope_size)
- {
- const size_t type_scope_pos = match_type_scope.rfind(type_scope);
- if (type_scope_pos == match_type_scope_size - type_scope_size)
- {
- if (type_scope_pos >= 2)
- {
- // Our match scope ends with the type scope we were looking for,
- // but we need to make sure what comes before the matching
- // type scope is a namespace boundary in case we are trying to match:
- // type_basename = "d"
- // type_scope = "b::c::"
- // We want to match:
- // match_type_scope "a::b::c::"
- // But not:
- // match_type_scope "a::bb::c::"
- // So below we make sure what comes before "b::c::" in match_type_scope
- // is "::", or the namespace boundary
- if (match_type_scope[type_scope_pos - 1] == ':' &&
- match_type_scope[type_scope_pos - 2] == ':')
- {
- keep_match = true;
- }
- }
- }
- }
- }
+ for (pos = m_types.begin(); pos != end; ++pos) {
+ Type *the_type = pos->second.get();
+ bool keep_match = false;
+ TypeClass match_type_class = eTypeClassAny;
+
+ if (type_class != eTypeClassAny) {
+ match_type_class = the_type->GetForwardCompilerType().GetTypeClass();
+ if ((match_type_class & type_class) == 0)
+ continue;
+ }
+
+ ConstString match_type_name_const_str(the_type->GetQualifiedName());
+ if (match_type_name_const_str) {
+ const char *match_type_name = match_type_name_const_str.GetCString();
+ std::string match_type_scope;
+ std::string match_type_basename;
+ if (Type::GetTypeScopeAndBasename(match_type_name, match_type_scope,
+ match_type_basename,
+ match_type_class)) {
+ if (match_type_basename == type_basename) {
+ const size_t type_scope_size = type_scope.size();
+ const size_t match_type_scope_size = match_type_scope.size();
+ if (exact_match || (type_scope_size == match_type_scope_size)) {
+ keep_match = match_type_scope == type_scope;
+ } else {
+ if (match_type_scope_size > type_scope_size) {
+ const size_t type_scope_pos = match_type_scope.rfind(type_scope);
+ if (type_scope_pos == match_type_scope_size - type_scope_size) {
+ if (type_scope_pos >= 2) {
+ // Our match scope ends with the type scope we were looking
+ // for,
+ // but we need to make sure what comes before the matching
+ // type scope is a namespace boundary in case we are trying to
+ // match:
+ // type_basename = "d"
+ // type_scope = "b::c::"
+ // We want to match:
+ // match_type_scope "a::b::c::"
+ // But not:
+ // match_type_scope "a::bb::c::"
+ // So below we make sure what comes before "b::c::" in
+ // match_type_scope
+ // is "::", or the namespace boundary
+ if (match_type_scope[type_scope_pos - 1] == ':' &&
+ match_type_scope[type_scope_pos - 2] == ':') {
+ keep_match = true;
+ }
}
+ }
}
- else
- {
- // The type we are currently looking at doesn't exists
- // in a namespace or class, so it only matches if there
- // is no type scope...
- keep_match = type_scope.empty() && type_basename.compare(match_type_name) == 0;
- }
- }
-
- if (keep_match)
- {
- matching_types.insert (*pos);
+ }
}
+ } else {
+ // The type we are currently looking at doesn't exists
+ // in a namespace or class, so it only matches if there
+ // is no type scope...
+ keep_match =
+ type_scope.empty() && type_basename.compare(match_type_name) == 0;
+ }
}
- m_types.swap(matching_types);
-}
-void
-TypeMap::RemoveMismatchedTypes (TypeClass type_class)
-{
- if (type_class == eTypeClassAny)
- return;
-
- // Our "collection" type currently is a std::map which doesn't
- // have any good way to iterate and remove items from the map
- // so we currently just make a new list and add all of the matching
- // types to it, and then swap it into m_types at the end
- collection matching_types;
-
- iterator pos, end = m_types.end();
-
- for (pos = m_types.begin(); pos != end; ++pos)
- {
- Type* the_type = pos->second.get();
- TypeClass match_type_class = the_type->GetForwardCompilerType ().GetTypeClass ();
- if (match_type_class & type_class)
- matching_types.insert (*pos);
+ if (keep_match) {
+ matching_types.insert(*pos);
}
- m_types.swap(matching_types);
+ }
+ m_types.swap(matching_types);
+}
+
+void TypeMap::RemoveMismatchedTypes(TypeClass type_class) {
+ if (type_class == eTypeClassAny)
+ return;
+
+ // Our "collection" type currently is a std::map which doesn't
+ // have any good way to iterate and remove items from the map
+ // so we currently just make a new list and add all of the matching
+ // types to it, and then swap it into m_types at the end
+ collection matching_types;
+
+ iterator pos, end = m_types.end();
+
+ for (pos = m_types.begin(); pos != end; ++pos) {
+ Type *the_type = pos->second.get();
+ TypeClass match_type_class =
+ the_type->GetForwardCompilerType().GetTypeClass();
+ if (match_type_class & type_class)
+ matching_types.insert(*pos);
+ }
+ m_types.swap(matching_types);
}