[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