[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