[Bf-blender-cvs] [b7a8ef4b9f9] functions: replace IdMultiMap with more generic IndexToRefMultiMap

Jacques Lucke noreply at git.blender.org
Sat Jan 4 16:38:35 CET 2020


Commit: b7a8ef4b9f96bf97a9580111f13904060a62407e
Author: Jacques Lucke
Date:   Fri Jan 3 14:16:58 2020 +0100
Branches: functions
https://developer.blender.org/rBb7a8ef4b9f96bf97a9580111f13904060a62407e

replace IdMultiMap with more generic IndexToRefMultiMap

===================================================================

M	source/blender/blenlib/BLI_index_to_ref_map.h
M	source/blender/functions/FN_node_tree_multi_function_network.h
M	source/blender/functions/intern/node_tree_multi_function_network/builder.cc
M	source/blender/functions/intern/node_tree_multi_function_network/builder.h

===================================================================

diff --git a/source/blender/blenlib/BLI_index_to_ref_map.h b/source/blender/blenlib/BLI_index_to_ref_map.h
index e8e2d697a09..a4a6e514b0b 100644
--- a/source/blender/blenlib/BLI_index_to_ref_map.h
+++ b/source/blender/blenlib/BLI_index_to_ref_map.h
@@ -2,6 +2,7 @@
 #define __BLI_INDEX_TO_REF_MAP_H__
 
 #include "BLI_array_cxx.h"
+#include "BLI_multi_map.h"
 
 namespace BLI {
 
@@ -48,6 +49,68 @@ template<typename T, uint N = 4, typename Allocator = GuardedAllocator> class In
   }
 };
 
+#define IndexToRefMultiMap_UNMAPPED nullptr
+#define IndexToRefMultiMap_MULTIMAPPED ((T *)1)
+
+template<typename T, uint N = 4, typename Allocator = GuardedAllocator> class IndexToRefMultiMap {
+ private:
+  Array<T *> m_array;
+  MultiMap<uint, T *> m_fallback_multimap;
+
+ public:
+  IndexToRefMultiMap(uint size) : m_array(size, IndexToRefMultiMap_UNMAPPED)
+  {
+  }
+
+  bool contains(uint key) const
+  {
+    return m_array[key] != IndexToRefMultiMap_UNMAPPED;
+  }
+
+  ArrayRef<T *> lookup(uint key) const
+  {
+    T *const *stored_value_addr = &m_array[key];
+    const T *stored_value = *stored_value_addr;
+    if (stored_value == IndexToRefMultiMap_UNMAPPED) {
+      return {};
+    }
+    else if (stored_value == IndexToRefMultiMap_MULTIMAPPED) {
+      return m_fallback_multimap.lookup(key);
+    }
+    else {
+      return ArrayRef<T *>(stored_value_addr, 1);
+    }
+  }
+
+  T &lookup_single(uint key)
+  {
+    T *stored_value = m_array[key];
+    BLI_assert(stored_value != IndexToRefMultiMap_UNMAPPED &&
+               stored_value != IndexToRefMultiMap_MULTIMAPPED);
+    return *stored_value;
+  }
+
+  void add(uint key, T &value)
+  {
+    T **stored_value_addr = &m_array[key];
+    T *stored_value = *stored_value_addr;
+    if (stored_value == IndexToRefMultiMap_UNMAPPED) {
+      *stored_value_addr = &value;
+    }
+    else if (stored_value == IndexToRefMultiMap_MULTIMAPPED) {
+      m_fallback_multimap.add(key, &value);
+    }
+    else {
+      T *other_value = stored_value;
+      *stored_value_addr = IndexToRefMultiMap_MULTIMAPPED;
+      m_fallback_multimap.add_multiple_new(key, {other_value, &value});
+    }
+  }
+};
+
+#undef IndexToRefMultiMap_UNMAPPED
+#undef IndexToRefMultiMap_MULTIMAPPED
+
 }  // namespace BLI
 
 #endif /* __BLI_INDEX_TO_REF_MAP_H__ */
