diff --git a/src/api/sorting/plugin_graph.cpp b/src/api/sorting/plugin_graph.cpp index 2f452047..be0eb70f 100644 --- a/src/api/sorting/plugin_graph.cpp +++ b/src/api/sorting/plugin_graph.cpp @@ -591,6 +591,15 @@ void PathsCache::CachePath(const vertex_t& fromVertex, } #if _WIN32 +const std::wstring& WideStringsCache::Get(const std::string& narrowString) { + auto vertexNameIt = wideStringsCache_.find(narrowString); + if (vertexNameIt == wideStringsCache_.end()) { + throw std::invalid_argument("Given string was not already cached"); + } + + return vertexNameIt->second; +} + const std::wstring& WideStringsCache::GetOrInsert( const std::string& narrowString) { auto vertexNameIt = wideStringsCache_.find(narrowString); @@ -601,6 +610,12 @@ const std::wstring& WideStringsCache::GetOrInsert( return vertexNameIt->second; } + +void WideStringsCache::Insert(const std::string& narrowString) { + if (!wideStringsCache_.contains(narrowString)) { + wideStringsCache_.emplace(narrowString, ToWinWide(narrowString)); + } +} #endif size_t PluginGraph::CountVertices() const { @@ -615,9 +630,10 @@ std::optional PluginGraph::GetVertexByName( const std::string& name) const { for (const auto& vertex : boost::make_iterator_range(GetVertices())) { #if _WIN32 - auto& wideVertexName = - wideStringCache_.GetOrInsert(GetPlugin(vertex).GetName()); + const auto& vertexName = GetPlugin(vertex).GetName(); + wideStringCache_.Insert(vertexName); auto& wideName = wideStringCache_.GetOrInsert(name); + auto& wideVertexName = wideStringCache_.Get(vertexName); int comparison = CompareFilenames(wideVertexName, wideName); #else diff --git a/src/api/sorting/plugin_graph.h b/src/api/sorting/plugin_graph.h index da1dc6a7..5e561767 100644 --- a/src/api/sorting/plugin_graph.h +++ b/src/api/sorting/plugin_graph.h @@ -61,10 +61,12 @@ private: #if _WIN32 class WideStringsCache { public: + void Insert(const std::string& narrowString); + const std::wstring& Get(const std::string& narrowString); const std::wstring& GetOrInsert(const std::string& narrowString); private: - std::unordered_map wideStringsCache_; + boost::unordered_flat_map wideStringsCache_; }; #endif