[Bf-blender-cvs] [ea9282cbd67] functions: extract class for managing the socket mapping

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


Commit: ea9282cbd67505a018894e03ef6b5327c94aedd8
Author: Jacques Lucke
Date:   Fri Jan 3 15:02:41 2020 +0100
Branches: functions
https://developer.blender.org/rBea9282cbd67505a018894e03ef6b5327c94aedd8

extract class for managing the socket mapping

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

M	source/blender/blenlib/BLI_index_to_ref_map.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
M	source/blender/functions/intern/node_tree_multi_function_network/generate.cc

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

diff --git a/source/blender/blenlib/BLI_index_to_ref_map.h b/source/blender/blenlib/BLI_index_to_ref_map.h
index a4a6e514b0b..8e4c11f830c 100644
--- a/source/blender/blenlib/BLI_index_to_ref_map.h
+++ b/source/blender/blenlib/BLI_index_to_ref_map.h
@@ -58,10 +58,15 @@ template<typename T, uint N = 4, typename Allocator = GuardedAllocator> class In
   MultiMap<uint, T *> m_fallback_multimap;
 
  public:
-  IndexToRefMultiMap(uint size) : m_array(size, IndexToRefMultiMap_UNMAPPED)
+  IndexToRefMultiMap(uint max_index) : m_array(max_index, IndexToRefMultiMap_UNMAPPED)
   {
   }
 
+  uint max_index() const
+  {
+    return m_array.size();
+  }
+
   bool contains(uint key) const
   {
     return m_array[key] != IndexToRefMultiMap_UNMAPPED;
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 cc7d6782ce2..91cd998eedb 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
@@ -9,15 +9,13 @@ FunctionTreeMFNetworkBuilder::FunctionTreeMFNetworkBuilder(
     const FSocketDataTypes &preprocessed_function_tree_data,
     const VTreeMultiFunctionMappings &function_tree_mappings,
     ResourceCollector &resources,
-    IndexToRefMultiMap<MFBuilderSocket> &sockets_by_fsocket_id,
-    IndexToRefMap<MFBuilderOutputSocket> &socket_by_group_input_id,
+    MFSocketByFSocketMapping &socket_map,
     MFNetworkBuilder &builder)
     : m_function_tree(function_tree),
       m_fsocket_data_types(preprocessed_function_tree_data),
       m_function_tree_mappings(function_tree_mappings),
       m_resources(resources),
-      m_sockets_by_fsocket_id(sockets_by_fsocket_id),
-      m_socket_by_group_input_id(socket_by_group_input_id),
+      m_socket_map(socket_map),
       m_builder(builder)
 {
 }
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 eda3d3f5342..4502cc0e7ab 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
@@ -58,6 +58,90 @@ class FSocketDataTypes {
   }
 };
 