diff --git a/source/blender/functions/FN_node_tree_multi_function_network.h b/source/blender/functions/FN_node_tree_multi_function_network.h
index fb2519ff866..1bd33acd70c 100644
--- a/source/blender/functions/FN_node_tree_multi_function_network.h
+++ b/source/blender/functions/FN_node_tree_multi_function_network.h
@@ -13,68 +13,6 @@ namespace FN {
 using BLI::IndexToRefMap;
 using BLI::MultiMap;
 
-#define IdMultiMap_UNMAPPED UINT_MAX
-#define IdMultiMap_MULTIMAPPED (UINT_MAX - 1)
-
-class IdMultiMap {
- private:
-  Array<uint> m_single_mapping;
-  MultiMap<uint, uint> m_fallback_multimap;
-
- public:
-  IdMultiMap(uint max_key_id) : m_single_mapping(max_key_id, IdMultiMap_UNMAPPED)
-  {
-  }
-
-  bool contains(uint key_id) const
-  {
-    return m_single_mapping[key_id] != IdMultiMap_UNMAPPED;
-  }
-
-  ArrayRef<uint> lookup(uint key_id) const
-  {
-    const uint &stored_value = m_single_mapping[key_id];
-    switch (stored_value) {
-      case IdMultiMap_UNMAPPED: {
-        return {};
-      }
-      case IdMultiMap_MULTIMAPPED: {
-        return m_fallback_multimap.lookup(key_id);
-      }
-      default:
-        return ArrayRef<uint>(&stored_value, 1);
-    }
-  }
-
-  uint lookup_single(uint key_id) const
-  {
-    uint stored_value = m_single_mapping[key_id];
-    BLI_assert(stored_value != IdMultiMap_UNMAPPED && stored_value != IdMultiMap_MULTIMAPPED);
-    return stored_value;
-  }
-
-  void add(uint key_id, uint value_id)
-  {
-    uint &stored_value = m_single_mapping[key_id];
-    switch (stored_value) {
-      case IdMultiMap_UNMAPPED: {
-        stored_value = value_id;
-        break;
-      }
-      case IdMultiMap_MULTIMAPPED: {
-        m_fallback_multimap.add(key_id, value_id);
-        break;
-      }
-      default: {
-        uint other_value_id = stored_value;
-        stored_value = IdMultiMap_MULTIMAPPED;
-        m_fallback_multimap.add_multiple_new(key_id, {other_value_id, value_id});
-        break;
-      }
-    }
-  }
-};
-
 class InlinedTreeMFSocketMap {
  private:
   const FunctionNodeTree *m_function_tree;
diff --git a/source/blender/functions/intern/node_tree_multi_function_network/builder.cc b/source/blender/functions/intern/node_tree_multi_function_network/builder.cc
index f77e3e860cb..8ce3a721704 100644
--- a/source/blender/functions/intern/node_tree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/node_tree_multi_function_network/builder.cc
@@ -13,8 +13,8 @@ FunctionTreeMFNetworkBuilder::FunctionTreeMFNetworkBuilder(
       m_preprocessed_function_tree_data(preprocessed_function_tree_data),
       m_function_tree_mappings(function_tree_mappings),
       m_resources(resources),
-      m_socket_by_fsocket(function_tree.socket_count()),
-      m_socket_by_group_input(function_tree.all_group_inputs().size()),
+      m_sockets_by_fsocket_id(function_tree.socket_count()),
+      m_socket_by_group_input_id(function_tree.all_group_inputs().size()),
       m_builder(BLI::make_unique<MFNetworkBuilder>())
 {
 }
@@ -79,7 +79,7 @@ void FunctionTreeMFNetworkBuilder::map_data_sockets(const FNode &fnode, MFBuilde
   }
 }
 
-void FunctionTreeMFNetworkBuilder::assert_fnode_is_mapped_correctly(const FNode &fnode) const
+void FunctionTreeMFNetworkBuilder::assert_fnode_is_mapped_correctly(const FNode &fnode)
 {
   UNUSED_VARS_NDEBUG(fnode);
 #ifdef DEBUG
@@ -89,7 +89,7 @@ void FunctionTreeMFNetworkBuilder::assert_fnode_is_mapped_correctly(const FNode
 }
 
 void FunctionTreeMFNetworkBuilder::assert_data_sockets_are_mapped_correctly(
-    ArrayRef<const FSocket *> fsockets) const
+    ArrayRef<const FSocket *> fsockets)
 {
   for (const FSocket *fsocket : fsockets) {
     if (this->is_data_socket(*fsocket)) {
@@ -98,7 +98,7 @@ void FunctionTreeMFNetworkBuilder::assert_data_sockets_are_mapped_correctly(
   }
 }
 
-void FunctionTreeMFNetworkBuilder::assert_fsocket_is_mapped_correctly(const FSocket &fsocket) const
+void FunctionTreeMFNetworkBuilder::assert_fsocket_is_mapped_correctly(const FSocket &fsocket)
 {
   BLI_assert(this->fsocket_is_mapped(fsocket));
   MFDataType fsocket_type = this->try_get_data_type(fsocket).value();
@@ -204,22 +204,30 @@ std::unique_ptr<FunctionTreeMFNetwork> FunctionTreeMFNetworkBuilder::build()
 {
   // m_builder->to_dot__clipboard();
 
-  IndexToRefMap<const MFSocket> dummy_socket_by_fsocket_id(m_function_tree.socket_count());
-  IndexToRefMap<const FSocket> fsocket_by_dummy_socket_id(m_builder->sockets_by_id().size());
-
-  auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
-
-  for (const FSocket *fsocket : m_function_tree.all_sockets()) {
-    ArrayRef<uint> mapped_ids = m_socket_by_fsocket.lookup(fsocket->id());
-    for (uint mapped_id : mapped_ids) {
-      const MFSocket &socket = network->socket_by_id(mapped_id);
+  Vector<std::pair<uint, uint>> m_dummy_mappings;
+  for (uint fsocket_id : IndexRange(m_function_tree.socket_count())) {
+    ArrayRef<MFBuilderSocket *> mapped_sockets = m_sockets_by_fsocket_id.lookup(fsocket_id);
+    if (mapped_sockets.size() == 1) {
+      MFBuilderSocket &socket = *mapped_sockets[0];
       if (socket.node().is_dummy()) {
-        dummy_socket_by_fsocket_id.add_new(fsocket->id(), socket);
-        fsocket_by_dummy_socket_id.add_new(socket.id(), *fsocket);
+        m_dummy_mappings.append({fsocket_id, socket.id()});
       }
     }
   }
 
+  auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
+
+  IndexToRefMap<const MFSocket> dummy_socket_by_fsocket_id(m_function_tree.socket_count());
+  IndexToRefMap<const FSocket> fsocket_by_dummy_socket_id(network->socket_ids().size());
+
+  for (auto pair : m_dummy_mappings) {
+    const FSocket &fsocket = m_function_tree.socket_by_id(pair.first);
+    const MFSocket &socket = network->socket_by_id(pair.second);
+
+    dummy_socket_by_fsocket_id.add_new(pair.first, socket);
+    fsocket_by_dummy_socket_id.add_new(pair.second, fsocket);
+  }
+
   InlinedTreeMFSocketMap socket_map(m_function_tree,
                                     *network,
                                     std::move(dummy_socket_by_fsocket_id),
diff --git a/source/blender/functions/intern/node_tree_multi_function_network/builder.h b/source/blender/functions/intern/node_tree_multi_function_network/builder.h
index ad8ba56dded..164f1cf5aa6 100644
--- a/source/blender/functions/intern/node_tree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/node_tree_multi_function_network/builder.h
@@ -10,6 +10,7 @@
 namespace FN {
 
 using BKE::VSocket;
+using BLI::IndexToRefMultiMap;
 using BLI::MultiMap;
 
 class PreprocessedVTreeMFData {
@@ -64,8 +65,8 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
   const VTreeMultiFunctionMappings &m_function_tree_mappings;
   ResourceCollector &m_resources;
 
-  IdMultiMap m_socket_by_fsocket;
-  IndexToRefMap<MFBuilderOutputSocket> m_socket_by_group_input;
+  IndexToRefMultiMap<MFBuilderSocket> m_sockets_by_fsocket_id;
+  IndexToRefMap<MFBuilderOutputSocket> m_socket_by_group_input_id;
 
   std::unique_ptr<MFNetworkBuilder> m_builder;
 
@@ -146,12 +147,12 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
 
   void map_sockets(const FInputSocket &fsocket, MFBuilderInputSocket &socket)
   {
-    m_socket_by_fsocket.add(fsocket.id(), socket.id());
+    m_sockets_by_fsocket_id.add(fsocket.id(), socket);
   }
 
   void map_sockets(const FOutputSocket &fsocket, MFBuilderOutputSocket &socket)
   {
-    m_socket_by_fsocket.add(fsocket.id(), socket.id());
+    m_sockets_by_fsocket_id.add(fsocket.id(), socket);
   }
 
   void map_sockets(ArrayRef<const FInputSocket *> fsockets,
@@ -174,48 +175,38 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
 
   void map_group_input(const FGroupInput &group_input, MFBuilderOutputSocket &socket)
   {
-    m_socket_by_group_input.add_new(group_input.id(), socket);
+    m_socket_by_group_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list