[Bf-blender-cvs] [238059ac2a6] functions: store network more compactly

Jacques Lucke noreply at git.blender.org
Sat Jan 18 20:17:33 CET 2020


Commit: 238059ac2a6652f19a8bda0b699c3c9ccb54d637
Author: Jacques Lucke
Date:   Sat Jan 11 15:51:06 2020 +0100
Branches: functions
https://developer.blender.org/rB238059ac2a6652f19a8bda0b699c3c9ccb54d637

store network more compactly

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

M	source/blender/blenlib/BLI_monotonic_allocator.h
M	source/blender/functions/FN_multi_function_network.h
M	source/blender/functions/intern/multi_function_network.cc

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

diff --git a/source/blender/blenlib/BLI_monotonic_allocator.h b/source/blender/blenlib/BLI_monotonic_allocator.h
index 6856f417d1c..5627912f985 100644
--- a/source/blender/blenlib/BLI_monotonic_allocator.h
+++ b/source/blender/blenlib/BLI_monotonic_allocator.h
@@ -122,7 +122,7 @@ class MonotonicAllocator : NonCopyable, NonMovable {
     return pointers;
   }
 
-  template<typename T> MutableArrayRef<T> allocate_array_copy(ArrayRef<T> source)
+  template<typename T> MutableArrayRef<T> construct_array_copy(ArrayRef<T> source)
   {
     T *buffer = (T *)this->allocate(source.byte_size(), alignof(T));
     source.copy_to(buffer);
diff --git a/source/blender/functions/FN_multi_function_network.h b/source/blender/functions/FN_multi_function_network.h
index 09442bd8269..de4487cc3f4 100644
--- a/source/blender/functions/FN_multi_function_network.h
+++ b/source/blender/functions/FN_multi_function_network.h
@@ -190,8 +190,8 @@ class MFNetwork;
 class MFNode : BLI::NonCopyable, BLI::NonMovable {
  private:
   MFNetwork *m_network;
-  Vector<MFInputSocket *> m_inputs;
-  Vector<MFOutputSocket *> m_outputs;
+  ArrayRef<MFInputSocket *> m_inputs;
+  ArrayRef<MFOutputSocket *> m_outputs;
   bool m_is_dummy;
   uint m_id;
 
@@ -220,8 +220,8 @@ class MFNode : BLI::NonCopyable, BLI::NonMovable {
 class MFFunctionNode final : public MFNode {
  private:
   const MultiFunction *m_function;
-  Vector<uint> m_input_param_indices;
-  Vector<uint> m_output_param_indices;
+  ArrayRef<uint> m_input_param_indices;
+  ArrayRef<uint> m_output_param_indices;
 
   friend MFNetwork;
 
@@ -238,8 +238,8 @@ class MFFunctionNode final : public MFNode {
 class MFDummyNode final : public MFNode {
  private:
   StringRefNull m_name;
-  Vector<StringRefNull> m_input_names;
-  Vector<StringRefNull> m_output_names;
+  MutableArrayRef<StringRefNull> m_input_names;
+  MutableArrayRef<StringRefNull> m_output_names;
 
   friend MFNetwork;
 };
@@ -493,12 +493,12 @@ inline const MFNetwork &MFNode::network() const
 
 inline ArrayRef<const MFInputSocket *> MFNode::inputs() const
 {
-  return m_inputs.as_ref();
+  return m_inputs;
 }
 
 inline ArrayRef<const MFOutputSocket *> MFNode::outputs() const
 {
-  return m_outputs.as_ref();
+  return m_outputs;
 }
 
 inline const MFInputSocket &MFNode::input(uint index) const
@@ -565,12 +565,12 @@ inline ArrayRef<uint> MFFunctionNode::output_param_indices() const
 
 inline const MFInputSocket &MFFunctionNode::input_for_param(uint param_index) const
 {
-  return this->input(m_input_param_indices.index(param_index));
+  return this->input(m_input_param_indices.first_index(param_index));
 }
 
 inline const MFOutputSocket &MFFunctionNode::output_for_param(uint param_index) const
 {
-  return this->output(m_output_param_indices.index(param_index));
+  return this->output(m_output_param_indices.first_index(param_index));
 }
 
 inline const MFNode &MFSocket::node() const
diff --git a/source/blender/functions/intern/multi_function_network.cc b/source/blender/functions/intern/multi_function_network.cc
index 0ebaa8dbc5d..f2579d2105b 100644
--- a/source/blender/functions/intern/multi_function_network.cc
+++ b/source/blender/functions/intern/multi_function_network.cc
@@ -71,8 +71,8 @@ MFBuilderFunctionNode &MFNetworkBuilder::add_function(const MultiFunction &funct
   node.m_network = this;
   node.m_is_dummy = false;
   node.m_function = &function;
-  node.m_input_param_indices = m_allocator.allocate_array_copy<uint>(input_param_indices);
-  node.m_output_param_indices = m_allocator.allocate_array_copy<uint>(output_param_indices);
+  node.m_input_param_indices = m_allocator.construct_array_copy<uint>(input_param_indices);
+  node.m_output_param_indices = m_allocator.construct_array_copy<uint>(output_param_indices);
 
   node.m_inputs = m_allocator.construct_elements_and_pointer_array<MFBuilderInputSocket>(
       input_param_indices.size());
@@ -259,71 +259,91 @@ MFNetwork::MFNetwork(MFNetworkBuilder &builder)
   ArrayRef<MFBuilderDummyNode *> builder_dummy_nodes = builder.dummy_nodes();
 
   for (MFBuilderFunctionNode *builder_node : builder_function_nodes) {
+    uint input_amount = builder_node->inputs().size();
+    uint output_amount = builder_node->outputs().size();
+
     MFFunctionNode &node = *m_allocator.construct<MFFunctionNode>().release();
 
     node.m_function = &builder_node->function();
     node.m_id = m_node_by_id.append_and_get_index(&node);
-    node.m_input_param_indices = builder_node->input_param_indices();
-    node.m_output_param_indices = builder_node->output_param_indices();
     node.m_network = this;
     node.m_is_dummy = false;
 
-    for (MFBuilderInputSocket *builder_socket : builder_node->inputs()) {
-      MFInputSocket &socket = *m_allocator.construct<MFInputSocket>().release();
+    node.m_input_param_indices = m_allocator.construct_array_copy(
+        builder_node->input_param_indices());
+    node.m_output_param_indices = m_allocator.construct_array_copy(
+        builder_node->output_param_indices());
+
+    node.m_inputs = m_allocator.construct_elements_and_pointer_array<MFInputSocket>(input_amount);
+    node.m_outputs = m_allocator.construct_elements_and_pointer_array<MFOutputSocket>(
+        output_amount);
+
+    for (uint i : IndexRange(input_amount)) {
+      MFBuilderInputSocket &builder_socket = builder_node->input(i);
+      MFInputSocket &socket = *node.m_inputs[i];
       socket.m_id = m_socket_by_id.append_and_get_index(&socket);
-      socket.m_index = builder_socket->index();
+      socket.m_index = i;
       socket.m_is_output = false;
       socket.m_node = &node;
-      socket.m_data_type = builder_socket->data_type();
+      socket.m_data_type = builder_socket.data_type();
 
       m_input_sockets.append(&socket);
-      node.m_inputs.append(&socket);
     }
-    for (MFBuilderOutputSocket *builder_socket : builder_node->outputs()) {
-      MFOutputSocket &socket = *m_allocator.construct<MFOutputSocket>().release();
+    for (uint i : IndexRange(output_amount)) {
+      MFBuilderOutputSocket &builder_socket = builder_node->output(i);
+      MFOutputSocket &socket = *node.m_outputs[i];
       socket.m_id = m_socket_by_id.append_and_get_index(&socket);
-      socket.m_index = builder_socket->index();
+      socket.m_index = i;
       socket.m_is_output = true;
       socket.m_node = &node;
-      socket.m_data_type = builder_socket->data_type();
+      socket.m_data_type = builder_socket.data_type();
 
       m_output_sockets.append(&socket);
-      node.m_outputs.append(&socket);
     }
 
     m_function_nodes.append(&node);
   }
 
   for (MFBuilderDummyNode *builder_node : builder_dummy_nodes) {
+    uint input_amount = builder_node->inputs().size();
+    uint output_amount = builder_node->outputs().size();
+
     MFDummyNode &node = *m_allocator.construct<MFDummyNode>().release();
 
     node.m_id = m_node_by_id.append_and_get_index(&node);
     node.m_network = this;
     node.m_is_dummy = true;
 
-    for (MFBuilderInputSocket *builder_socket : builder_node->inputs()) {
-      MFInputSocket &socket = *m_allocator.construct<MFInputSocket>().release();
+    node.m_inputs = m_allocator.construct_elements_and_pointer_array<MFInputSocket>(input_amount);
+    node.m_outputs = m_allocator.construct_elements_and_pointer_array<MFOutputSocket>(
+        output_amount);
+
+    node.m_input_names = m_allocator.allocate_array<StringRefNull>(input_amount);
+    node.m_output_names = m_allocator.allocate_array<StringRefNull>(output_amount);
+
+    for (uint i : IndexRange(input_amount)) {
+      MFBuilderInputSocket &builder_socket = builder_node->input(i);
+      MFInputSocket &socket = *node.m_inputs[i];
       socket.m_id = m_socket_by_id.append_and_get_index(&socket);
-      socket.m_index = builder_socket->index();
+      socket.m_index = i;
       socket.m_is_output = false;
       socket.m_node = &node;
-      socket.m_data_type = builder_socket->data_type();
+      socket.m_data_type = builder_socket.data_type();
 
       m_input_sockets.append(&socket);
-      node.m_inputs.append(&socket);
-      node.m_input_names.append(m_allocator.copy_string(builder_socket->name()));
+      node.m_input_names[i] = m_allocator.copy_string(builder_socket.name());
     }
-    for (MFBuilderOutputSocket *builder_socket : builder_node->outputs()) {
-      MFOutputSocket &socket = *m_allocator.construct<MFOutputSocket>().release();
+    for (uint i : IndexRange(output_amount)) {
+      MFBuilderOutputSocket &builder_socket = builder_node->output(i);
+      MFOutputSocket &socket = *node.m_outputs[i];
       socket.m_id = m_socket_by_id.append_and_get_index(&socket);
-      socket.m_index = builder_socket->index();
+      socket.m_index = i;
       socket.m_is_output = true;
       socket.m_node = &node;
-      socket.m_data_type = builder_socket->data_type();
+      socket.m_data_type = builder_socket.data_type();
 
       m_output_sockets.append(&socket);
-      node.m_outputs.append(&socket);
-      node.m_output_names.append(m_allocator.copy_string(builder_socket->name()));
+      node.m_output_names[i] = m_allocator.copy_string(builder_socket.name());
     }
 
     m_dummy_nodes.append(&node);



More information about the Bf-blender-cvs mailing list