From b53c46d760568f02cd8be45547a4ffacad3c7b47 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 24 Jul 2020 12:15:13 +0200 Subject: BLI: add MultiValueMap This is a convenience wrapper for `Map>`. It does not provide any performance benefits (yet). I need this kind of map in a couple of places and before I was duplicating the lookup logic in many places. --- .../functions/intern/multi_function_network_optimization.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'source/blender/functions') diff --git a/source/blender/functions/intern/multi_function_network_optimization.cc b/source/blender/functions/intern/multi_function_network_optimization.cc index e8fd7afc2ee..af1e77aa355 100644 --- a/source/blender/functions/intern/multi_function_network_optimization.cc +++ b/source/blender/functions/intern/multi_function_network_optimization.cc @@ -28,6 +28,7 @@ #include "BLI_disjoint_set.hh" #include "BLI_ghash.h" #include "BLI_map.hh" +#include "BLI_multi_value_map.hh" #include "BLI_rand.h" #include "BLI_stack.hh" @@ -403,15 +404,15 @@ static Array compute_node_hashes(MFNetwork &network) return node_hashes; } -static Map> group_nodes_by_hash(MFNetwork &network, - Span node_hashes) +static MultiValueMap group_nodes_by_hash(MFNetwork &network, + Span node_hashes) { - Map> nodes_by_hash; + MultiValueMap nodes_by_hash; for (int id : IndexRange(network.node_id_amount())) { MFNode *node = network.node_or_null_by_id(id); if (node != nullptr) { uint64_t node_hash = node_hashes[id]; - nodes_by_hash.lookup_or_add_default(node_hash).append(node); + nodes_by_hash.add(node_hash, node); } } return nodes_by_hash; @@ -456,7 +457,7 @@ static bool nodes_output_same_values(DisjointSet &cache, const MFNode &a, const } static void relink_duplicate_nodes(MFNetwork &network, - Map> &nodes_by_hash) + MultiValueMap &nodes_by_hash) { DisjointSet same_node_cache{network.node_id_amount()}; @@ -494,7 +495,7 @@ static void relink_duplicate_nodes(MFNetwork &network, void common_subnetwork_elimination(MFNetwork &network) { Array node_hashes = compute_node_hashes(network); - Map> nodes_by_hash = group_nodes_by_hash(network, node_hashes); + MultiValueMap nodes_by_hash = group_nodes_by_hash(network, node_hashes); relink_duplicate_nodes(network, nodes_by_hash); } -- cgit v1.2.3