47 std::shared_ptr<ossia::graph_node> node;
48 std::shared_ptr<ossia::graph_interface> graph;
52 void clear_cables(ossia::inlet& port)
55 auto cbl = port.cables();
56 for(ossia::graph_edge* cable : cbl)
58 graph->disconnect(cable);
61 port.cables().clear();
63 void clear_cables(ossia::outlet& port)
65 auto cbl = port.cables();
66 for(ossia::graph_edge* cable : cbl)
68 graph->disconnect(cable);
71 port.cables().clear();
75 void copy_child_inlets(T* old_port, T* new_port)
77 for(std::size_t child_i = 0; child_i < old_port->child_inlets.size(); child_i++)
79 auto old_cld = old_port->child_inlets[child_i];
80 if(child_i < new_port->child_inlets.size())
82 auto new_cld = new_port->child_inlets[child_i];
84 copy_port(old_cld, new_cld);
88 clear_cables(*old_cld);
93 void copy_port(ossia::inlet* old_in, ossia::inlet* new_in)
95 copy_child_inlets(old_in, new_in);
97 if(old_in->which() == new_in->which())
99 new_in->address = old_in->address;
100 for(
auto& cable : old_in->cables())
104 new_in->cables() = std::move(old_in->cables());
108 clear_cables(*old_in);
112 void copy_port(ossia::outlet* old_out, ossia::outlet* new_out)
114 copy_child_inlets(old_out, new_out);
116 if(old_out->which() == new_out->which())
118 new_out->address = old_out->address;
119 for(
auto& cable : old_out->cables())
121 cable->out = new_out;
123 new_out->cables() = std::move(old_out->cables());
127 clear_cables(*old_out);
133 auto& old_inputs = node->root_inputs();
134 auto& old_outputs = node->root_outputs();
137 for(
auto& old_in : old_inputs)
141 auto& new_in = inls[k];
142 copy_port(old_in, new_in);
146 clear_cables(*old_in);
157 for(
auto& old_out : old_outputs)
161 auto& new_out = outls[k];
162 copy_port(old_out, new_out);
166 clear_cables(*old_out);
177 swap(node->root_inputs(), inls);
178 swap(node->root_outputs(), outls);