From 0082df357b828d85b34901381928d3b9025ee8f4 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Mon, 15 Jul 2019 22:04:10 -0400 Subject: Add move constructors and name caching for performance when sorting large symbol sets --- ui/symbollist.h | 50 +++++++++++++++++++++++++++++++++++++------------- 1 file 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(); } }; -- cgit v1.3.1