MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Tapestry.cpp
Go to the documentation of this file.
1#include "Tapestry.hpp"
2
6
7namespace MayaFlux::Nexus {
8
10 std::shared_ptr<Vruta::TaskScheduler> scheduler,
11 std::shared_ptr<Vruta::EventManager> event_manager)
12 : m_scheduler(std::move(scheduler))
13 , m_event_manager(std::move(event_manager))
14{
15}
16
17Tapestry::~Tapestry() = default;
18
19std::shared_ptr<Fabric> Tapestry::create_fabric(float cell_size)
20{
21 auto fabric = std::make_shared<Fabric>(*m_scheduler, *m_event_manager, cell_size);
22 m_fabrics.push_back(fabric);
23 return fabric;
24}
25
26std::shared_ptr<Fabric> Tapestry::create_fabric(std::string name, float cell_size)
27{
28 if (m_named_fabrics.contains(name)) {
30 "Tapestry::create_fabric: name '{}' already registered, returning existing", name);
31 return m_named_fabrics[name].lock();
32 }
33
34 auto fabric = std::make_shared<Fabric>(*m_scheduler, *m_event_manager, cell_size);
35 fabric->set_name(name);
36 m_fabrics.push_back(fabric);
37 m_named_fabrics.emplace(std::move(name), fabric);
38 return fabric;
39}
40
41void Tapestry::remove_fabric(const std::shared_ptr<Fabric>& fabric)
42{
43 auto it = std::ranges::find(m_fabrics, fabric);
44 if (it == m_fabrics.end()) {
45 return;
46 }
47 m_fabrics.erase(it);
48
49 for (auto nit = m_named_fabrics.begin(); nit != m_named_fabrics.end();) {
50 if (nit->second.lock() == fabric) {
51 nit = m_named_fabrics.erase(nit);
52 } else {
53 ++nit;
54 }
55 }
56}
57
58void Tapestry::remove_fabric(std::string_view name)
59{
60 auto nit = m_named_fabrics.find(std::string(name));
61 if (nit == m_named_fabrics.end()) {
62 return;
63 }
64 auto fabric = nit->second.lock();
65 m_named_fabrics.erase(nit);
66 if (fabric) {
67 std::erase(m_fabrics, fabric);
68 }
69}
70
71std::shared_ptr<Fabric> Tapestry::get_fabric(std::string_view name) const
72{
73 auto it = m_named_fabrics.find(std::string(name));
74 return it != m_named_fabrics.end() ? it->second.lock() : nullptr;
75}
76
77const std::vector<std::shared_ptr<Fabric>>& Tapestry::all_fabrics() const
78{
79 return m_fabrics;
80}
81
83{
84 for (auto& fabric : m_fabrics) {
85 fabric->commit();
86 }
87}
88
89} // namespace MayaFlux::Nexus
#define MF_WARN(comp, ctx,...)
std::vector< std::shared_ptr< Fabric > > m_fabrics
Definition Tapestry.hpp:92
Tapestry(std::shared_ptr< Vruta::TaskScheduler > scheduler, std::shared_ptr< Vruta::EventManager > event_manager)
Construct with shared scheduler and event manager.
Definition Tapestry.cpp:9
void remove_fabric(const std::shared_ptr< Fabric > &fabric)
Remove a Fabric by pointer.
Definition Tapestry.cpp:41
std::shared_ptr< Fabric > get_fabric(std::string_view name) const
Look up a named Fabric.
Definition Tapestry.cpp:71
std::shared_ptr< Vruta::EventManager > m_event_manager
Definition Tapestry.hpp:90
const std::vector< std::shared_ptr< Fabric > > & all_fabrics() const
All woven Fabrics, named and unnamed.
Definition Tapestry.cpp:77
void commit_all()
Commit all woven Fabrics in insertion order.
Definition Tapestry.cpp:82
std::shared_ptr< Fabric > create_fabric(float cell_size=1.0F)
create_fabric a new unnamed Fabric into the Tapestry.
Definition Tapestry.cpp:19
std::shared_ptr< Vruta::TaskScheduler > m_scheduler
Definition Tapestry.hpp:89
std::unordered_map< std::string, std::weak_ptr< Fabric > > m_named_fabrics
Definition Tapestry.hpp:93
@ Init
Engine/subsystem initialization.
@ Nexus
Spatial indexing and scheduling for user-defined behaviour.