+class MFSocketByFSocketMapping {
+ private:
+  IndexToRefMultiMap<MFBuilderSocket> m_sockets_by_fsocket_id;
+  IndexToRefMap<MFBuilderOutputSocket> m_socket_by_group_input_id;
+
+ public:
+  MFSocketByFSocketMapping(const FunctionNodeTree &function_tree)
+      : m_sockets_by_fsocket_id(function_tree.all_sockets().size()),
+        m_socket_by_group_input_id(function_tree.all_group_inputs().size())
+  {
+  }
+
+  const IndexToRefMultiMap<MFBuilderSocket> &sockets_by_fsocket_id() const
+  {
+    return m_sockets_by_fsocket_id;
+  }
+
+  void add(const FInputSocket &fsocket, MFBuilderInputSocket &socket)
+  {
+    m_sockets_by_fsocket_id.add(fsocket.id(), socket);
+  }
+
+  void add(const FOutputSocket &fsocket, MFBuilderOutputSocket &socket)
+  {
+    m_sockets_by_fsocket_id.add(fsocket.id(), socket);
+  }
+
+  void add(ArrayRef<const FInputSocket *> fsockets, ArrayRef<MFBuilderInputSocket *> sockets)
+  {
+    BLI_assert(fsockets.size() == sockets.size());
+    for (uint i : fsockets.index_range()) {
+      this->add(*fsockets[i], *sockets[i]);
+    }
+  }
+
+  void add(ArrayRef<const FOutputSocket *> fsockets, ArrayRef<MFBuilderOutputSocket *> sockets)
+  {
+    BLI_assert(fsockets.size() == sockets.size());
+    for (uint i : fsockets.index_range()) {
+      this->add(*fsockets[i], *sockets[i]);
+    }
+  }
+
+  void add(const FGroupInput &group_input, MFBuilderOutputSocket &socket)
+  {
+    m_socket_by_group_input_id.add_new(group_input.id(), socket);
+  }
+
+  MFBuilderOutputSocket &lookup(const FGroupInput &group_input)
+  {
+    return m_socket_by_group_input_id.lookup(group_input.id());
+  }
+
+  MFBuilderOutputSocket &lookup(const FOutputSocket &fsocket)
+  {
+    return m_sockets_by_fsocket_id.lookup_single(fsocket.id()).as_output();
+  }
+
+  ArrayRef<MFBuilderInputSocket *> lookup(const FInputSocket &fsocket)
+  {
+    return m_sockets_by_fsocket_id.lookup(fsocket.id()).cast<MFBuilderInputSocket *>();
+  }
+
+  bool is_mapped(const FSocket &fsocket) const
+  {
+    return m_sockets_by_fsocket_id.contains(fsocket.id());
+  }
+
+  Vector<std::pair<uint, uint>> get_dummy_mappings()
+  {
+    Vector<std::pair<uint, uint>> dummy_mappings;
+    for (uint fsocket_id : IndexRange(m_sockets_by_fsocket_id.max_index())) {
+      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_mappings.append({fsocket_id, socket.id()});
+        }
+      }
+    }
+    return dummy_mappings;
+  }
+};
+
 class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
  private:
   const FunctionNodeTree &m_function_tree;
@@ -65,9 +149,7 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
   const VTreeMultiFunctionMappings &m_function_tree_mappings;
   ResourceCollector &m_resources;
 
-  IndexToRefMultiMap<MFBuilderSocket> &m_sockets_by_fsocket_id;
-  IndexToRefMap<MFBuilderOutputSocket> &m_socket_by_group_input_id;
-
+  MFSocketByFSocketMapping &m_socket_map;
   MFNetworkBuilder &m_builder;
 
  public:
@@ -75,8 +157,7 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
                                const FSocketDataTypes &preprocessed_function_tree_data,
                                const VTreeMultiFunctionMappings &function_tree_mappings,
                                ResourceCollector &resources,
-                               IndexToRefMultiMap<MFBuilderSocket> &sockets_by_fsocket_id,
-                               IndexToRefMap<MFBuilderOutputSocket> &socket_by_group_input_id,
+                               MFSocketByFSocketMapping &socket_map,
                                MFNetworkBuilder &builder);
 
   const FunctionNodeTree &function_tree() const
