From 3a9eed56bbe355fbd7c414a3133046772d7130d2 Mon Sep 17 00:00:00 2001 From: Vftdan Date: Tue, 20 Aug 2024 13:43:24 +0200 Subject: [PATCH] Factor out unconditional tee-like event forwarding into a global function --- graph.c | 34 ++++++++++++++++++++++++++++++++++ graph.h | 1 + nodes/assign.c | 13 +------------ nodes/differentiate.c | 13 +------------ nodes/modifiers.c | 13 +------------ nodes/scale.c | 13 +------------ nodes/tee.c | 18 +----------------- nodes/window.c | 31 +++---------------------------- 8 files changed, 43 insertions(+), 93 deletions(-) diff --git a/graph.c b/graph.c index a1e5a1e..4803927 100644 --- a/graph.c +++ b/graph.c @@ -165,3 +165,37 @@ graph_channel_list_deinit(GraphChannelList * lst) } lst->length = 0; } + +ssize_t +graph_node_broadcast_forward_event(const GraphNode * source, EventNode * event) +{ + if (!event) { + return -1; + } + if (!source) { + event_destroy(event); + return -1; + } + size_t count = source->outputs.length; + if (!count) { + event_destroy(event); + return 0; + } + if (count > 1) { + count = event_replicate(event, count - 1) + 1; + } + size_t succeses = count; + for (size_t i = 0; i < count; ++i) { + EventPositionBase *output = &source->outputs.elements[i]->as_EventPositionBase; + if (!output) { + --succeses; + EventNode *orphaned = event; + event = orphaned->next; + event_destroy(orphaned); + continue; + } + event->position = output; + event = event->next; + } + return succeses; +} diff --git a/graph.h b/graph.h index 9fafe89..7e4e25d 100644 --- a/graph.h +++ b/graph.h @@ -42,5 +42,6 @@ void graph_node_delete(GraphNode * self); void graph_node_register_io(GraphNode * self, ProcessingState * state); void graph_channel_list_init(GraphChannelList * lst); void graph_channel_list_deinit(GraphChannelList * lst); +ssize_t graph_node_broadcast_forward_event(const GraphNode * source, EventNode * event /* may become invalid afterward */); #endif /* end of include guard: GRAPH_H_ */ diff --git a/nodes/assign.c b/nodes/assign.c index 164dd18..88aaca9 100644 --- a/nodes/assign.c +++ b/nodes/assign.c @@ -30,18 +30,7 @@ handle_event(EventPositionBase * self, EventNode * event) event->data.payload = node->source.payload; } - if (count > 1) { - count = event_replicate(event, count - 1) + 1; - } - for (size_t i = 0; i < count; ++i) { - event->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; - if (!event->position) { - EventNode *orphaned = event; - event = orphaned->prev; - event_destroy(orphaned); - } - event = event->next; - } + graph_node_broadcast_forward_event(&node->as_GraphNode, event); return true; } diff --git a/nodes/differentiate.c b/nodes/differentiate.c index 5f68baf..19474d6 100644 --- a/nodes/differentiate.c +++ b/nodes/differentiate.c @@ -20,18 +20,7 @@ handle_event(EventPositionBase * self, EventNode * event) event->data.payload = current - node->previous; node->previous = current; - if (count > 1) { - count = event_replicate(event, count - 1) + 1; - } - for (size_t i = 0; i < count; ++i) { - event->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; - if (!event->position) { - EventNode *orphaned = event; - event = orphaned->prev; - event_destroy(orphaned); - } - event = event->next; - } + graph_node_broadcast_forward_event(&node->as_GraphNode, event); return true; } diff --git a/nodes/modifiers.c b/nodes/modifiers.c index 844a90c..035a87a 100644 --- a/nodes/modifiers.c +++ b/nodes/modifiers.c @@ -17,18 +17,7 @@ handle_event(EventPositionBase * self, EventNode * event) return true; } modifier_set_operation_from(&event->data.modifiers, node->modifiers, node->operation); - if (count > 1) { - count = event_replicate(event, count - 1) + 1; - } - for (size_t i = 0; i < count; ++i) { - event->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; - if (!event->position) { - EventNode *orphaned = event; - event = orphaned->prev; - event_destroy(orphaned); - } - event = event->next; - } + graph_node_broadcast_forward_event(&node->as_GraphNode, event); return true; } diff --git a/nodes/scale.c b/nodes/scale.c index 3ab8da0..34e267f 100644 --- a/nodes/scale.c +++ b/nodes/scale.c @@ -34,18 +34,7 @@ handle_event(EventPositionBase * self, EventNode * event) value += node->center; event->data.payload = value; - if (count > 1) { - count = event_replicate(event, count - 1) + 1; - } - for (size_t i = 0; i < count; ++i) { - event->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; - if (!event->position) { - EventNode *orphaned = event; - event = orphaned->prev; - event_destroy(orphaned); - } - event = event->next; - } + graph_node_broadcast_forward_event(&node->as_GraphNode, event); return true; } diff --git a/nodes/tee.c b/nodes/tee.c index acbe779..ecda66f 100644 --- a/nodes/tee.c +++ b/nodes/tee.c @@ -5,23 +5,7 @@ static bool handle_event(EventPositionBase * self, EventNode * event) { GraphNode *node = DOWNCAST(GraphNode, EventPositionBase, self); - size_t count = node->outputs.length; - if (!count) { - event_destroy(event); - return true; - } - if (count > 1) { - count = event_replicate(event, count - 1) + 1; - } - for (size_t i = 0; i < count; ++i) { - event->position = &node->outputs.elements[i]->as_EventPositionBase; - if (!event->position) { - EventNode *orphaned = event; - event = orphaned->prev; - event_destroy(orphaned); - } - event = event->next; - } + graph_node_broadcast_forward_event(node, event); return true; } diff --git a/nodes/window.c b/nodes/window.c index 2dde7e4..da20d88 100644 --- a/nodes/window.c +++ b/nodes/window.c @@ -42,31 +42,6 @@ event_set_del(EventSet * set, const EventNode * element) { return hash_table_delete_by_key(set, hash_event_ptr(element)); } -static void -broadcast_event(GraphNode * source, EventNode * event) -{ - if (!event) { - return; - } - size_t count = source->outputs.length; - if (!count) { - event_destroy(event); - return; - } - if (count > 1) { - count = event_replicate(event, count - 1) + 1; - } - for (size_t i = 0; i < count; ++i) { - event->position = &source->outputs.elements[i]->as_EventPositionBase; - if (!event->position) { - EventNode *orphaned = event; - event = orphaned->prev; - event_destroy(orphaned); - } - event = event->next; - } -} - static EventNode * replicate_and_advance(EventNode ** ptr) { @@ -94,7 +69,7 @@ trigger_new_window(WindowGraphNode * node, EventNode * base) terminator->data.code = node->terminator_prototype.code; terminator->data.modifiers = modifier_set_copy(node->terminator_prototype.modifiers); terminator->data.payload = node->terminator_prototype.payload; - broadcast_event(&node->as_GraphNode, terminator); + graph_node_broadcast_forward_event(&node->as_GraphNode, terminator); } } @@ -129,7 +104,7 @@ trigger_new_window(WindowGraphNode * node, EventNode * base) } recipient->data = orig->data; recipient->data.modifiers = modifier_set_copy(orig->data.modifiers); - broadcast_event(&node->as_GraphNode, recipient); + graph_node_broadcast_forward_event(&node->as_GraphNode, recipient); } event_destroy(base); @@ -181,7 +156,7 @@ handle_event(EventPositionBase * self, EventNode * event) } if (event_replicate(event, 1)) { - broadcast_event(&node->as_GraphNode, event->next); + graph_node_broadcast_forward_event(&node->as_GraphNode, event->next); } queue_put(&node->buffer, (QueueValue){.as_ptr = event}); event_set_add(&node->buffered_set, event);