diff options
Diffstat (limited to 'source/Symbol/VariableList.cpp')
-rw-r--r-- | source/Symbol/VariableList.cpp | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/source/Symbol/VariableList.cpp b/source/Symbol/VariableList.cpp new file mode 100644 index 000000000000..3451166e52d4 --- /dev/null +++ b/source/Symbol/VariableList.cpp @@ -0,0 +1,201 @@ +//===-- VariableList.cpp ----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Symbol/VariableList.h" + +#include "lldb/Core/RegularExpression.h" +#include "lldb/Symbol/Block.h" +#include "lldb/Symbol/Function.h" +#include "lldb/Symbol/CompileUnit.h" + +using namespace lldb; +using namespace lldb_private; + +//---------------------------------------------------------------------- +// VariableList constructor +//---------------------------------------------------------------------- +VariableList::VariableList() : + m_variables() +{ +} + +//---------------------------------------------------------------------- +// Destructor +//---------------------------------------------------------------------- +VariableList::~VariableList() +{ +} + +void +VariableList::AddVariable(const VariableSP &var_sp) +{ + m_variables.push_back(var_sp); +} + +bool +VariableList::AddVariableIfUnique (const lldb::VariableSP &var_sp) +{ + if (FindVariableIndex (var_sp) == UINT32_MAX) + { + m_variables.push_back(var_sp); + return true; + } + return false; +} + +void +VariableList::AddVariables(VariableList *variable_list) +{ + if (variable_list) + { + std::copy(variable_list->m_variables.begin(), // source begin + variable_list->m_variables.end(), // source end + back_inserter(m_variables)); // destination + } +} + +void +VariableList::Clear() +{ + m_variables.clear(); +} + +VariableSP +VariableList::GetVariableAtIndex(size_t idx) const +{ + VariableSP var_sp; + if (idx < m_variables.size()) + var_sp = m_variables[idx]; + return var_sp; +} + +VariableSP +VariableList::RemoveVariableAtIndex(size_t idx) +{ + VariableSP var_sp; + if (idx < m_variables.size()) + { + var_sp = m_variables[idx]; + m_variables.erase (m_variables.begin() + idx); + } + return var_sp; +} + +uint32_t +VariableList::FindVariableIndex (const VariableSP &var_sp) +{ + iterator pos, end = m_variables.end(); + for (pos = m_variables.begin(); pos != end; ++pos) + { + if (pos->get() == var_sp.get()) + return std::distance (m_variables.begin(), pos); + } + return UINT32_MAX; +} + +VariableSP +VariableList::FindVariable(const ConstString& name) +{ + VariableSP var_sp; + iterator pos, end = m_variables.end(); + for (pos = m_variables.begin(); pos != end; ++pos) + { + if ((*pos)->NameMatches(name)) + { + var_sp = (*pos); + break; + } + } + return var_sp; +} + +size_t +VariableList::AppendVariablesIfUnique (const RegularExpression& regex, VariableList &var_list, size_t& total_matches) +{ + const size_t initial_size = var_list.GetSize(); + iterator pos, end = m_variables.end(); + for (pos = m_variables.begin(); pos != end; ++pos) + { + if ((*pos)->NameMatches (regex)) + { + // Note the total matches found + total_matches++; + // Only add this variable if it isn't already in the "var_list" + var_list.AddVariableIfUnique (*pos); + } + } + // Return the number of new unique variables added to "var_list" + return var_list.GetSize() - initial_size; +} + +size_t +VariableList::AppendVariablesWithScope (lldb::ValueType type, + VariableList &var_list, + bool if_unique) +{ + const size_t initial_size = var_list.GetSize(); + iterator pos, end = m_variables.end(); + for (pos = m_variables.begin(); pos != end; ++pos) + { + if ((*pos)->GetScope() == type) + { + if (if_unique) + var_list.AddVariableIfUnique (*pos); + else + var_list.AddVariable(*pos); + } + } + // Return the number of new unique variables added to "var_list" + return var_list.GetSize() - initial_size; +} + +uint32_t +VariableList::FindIndexForVariable (Variable* variable) +{ + VariableSP var_sp; + iterator pos; + const iterator begin = m_variables.begin(); + const iterator end = m_variables.end(); + for (pos = m_variables.begin(); pos != end; ++pos) + { + if ((*pos).get() == variable) + return std::distance (begin, pos); + } + return UINT32_MAX; +} + +size_t +VariableList::MemorySize() const +{ + size_t mem_size = sizeof(VariableList); + const_iterator pos, end = m_variables.end(); + for (pos = m_variables.begin(); pos != end; ++pos) + mem_size += (*pos)->MemorySize(); + return mem_size; +} + +size_t +VariableList::GetSize() const +{ + return m_variables.size(); +} + +void +VariableList::Dump(Stream *s, bool show_context) const +{ +// s.Printf("%.*p: ", (int)sizeof(void*) * 2, this); +// s.Indent(); +// s << "VariableList\n"; + + const_iterator pos, end = m_variables.end(); + for (pos = m_variables.begin(); pos != end; ++pos) + { + (*pos)->Dump(s, show_context); + } +} |