27 node->destruct_sockets();
28 node->~MFFunctionNode();
31 node->destruct_sockets();
36 void MFNode::destruct_sockets()
39 socket->~MFInputSocket();
41 for (MFOutputSocket *socket :
outputs_) {
42 socket->~MFOutputSocket();
55 for (
int param_index :
function.param_indices()) {
56 switch (
function.param_type(param_index).interface_type()) {
58 input_param_indices.
append(param_index);
62 output_param_indices.
append(param_index);
66 input_param_indices.
append(param_index);
67 output_param_indices.
append(param_index);
74 function_nodes_.add_new(&
node);
77 node.is_dummy_ =
false;
78 node.id_ = node_or_null_by_id_.append_and_get_index(&
node);
79 node.function_ = &
function;
84 input_param_indices.
size());
86 output_param_indices.
size());
89 int param_index = input_param_indices[i];
90 MFParamType param =
function.param_type(param_index);
98 socket.
name_ =
function.param_name(param_index);
99 socket.origin_ =
nullptr;
100 socket.
id_ = socket_or_null_by_id_.append_and_get_index(&socket);
104 int param_index = output_param_indices[i];
105 MFParamType param =
function.param_type(param_index);
113 socket.
name_ =
function.param_name(param_index);
114 socket.
id_ = socket_or_null_by_id_.append_and_get_index(&socket);
133 dummy_nodes_.add_new(&
node);
135 node.network_ =
this;
136 node.is_dummy_ =
true;
138 node.id_ = node_or_null_by_id_.append_and_get_index(&
node);
143 output_types.
size());
155 socket.
id_ = socket_or_null_by_id_.append_and_get_index(&socket);
166 socket.
id_ = socket_or_null_by_id_.append_and_get_index(&socket);
183 from.targets_.append(&to);
189 return this->
add_dummy(name, {}, {data_type}, {}, {
"Value"}).
output(0);
194 return this->
add_dummy(name, {data_type}, {}, {
"Value"}, {}).input(0);
202 input->origin_ = &new_output;
204 new_output.targets_.extend(old_output.targets_);
205 old_output.targets_.clear();
211 if (socket->origin_ !=
nullptr) {
212 socket->origin_->targets_.remove_first_occurrence_and_reorder(socket);
214 socket_or_null_by_id_[socket->
id_] =
nullptr;
218 other->origin_ =
nullptr;
220 socket_or_null_by_id_[socket->
id_] =
nullptr;
222 node.destruct_sockets();
223 if (
node.is_dummy()) {
225 dummy_node.~MFDummyNode();
226 dummy_nodes_.remove_contained(&dummy_node);
230 function_node.~MFFunctionNode();
231 function_nodes_.remove_contained(&function_node);
233 node_or_null_by_id_[
node.id_] =
nullptr;
251 while (!sockets_to_check.
is_empty()) {
254 if (origin_socket ==
nullptr) {
255 r_unlinked_inputs.
add(&socket);
259 const MFNode &origin_node = origin_socket->
node();
262 r_dummy_sockets.
add(origin_socket);
266 if (visited_nodes.
add(&origin_node)) {
277 return dummy_sockets.
size() + unlinked_inputs.
size() > 0;
283 digraph.
set_rankdir(dot::Attr_rankdir::LeftToRight);
288 all_nodes.
extend(function_nodes_.as_span().cast<
const MFNode *>());
289 all_nodes.
extend(dummy_nodes_.as_span().cast<
const MFNode *>());
307 dot_nodes.
lookup(
node).node().set_background_color(
"#77EE77");
310 dot_nodes.
lookup(
node).node().set_background_color(
"#7777EE");
313 for (
const MFNode *to_node : all_nodes) {
318 if (from_socket !=
nullptr) {
MutableSpan< T > construct_array_copy(Span< T > src)
StringRefNull copy_string(StringRef str)
Span< T * > construct_elements_and_pointer_array(int64_t n, Args &&... args)
MutableSpan< T > allocate_array(int64_t size)
destruct_ptr< T > construct(Args &&... args)
const Value & lookup(const Key &key) const
void add_new(const Key &key, const Value &value)
constexpr int64_t size() const
constexpr IndexRange index_range() const
void push_multiple(Span< T > values)
void append(const T &value)
IndexRange index_range() const
void extend(Span< T > array)
DirectedEdge & new_edge(NodePort from, NodePort to)
std::string to_dot_string() const
Node & new_node(StringRef label)
void set_rankdir(Attr_rankdir rankdir)
NodePort output(int index) const
NodePort input(int index) const
std::string to_string() const
bool have_dummy_or_unlinked_dependencies(Span< const MFInputSocket * > sockets) const
void remove(MFNode &node)
void relink(MFOutputSocket &old_output, MFOutputSocket &new_output)
void find_dependencies(Span< const MFInputSocket * > sockets, VectorSet< const MFOutputSocket * > &r_dummy_sockets, VectorSet< const MFInputSocket * > &r_unlinked_inputs) const
MFDummyNode & add_dummy(StringRef name, Span< MFDataType > input_types, Span< MFDataType > output_types, Span< StringRef > input_names, Span< StringRef > output_names)
std::string to_dot(Span< const MFNode * > marked_nodes={}) const
void add_link(MFOutputSocket &from, MFInputSocket &to)
MFFunctionNode & add_function(const MultiFunction &function)
MFOutputSocket & add_input(StringRef name, MFDataType data_type)
MFInputSocket & add_output(StringRef name, MFDataType data_type)
Span< MFInputSocket * > inputs()
Span< MFOutputSocket * > outputs_
Span< MFInputSocket * > inputs_
Span< MFInputSocket * > targets()
MFDataType data_type() const
bool is_output_or_mutable() const
bool is_input_or_mutable() const
StringRefNull name() const
const MFDataType & data_type() const
constexpr void assert_same_size(const T1 &v1, const T2 &v2)