summaryrefslogtreecommitdiff
path: root/view/sharedcache/ui/symboltable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'view/sharedcache/ui/symboltable.cpp')
-rw-r--r--view/sharedcache/ui/symboltable.cpp59
1 files changed, 33 insertions, 26 deletions
diff --git a/view/sharedcache/ui/symboltable.cpp b/view/sharedcache/ui/symboltable.cpp
index b0247f2b..e4c5dcd8 100644
--- a/view/sharedcache/ui/symboltable.cpp
+++ b/view/sharedcache/ui/symboltable.cpp
@@ -11,8 +11,9 @@ using namespace BinaryNinja;
using namespace SharedCacheAPI;
-SymbolTableModel::SymbolTableModel(SymbolTableView* parent)
- : QAbstractTableModel(parent), m_parent(parent) {
+SymbolTableModel::SymbolTableModel(SymbolTableView* parent) :
+ QAbstractTableModel(parent), m_parent(parent), m_displaySymbols(&m_symbols)
+{
// TODO: Need to implement updating this font if it is changed by the user
m_font = getMonospaceFont(parent);
}
@@ -20,7 +21,7 @@ SymbolTableModel::SymbolTableModel(SymbolTableView* parent)
int SymbolTableModel::rowCount(const QModelIndex& parent) const {
Q_UNUSED(parent);
- return static_cast<int>(m_modelSymbols.size());
+ return static_cast<int>(m_displaySymbols->size());
}
@@ -111,30 +112,28 @@ void SymbolTableModel::sort(int column, Qt::SortOrder order)
if (order == Qt::DescendingOrder)
{
- std::sort(m_modelSymbols.begin(), m_modelSymbols.end(),
- [&comparator](const CacheSymbol& a, const CacheSymbol& b) {
- return comparator(b, a);
- });
+ std::sort(m_displaySymbols->begin(), m_displaySymbols->end(),
+ [&comparator](const CacheSymbol& a, const CacheSymbol& b) { return comparator(b, a); });
}
else
{
- std::sort(m_modelSymbols.begin(), m_modelSymbols.end(), comparator);
+ std::sort(m_displaySymbols->begin(), m_displaySymbols->end(), comparator);
}
endResetModel();
}
-void SymbolTableModel::updateSymbols(std::vector<CacheSymbol>&& symbols)
+void SymbolTableModel::updateSymbols(std::vector<CacheSymbol> symbols)
{
- m_preparedSymbols = symbols;
+ m_symbols = std::move(symbols);
setFilter(m_filter);
}
const CacheSymbol& SymbolTableModel::symbolAt(int row) const
{
- return m_modelSymbols.at(row);
+ return m_displaySymbols->at(row);
}
@@ -142,30 +141,40 @@ void SymbolTableModel::setFilter(std::string text)
{
beginResetModel();
- m_filter = text;
- m_modelSymbols = {};
+ m_filter = std::move(text);
// Skip filtering if no filter applied.
- if (!m_filter.empty())
+ if (m_filter.empty())
{
- m_modelSymbols.reserve(m_preparedSymbols.size());
- for (const auto& symbol : m_preparedSymbols)
- if (((std::string_view)symbol.name).find(m_filter) != std::string::npos)
- m_modelSymbols.push_back(symbol);
- m_modelSymbols.shrink_to_fit();
+ m_filteredSymbols = {};
+ m_displaySymbols = &m_symbols;
}
else
{
- m_modelSymbols = m_preparedSymbols;
+ // Clear the filtered symbols while preserving the capacity
+ m_filteredSymbols.clear();
+
+ for (const auto& symbol : m_symbols)
+ {
+ if (symbol.name.find(m_filter) != std::string::npos)
+ m_filteredSymbols.push_back(symbol);
+ }
+
+ // If the filtered vector is using less than 25% of its capacity,
+ // shrink it to reduce memory usage.
+ if (m_filteredSymbols.size() < m_filteredSymbols.capacity() / 4)
+ m_filteredSymbols.shrink_to_fit();
+
+ m_displaySymbols = &m_filteredSymbols;
}
endResetModel();
}
-SymbolTableView::SymbolTableView(QWidget* parent)
- : QTableView(parent), m_model(new SymbolTableModel(this)) {
-
+SymbolTableView::SymbolTableView(QWidget* parent) :
+ QTableView(parent), m_model(new SymbolTableModel(this))
+{
// Set up the filter model
setModel(m_model);
@@ -181,9 +190,7 @@ SymbolTableView::SymbolTableView(QWidget* parent)
setSortingEnabled(true);
}
-SymbolTableView::~SymbolTableView() {
- delete m_model;
-}
+SymbolTableView::~SymbolTableView() = default;
void SymbolTableView::populateSymbols(BinaryView &view)
{