@@ -150,45 +231,39 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
 
   void map_sockets(const FInputSocket &fsocket, MFBuilderInputSocket &socket)
   {
-    m_sockets_by_fsocket_id.add(fsocket.id(), socket);
+    m_socket_map.add(fsocket, socket);
   }
 
   void map_sockets(const FOutputSocket &fsocket, MFBuilderOutputSocket &socket)
   {
-    m_sockets_by_fsocket_id.add(fsocket.id(), socket);
+    m_socket_map.add(fsocket, socket);
   }
 
   void map_sockets(ArrayRef<const FInputSocket *> fsockets,
                    ArrayRef<MFBuilderInputSocket *> sockets)
   {
-    BLI_assert(fsockets.size() == sockets.size());
-    for (uint i : fsockets.index_range()) {
-      this->map_sockets(*fsockets[i], *sockets[i]);
-    }
+    m_socket_map.add(fsockets, sockets);
   }
 
   void map_sockets(ArrayRef<const FOutputSocket *> fsockets,
                    ArrayRef<MFBuilderOutputSocket *> sockets)
   {
-    BLI_assert(fsockets.size() == sockets.size());
-    for (uint i : fsockets.index_range()) {
-      this->map_sockets(*fsockets[i], *sockets[i]);
-    }
+    m_socket_map.add(fsockets, sockets);
   }
 
   void map_group_input(const FGroupInput &group_input, MFBuilderOutputSocket &socket)
   {
-    m_socket_by_group_input_id.add_new(group_input.id(), socket);
+    m_socket_map.add(group_input, socket);
   }
 
   MFBuilderOutputSocket &lookup_group_input(const FGroupInput &group_input)
   {
-    return m_socket_by_group_input_id.lookup(group_input.id());
+    return m_socket_map.lookup(group_input);
   }
 
   bool fsocket_is_mapped(const FSocket &fsocket) const
   {
-    return m_sockets_by_fsocket_id.contains(fsocket.id());
+    return m_socket_map.is_mapped(fsocket);
   }
 
   void assert_fnode_is_mapped_correctly(const FNode &fnode);
@@ -197,19 +272,14 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
 
   bool has_data_sockets(const FNode &fnode) const;
 
-  MFBuilderSocket &lookup_single_socket(const FSocket &fsocket)
-  {
-    return m_sockets_by_fsocket_id.lookup_single(fsocket.id());
-  }
-
   MFBuilderOutputSocket &lookup_socket(const FOutputSocket &fsocket)
   {
-    return this->lookup_single_socket(fsocket.as_base()).as_output();
+    return m_socket_map.lookup(fsocket);
   }
 
   ArrayRef<MFBuilderInputSocket *> lookup_socket(const FInputSocket &fsocket)
   {
-    return m_sockets_by_fsocket_id.lookup(fsocket.id()).cast<MFBuilderInputSocket *>();
+    return m_socket_map.lookup(fsocket);
   }
 
   const CPPType &cpp_type_by_name(StringRef name) const
diff --git a/source/blender/functions/intern/node_tree_multi_function_network/generate.cc b/source/blender/functions/intern/node_tree_multi_function_network/generate.cc
index 6e2b5e33317..f89297dad56 100644
--- a/source/blender/functions/intern/node_tree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/node_tree_multi_function_network/generate.cc
@@ -133,27 +133,16 @@ static bool insert_unlinked_inputs(FunctionTreeMFNetworkBuilder &builder,
 static std::unique_ptr<FunctionTreeMFNetwork> build(
     const FunctionNodeTree &function_tree,
     std::unique_ptr<MFNetworkBuilder> network_builder,
-    const IndexToRefMultiMap<MFBuilderSocket> &sockets_by_fsocket_id)
+    ArrayRef<std::pair<uint, uint>> dummy_mappings)
 {
   // m_builder.to_dot__clipboard();
 
-  Vector<std::pair<uint, uint>> m_dummy_mappings;
-  for (uint fsocket_id : IndexRange(function_tree.socket_count())) {
-    ArrayRef<MFBuilderSocket *> mapped_sockets = sockets_by_fsocket_id.lookup(fsocket_id);
-    if (mapped_sockets.size() == 1) {
-      MFBuilderSocket &socket = *mapped_sockets[0];
-      if (socket.node().is_dummy()) {
-        m_dummy_mappings.append({fsocket_id, socket.id()});
-      }
-    }
-  }
-
   auto network = BLI::make_unique<MFNetwork>(std::move(network_builder));
 
   IndexToRefMap<const MFSocket> dummy_socket_by_fsocket_id(function_tree.socket_count());
   IndexToRefMap<const FSocket> fsocket_by_dummy_socket_id(network->socket_ids(

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list