MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NodeUtils.cpp
Go to the documentation of this file.
1#include "NodeUtils.hpp"
2
3#include "Node.hpp"
4
6
7namespace MayaFlux::Nodes {
8
9bool callback_exists(const std::vector<NodeHook>& callbacks, const NodeHook& callback)
10{
11 return std::ranges::any_of(callbacks,
12 [&callback](const NodeHook& hook) {
13 return hook.target_type() == callback.target_type();
14 });
15}
16
17bool conditional_callback_exists(const std::vector<std::pair<NodeHook, NodeCondition>>& callbacks, const NodeCondition& callback)
18{
19 return std::ranges::any_of(callbacks,
20 [&callback](const std::pair<NodeHook, NodeCondition>& pair) {
21 return pair.second.target_type() == callback.target_type();
22 });
23}
24
25bool callback_pair_exists(const std::vector<std::pair<NodeHook, NodeCondition>>& callbacks, const NodeHook& callback, const NodeCondition& condition)
26{
27 return std::ranges::any_of(callbacks,
28 [&callback, &condition](const std::pair<NodeHook, NodeCondition>& pair) {
29 return pair.first.target_type() == callback.target_type() && pair.second.target_type() == condition.target_type();
30 });
31}
32
33bool safe_add_callback(std::vector<NodeHook>& callbacks, const NodeHook& callback)
34{
35 if (!callback_exists(callbacks, callback)) {
36 callbacks.push_back(callback);
37 return true;
38 }
39 return false;
40}
41
42bool safe_add_conditional_callback(std::vector<std::pair<NodeHook, NodeCondition>>& callbacks, const NodeHook& callback, const NodeCondition& condition)
43{
44 if (!callback_pair_exists(callbacks, callback, condition)) {
45 callbacks.emplace_back(callback, condition);
46 return true;
47 }
48 return false;
49}
50
51bool safe_remove_callback(std::vector<NodeHook>& callbacks, const NodeHook& callback)
52{
53 bool removed = false;
54 auto it = callbacks.begin();
55
56 while (it != callbacks.end()) {
57 if (it->target_type() == callback.target_type()) {
58 it = callbacks.erase(it);
59 removed = true;
60 } else {
61 ++it;
62 }
63 }
64
65 return removed;
66}
67
68bool safe_remove_conditional_callback(std::vector<std::pair<NodeHook, NodeCondition>>& callbacks, const NodeCondition& callback)
69{
70 bool removed = false;
71 auto it = callbacks.begin();
72
73 while (it != callbacks.end()) {
74 if (it->second.target_type() == callback.target_type()) {
75 it = callbacks.erase(it);
76 removed = true;
77 } else {
78 ++it;
79 }
80 }
81
82 return removed;
83}
84
85void atomic_set_strong(std::atomic<Utils::NodeState>& flag, Utils::NodeState& expected, const Utils::NodeState& desired)
86{
87 flag.compare_exchange_strong(expected, desired);
88};
89
90void atomic_set_flag_strong(std::atomic<Utils::NodeState>& flag, const Utils::NodeState& desired)
91{
92 auto expected = flag.load();
93 flag.compare_exchange_strong(expected, desired);
94};
95
96void atomic_add_flag(std::atomic<Utils::NodeState>& state, Utils::NodeState flag)
97{
98 auto current = state.load();
99 Utils::NodeState desired;
100 do {
101 desired = static_cast<Utils::NodeState>(current | flag);
102 } while (!state.compare_exchange_weak(current, desired,
103 std::memory_order_acq_rel,
104 std::memory_order_acquire));
105}
106
107void atomic_remove_flag(std::atomic<Utils::NodeState>& state, Utils::NodeState flag)
108{
109 auto current = state.load();
110 Utils::NodeState desired;
111 do {
112 desired = static_cast<Utils::NodeState>(current & ~flag);
113 } while (!state.compare_exchange_weak(current, desired,
114 std::memory_order_acq_rel,
115 std::memory_order_acquire));
116}
117
118void atomic_set_flag_weak(std::atomic<Utils::NodeState>& flag, Utils::NodeState& expected, const Utils::NodeState& desired)
119{
120 flag.compare_exchange_weak(expected, desired);
121};
122
123void atomic_inc_modulator_count(std::atomic<uint32_t>& count, int amount)
124{
125 count.fetch_add(amount, std::memory_order_relaxed);
126}
127
128void atomic_dec_modulator_count(std::atomic<uint32_t>& count, int amount)
129{
130 count.fetch_sub(amount, std::memory_order_relaxed);
131}
132
133void try_reset_processed_state(std::shared_ptr<Node> node)
134{
135 if (node && node->m_modulator_count.load(std::memory_order_relaxed) == 0) {
136 node->reset_processed_state();
137 }
138}
139
140std::vector<uint32_t> get_active_channels(const std::shared_ptr<Nodes::Node>& node, uint32_t fallback_channel)
141{
142 uint32_t channel_mask = node ? node->get_channel_mask().load() : 0;
143 return get_active_channels(channel_mask, fallback_channel);
144}
145
146std::vector<uint32_t> get_active_channels(uint32_t channel_mask, uint32_t fallback_channel)
147{
148 std::vector<uint32_t> channels;
149
150 if (channel_mask == 0) {
151 channels.push_back(fallback_channel);
152 } else {
153 for (uint32_t channel = 0; channel < MayaFlux::Config::get_node_config().max_channels; ++channel) {
154 if (channel_mask & (1ULL << channel)) {
155 channels.push_back(channel);
156 }
157 }
158 }
159
160 return channels;
161}
162
163}
NodeConfig & get_node_config()
Definition Config.cpp:44
std::function< void(NodeContext &)> NodeHook
Callback function type for node processing events.
Definition NodeUtils.hpp:25
bool callback_pair_exists(const std::vector< std::pair< NodeHook, NodeCondition > > &callbacks, const NodeHook &callback, const NodeCondition &condition)
Checks if a specific callback and condition pair already exists.
Definition NodeUtils.cpp:25
bool callback_exists(const std::vector< NodeHook > &callbacks, const NodeHook &callback)
Checks if a callback function already exists in a collection.
Definition NodeUtils.cpp:9
bool safe_remove_conditional_callback(std::vector< std::pair< NodeHook, NodeCondition > > &callbacks, const NodeCondition &callback)
Safely removes all conditional callbacks with a specific condition.
Definition NodeUtils.cpp:68
void atomic_add_flag(std::atomic< Utils::NodeState > &state, Utils::NodeState flag)
Atomically adds a flag to a node state.
Definition NodeUtils.cpp:96
bool safe_add_callback(std::vector< NodeHook > &callbacks, const NodeHook &callback)
Safely adds a callback to a collection if it doesn't already exist.
Definition NodeUtils.cpp:33
void atomic_set_strong(std::atomic< Utils::NodeState > &flag, Utils::NodeState &expected, const Utils::NodeState &desired)
Atomically sets a node state flag with strong memory ordering.
Definition NodeUtils.cpp:85
std::vector< uint32_t > get_active_channels(const std::shared_ptr< Nodes::Node > &node, uint32_t fallback_channel)
Extracts active channel list from a node's channel mask.
bool conditional_callback_exists(const std::vector< std::pair< NodeHook, NodeCondition > > &callbacks, const NodeCondition &callback)
Checks if a condition function already exists in a collection of conditional callbacks.
Definition NodeUtils.cpp:17
void try_reset_processed_state(std::shared_ptr< Node > node)
Attempts to reset the processed state of a node.
void atomic_inc_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically increments the modulator count by a specified amount.
std::function< bool(NodeContext &)> NodeCondition
Predicate function type for conditional callbacks.
Definition NodeUtils.hpp:43
void atomic_dec_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically decrements the modulator count by a specified amount.
bool safe_add_conditional_callback(std::vector< std::pair< NodeHook, NodeCondition > > &callbacks, const NodeHook &callback, const NodeCondition &condition)
Safely adds a conditional callback if it doesn't already exist.
Definition NodeUtils.cpp:42
void atomic_set_flag_strong(std::atomic< Utils::NodeState > &flag, const Utils::NodeState &desired)
Atomically sets a node state flag to a specific value.
Definition NodeUtils.cpp:90
void atomic_remove_flag(std::atomic< Utils::NodeState > &state, Utils::NodeState flag)
Atomically removes a flag from a node state.
void atomic_set_flag_weak(std::atomic< Utils::NodeState > &flag, Utils::NodeState &expected, const Utils::NodeState &desired)
Atomically sets a node state flag with weak memory ordering.
bool safe_remove_callback(std::vector< NodeHook > &callbacks, const NodeHook &callback)
Safely removes a callback from a collection.
Definition NodeUtils.cpp:51
Contains the node-based computational processing system components.
Definition Chronie.hpp:5
uint32_t max_channels
Maximum number of channels supported (uint32_t bits)
Definition Config.hpp:41