[Bf-blender-cvs] [bef3e0022cd] functions-experimental-refactor: use monotonic allocator for network builder

Jacques Lucke noreply at git.blender.org
Thu Nov 7 15:06:20 CET 2019


Commit: bef3e0022cdf27cb82455bb26a53f17fe65e9f3a
Author: Jacques Lucke
Date:   Thu Nov 7 13:38:51 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBbef3e0022cdf27cb82455bb26a53f17fe65e9f3a

use monotonic allocator for network builder

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

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

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

diff --git a/source/blender/functions/FN_multi_function_network.h b/source/blender/functions/FN_multi_function_network.h
index b8fe94c02eb..3935cb0ef3b 100644
--- a/source/blender/functions/FN_multi_function_network.h
+++ b/source/blender/functions/FN_multi_function_network.h
@@ -116,6 +116,8 @@ class MFBuilderOutputSocket : public MFBuilderSocket {
 
 class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
  private:
+  MonotonicAllocator<> m_allocator;
+
   Vector<MFBuilderNode *> m_node_by_id;
   Vector<MFBuilderSocket *> m_socket_by_id;
 
@@ -208,7 +210,7 @@ class MFNode : BLI::NonCopyable, BLI::NonMovable {
   const MFDummyNode &as_dummy() const;
 };
 
-class MFFunctionNode : public MFNode {
+class MFFunctionNode final : public MFNode {
  private:
   const MultiFunction *m_function;
   Vector<uint> m_input_param_indices;
@@ -223,7 +225,7 @@ class MFFunctionNode : public MFNode {
   ArrayRef<uint> output_param_indices() const;
 };
 
-class MFDummyNode : public MFNode {
+class MFDummyNode final : public MFNode {
 };
 
 class MFSocket : BLI::NonCopyable, BLI::NonMovable {
@@ -253,7 +255,7 @@ class MFSocket : BLI::NonCopyable, BLI::NonMovable {
   const MFOutputSocket &as_output() const;
 };
 
-class MFInputSocket : public MFSocket {
+class MFInputSocket final : public MFSocket {
  private:
   MFOutputSocket *m_origin;
 
@@ -263,7 +265,7 @@ class MFInputSocket : public MFSocket {
   const MFOutputSocket &origin() const;
 };
 
-class MFOutputSocket : public MFSocket {
+class MFOutputSocket final : public MFSocket {
  private:
   Vector<const MFInputSocket *> m_targets;
 
@@ -275,6 +277,8 @@ class MFOutputSocket : public MFSocket {
 
 class MFNetwork : BLI::NonCopyable, BLI::NonMovable {
  private:
+  MonotonicAllocator<> m_allocator;
+
   Array<MFNode *> m_node_by_id;
   Array<MFSocket *> m_socket_by_id;
 
diff --git a/source/blender/functions/intern/multi_function_network.cc b/source/blender/functions/intern/multi_function_network.cc
index 6f98524a0da..69864f2e8ee 100644
--- a/source/blender/functions/intern/multi_function_network.cc
+++ b/source/blender/functions/intern/multi_function_network.cc
@@ -20,16 +20,16 @@ using BLI::Stack;
 MFNetworkBuilder::~MFNetworkBuilder()
 {
   for (auto node : m_function_nodes) {
-    delete node;
+    node->~MFBuilderFunctionNode();
   }
   for (auto node : m_dummy_nodes) {
-    delete node;
+    node->~MFBuilderDummyNode();
   }
   for (auto socket : m_input_sockets) {
-    delete socket;
+    socket->~MFBuilderInputSocket();
   }
   for (auto socket : m_output_sockets) {
-    delete socket;
+    socket->~MFBuilderOutputSocket();
   }
 }
 
@@ -46,29 +46,29 @@ MFBuilderFunctionNode &MFNetworkBuilder::add_function(const MultiFunction &funct
   }
 #endif
 
-  auto node = new MFBuilderFunctionNode();
+  auto &node = *m_allocator.construct<MFBuilderFunctionNode>().release();
 
-  node->m_network = this;
-  node->m_is_dummy = false;
-  node->m_function = &function;
-  node->m_input_param_indices = input_param_indices;
-  node->m_output_param_indices = output_param_indices;
-  node->m_id = m_node_by_id.size();
+  node.m_network = this;
+  node.m_is_dummy = false;
+  node.m_function = &function;
+  node.m_input_param_indices = input_param_indices;
+  node.m_output_param_indices = output_param_indices;
+  node.m_id = m_node_by_id.size();
 
   for (uint i = 0; i < input_param_indices.size(); i++) {
     uint param_index = input_param_indices[i];
     MFParamType param = function.param_type(param_index);
     BLI_assert(param.is_input_or_mutable());
 
-    auto input_socket = new MFBuilderInputSocket();
-    input_socket->m_type = param.as_data_type();
-    input_socket->m_node = node;
-    input_socket->m_index = i;
-    input_socket->m_is_output = false;
-    input_socket->m_id = m_socket_by_id.size();
-    node->m_inputs.append(input_socket);
-    m_socket_by_id.append(input_socket);
-    m_input_sockets.append(input_socket);
+    auto &input_socket = *m_allocator.construct<MFBuilderInputSocket>().release();
+    input_socket.m_type = param.as_data_type();
+    input_socket.m_node = &node;
+    input_socket.m_index = i;
+    input_socket.m_is_output = false;
+    input_socket.m_id = m_socket_by_id.size();
+    node.m_inputs.append(&input_socket);
+    m_socket_by_id.append(&input_socket);
+    m_input_sockets.append(&input_socket);
   }
 
   for (uint i = 0; i < output_param_indices.size(); i++) {
@@ -76,57 +76,57 @@ MFBuilderFunctionNode &MFNetworkBuilder::add_function(const MultiFunction &funct
     MFParamType param = function.param_type(param_index);
     BLI_assert(param.is_output_or_mutable());
 
-    auto output_socket = new MFBuilderOutputSocket();
-    output_socket->m_type = param.as_data_type();
-    output_socket->m_node = node;
-    output_socket->m_index = i;
-    output_socket->m_is_output = true;
-    output_socket->m_id = m_socket_by_id.size();
-    node->m_outputs.append(output_socket);
-    m_socket_by_id.append(output_socket);
-    m_output_sockets.append(output_socket);
+    auto &output_socket = *m_allocator.construct<MFBuilderOutputSocket>().release();
+    output_socket.m_type = param.as_data_type();
+    output_socket.m_node = &node;
+    output_socket.m_index = i;
+    output_socket.m_is_output = true;
+    output_socket.m_id = m_socket_by_id.size();
+    node.m_outputs.append(&output_socket);
+    m_socket_by_id.append(&output_socket);
+    m_output_sockets.append(&output_socket);
   }
 
-  m_function_nodes.append(node);
-  m_node_by_id.append(node);
-  return *node;
+  m_function_nodes.append(&node);
+  m_node_by_id.append(&node);
+  return node;
 }
 
 MFBuilderDummyNode &MFNetworkBuilder::add_dummy(ArrayRef<MFDataType> input_types,
                                                 ArrayRef<MFDataType> output_types)
 {
-  auto node = new MFBuilderDummyNode();
+  auto &node = *m_allocator.construct<MFBuilderDummyNode>().release();
 
-  node->m_network = this;
-  node->m_is_dummy = true;
-  node->m_id = m_node_by_id.size();
+  node.m_network = this;
+  node.m_is_dummy = true;
+  node.m_id = m_node_by_id.size();
 
   for (uint i = 0; i < input_types.size(); i++) {
-    auto input_socket = new MFBuilderInputSocket();
-    input_socket->m_type = input_types[i];
-    input_socket->m_node = node;
-    input_socket->m_index = i;
-    input_socket->m_is_output = false;
-    input_socket->m_id = m_socket_by_id.size();
-    node->m_inputs.append(input_socket);
-    m_socket_by_id.append(input_socket);
-    m_input_sockets.append(input_socket);
+    auto &input_socket = *m_allocator.construct<MFBuilderInputSocket>().release();
+    input_socket.m_type = input_types[i];
+    input_socket.m_node = &node;
+    input_socket.m_index = i;
+    input_socket.m_is_output = false;
+    input_socket.m_id = m_socket_by_id.size();
+    node.m_inputs.append(&input_socket);
+    m_socket_by_id.append(&input_socket);
+    m_input_sockets.append(&input_socket);
   }
   for (uint i = 0; i < output_types.size(); i++) {
-    auto output_socket = new MFBuilderOutputSocket();
-    output_socket->m_type = output_types[i];
-    output_socket->m_node = node;
-    output_socket->m_index = i;
-    output_socket->m_is_output = true;
-    output_socket->m_id = m_socket_by_id.size();
-    node->m_outputs.append(output_socket);
-    m_socket_by_id.append(output_socket);
-    m_output_sockets.append(output_socket);
+    auto &output_socket = *m_allocator.construct<MFBuilderOutputSocket>().release();
+    output_socket.m_type = output_types[i];
+    output_socket.m_node = &node;
+    output_socket.m_index = i;
+    output_socket.m_is_output = true;
+    output_socket.m_id = m_socket_by_id.size();
+    node.m_outputs.append(&output_socket);
+    m_socket_by_id.append(&output_socket);
+    m_output_sockets.append(&output_socket);
   }
 
-  m_dummy_nodes.append(node);
-  m_node_by_id.append(node);
-  return *node;
+  m_dummy_nodes.append(&node);
+  m_node_by_id.append(&node);
+  return node;
 }
 
 void MFNetworkBuilder::add_link(MFBuilderOutputSocket &from, MFBuilderInputSocket &to)
@@ -259,78 +259,78 @@ MFNetwork::MFNetwork(std::unique_ptr<MFNetworkBuilder> builder)
   m_socket_by_id = Array<MFSocket *>(builder->sockets_by_id().size());
 
   for (MFBuilderFunctionNode *builder_node : builder->function_nodes()) {
-    MFFunctionNode *node = new MFFunctionNode();
+    MFFunctionNode &node = *m_allocator.construct<MFFunctionNode>().release();
 
-    node->m_function = &builder_node->function();
-    node->m_id = builder_node->id();
-    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;
+    node.m_function = &builder_node->function();
+    node.m_id = builder_node->id();
+    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 = new MFInputSocket();
-      socket->m_id = builder_socket->id();
-      socket->m_index = builder_socket->index();
-      socket->m_is_output = false;
-      socket->m_node = node;
-      socket->m_type = builder_socket->type();
-
-      m_socket_by_id[socket->id()] = socket;
-      m_input_sockets.append(socket);
-      node->m_inputs.append(socket);
+      MFInputSocket &socket = *m_allocator.construct<MFInputSocket>().release();
+      socket.m_id = builder_socket->id();
+      socket.m_index = builder_socket->index();
+      socket.m_is_output = false;
+      socket.m_node = &node;
+      socket.m_type = builder_socket->type();
+
+      m_socket_by_id[socket.id()] = &socket;
+      m_input_sockets.append(&socket);
+      node.m_inputs.append(&socket);
     }
     for (MFBuilderOutputSocket *builder_socket : builder_node->outputs()) {
-      MFOutputSocket *socket = new MFOutputSocket();
-      socket->m_id = builder_socket->id();
-      socket->m_index = builder_socket->index();
-      socket->m_is_output = true;
-      socket->m_node = node;
-      socket->m_type = builder_socket->type();
-
-      m_socket_by

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list