MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
DataProcessingChain.cpp
Go to the documentation of this file.
2
3namespace MayaFlux::Kakshya {
4
5void DataProcessingChain::add_processor(std::shared_ptr<DataProcessor> processor, std::shared_ptr<SignalSourceContainer> container, const std::string& tag)
6{
7 processor->on_attach(container);
8 m_container_processors[container].emplace_back(processor);
9 if (!tag.empty()) {
10 m_processor_tags[processor] = tag;
11 }
12}
13
14void DataProcessingChain::add_processor_at(std::shared_ptr<DataProcessor> processor,
15 std::shared_ptr<SignalSourceContainer> container,
16 size_t position)
17{
18 processor->on_attach(container);
19 auto& processors = m_container_processors[container];
20
21 if (position >= processors.size()) {
22 processors.push_back(processor);
23 } else {
24 processors.insert(processors.begin() + position, processor);
25 }
26}
27
28void DataProcessingChain::remove_processor(std::shared_ptr<DataProcessor> processor, std::shared_ptr<SignalSourceContainer> container)
29{
30 auto it = m_container_processors.find(container);
31 if (it != m_container_processors.end()) {
32 auto& processors = it->second;
33 auto proc_it = std::find(processors.begin(), processors.end(), processor);
34
35 if (proc_it != processors.end()) {
36 processor->on_detach(container);
37 processors.erase(proc_it);
38
39 if (processors.empty()) {
40 m_container_processors.erase(it);
41 }
42 }
43 }
44}
45
46void DataProcessingChain::process(std::shared_ptr<SignalSourceContainer> container)
47{
48 auto it = m_container_processors.find(container);
49 if (it != m_container_processors.end()) {
50 for (auto& processor : it->second) {
51 processor->process(container);
52 }
53 }
54}
55
56void DataProcessingChain::process_filtered(std::shared_ptr<SignalSourceContainer> container, std::function<bool(std::shared_ptr<DataProcessor>)> filter)
57{
58 auto it = m_container_processors.find(container);
59 if (it != m_container_processors.end()) {
60 for (auto& processor : it->second) {
61 if (filter(processor)) {
62 processor->process(container);
63 }
64 }
65 }
66}
67
68void DataProcessingChain::process_tagged(std::shared_ptr<SignalSourceContainer> container, const std::string& tag)
69{
70 auto it = m_container_processors.find(container);
71 if (it != m_container_processors.end()) {
72 for (auto& processor : it->second) {
73 auto tag_it = m_processor_tags.find(processor);
74 if (tag_it != m_processor_tags.end() && tag_it->second == tag) {
75 processor->process(container);
76 }
77 }
78 }
79}
80}
void remove_processor(std::shared_ptr< DataProcessor > processor, std::shared_ptr< SignalSourceContainer > container)
Removes a processor from a container's chain.
void process(std::shared_ptr< SignalSourceContainer > container)
Processes a container with all its associated processors, in sequence.
void process_filtered(std::shared_ptr< SignalSourceContainer > container, std::function< bool(std::shared_ptr< DataProcessor >)> filter)
Processes a container with processors that match a filter function.
void process_tagged(std::shared_ptr< SignalSourceContainer > container, const std::string &tag)
Processes a container with processors that have a specific tag.
std::unordered_map< std::shared_ptr< DataProcessor >, std::string > m_processor_tags
Maps processors to their associated tags for categorization and filtering.
void add_processor(std::shared_ptr< DataProcessor > processor, std::shared_ptr< SignalSourceContainer > container, const std::string &tag="")
Adds a processor to the chain for a specific container.
void add_processor_at(std::shared_ptr< DataProcessor > processor, std::shared_ptr< SignalSourceContainer > container, size_t position)
Adds a processor at a specific position in the chain.
std::unordered_map< std::shared_ptr< SignalSourceContainer >, std::vector< std::shared_ptr< DataProcessor > > > m_container_processors
Maps containers to their associated processors in sequence order.