summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2019-07-15 22:04:10 -0400
committerPeter LaFosse <peter@vector35.com>2019-07-15 22:04:10 -0400
commit0082df357b828d85b34901381928d3b9025ee8f4 (patch)
tree11af4aede1d2a8e2422ed8572f74fe41c3877fef
parent8aaa6ab73566c69aad61ebeb8adfe5c40929b956 (diff)
Add move constructors and name caching for performance when sorting large symbol sets
-rw-r--r--ui/symbollist.h50
1 files changed, 37 insertions, 13 deletions
diff --git a/ui/symbollist.h b/ui/symbollist.h
index da68fd06..b7e48aa9 100644
--- a/ui/symbollist.h
+++ b/ui/symbollist.h
@@ -34,25 +34,43 @@ public:
{
SymbolRef sym;
std::string archName;
- NamedObject() : sym(nullptr), archName(emptyArch) {}
- NamedObject(SymbolRef s, std::string& a=emptyArch) : sym(s), archName(a) {}
+ mutable std::string name;
+ mutable bool named;
+ NamedObject() : sym(nullptr), archName(emptyArch), named(false) {}
+ NamedObject(SymbolRef s, std::string& a=emptyArch) : sym(s), archName(a), named(false) {}
NamedObject(const NamedObject& n)
{
sym = n.sym;
archName = n.archName;
+ named = n.named;
+ name = n.name;
}
- // NamedObject(const NamedObject&& n)
- // {
- // sym = std::move(n.sym);
- // archName = std::move(n.archName);
- // }
+ NamedObject(const NamedObject&& n)
+ {
+ sym = std::move(n.sym);
+ archName = std::move(n.archName);
+ name = std::move(n.name);
+ named = n.named;
+ }
+
+ NamedObject& operator=(const NamedObject&& n)
+ {
+ sym = std::move(n.sym);
+ archName = std::move(n.archName);
+ name = std::move(n.name);
+ named = n.named;
+ return *this;
+ }
- // NamedObject& operation=(const NamedObject&& n)
- // {
- // sym = std::move(n.sym);
- // archName = std::move(n.archName);
- // }
+ NamedObject& operator=(const NamedObject& n)
+ {
+ sym = n.sym;
+ archName = n.archName;
+ name = n.name;
+ named = n.named;
+ return *this;
+ }
bool operator<(const NamedObject& other) const
{
@@ -80,7 +98,13 @@ public:
bool isFunc() const { return sym->GetType() == FunctionSymbol; }
uint64_t getStart() const { return sym->GetAddress(); }
- std::string getName() const { return sym->GetFullName(); }
+ std::string getName() const {
+ if (named)
+ return name;
+ name = sym->GetFullName();
+ named = true;
+ return name;
+ }
BNSymbolType getType() const { return sym->GetType(); }
};