12namespace nc::ecs::detail
23 template<std::derived_from<FreeComponent> T,
class... Args>
24 auto Add(Args&& ... args) -> T&;
26 template<std::derived_from<FreeComponent> T>
27 auto Remove() -> bool;
29 template<std::derived_from<FreeComponent> T>
30 bool Contains()
const noexcept;
32 template<std::derived_from<FreeComponent> T>
33 auto Get()
const -> T&;
35 void CommitStagedComponents();
36 auto IsPersistentGroup() -> bool;
39 std::vector<std::unique_ptr<FreeComponent>> m_components;
40 std::vector<std::unique_ptr<FreeComponent>> m_toAdd;
41 std::set<size_t> m_toRemove;
44template<std::derived_from<FreeComponent> T,
class ... Args>
45auto FreeComponentGroup::Add(Args&& ... args) -> T&
47 NC_ASSERT(!Contains<T>(),
"Entity already has a component of this type");
48 auto newComponent = std::make_unique<T>(std::forward<Args>(args)...);
49 auto& out = *newComponent;
50 m_toAdd.push_back(std::move(newComponent));
54template<std::derived_from<FreeComponent> T>
55auto FreeComponentGroup::Remove() ->
bool
57 for(
size_t i = 0;
auto& component : m_components)
59 if(
dynamic_cast<T*
>(component.get()))
71template<std::derived_from<FreeComponent> T>
72bool FreeComponentGroup::Contains() const noexcept
74 for(
auto& item : m_components)
76 auto* ptr =
dynamic_cast<T*
>(item.get());
81 for(
auto& item : m_toAdd)
83 auto* ptr =
dynamic_cast<T*
>(item.get());
91template<std::derived_from<FreeComponent> T>
92auto FreeComponentGroup::Get() const -> T&
94 for(
auto& item : m_components)
96 auto* ptr =
dynamic_cast<T*
>(item.get());
101 for(
auto& item : m_toAdd)
103 auto* ptr =
dynamic_cast<T*
>(item.get());
108 throw NcError(
"Component does not exist");
111inline void FreeComponentGroup::CommitStagedComponents()
113 for(
auto i : m_toRemove)
115 m_components.at(i) = std::move(m_components.back());
116 m_components.pop_back();
121 for(
auto& toAdd : m_toAdd)
123 m_components.push_back(std::move(toAdd));
129inline auto FreeComponentGroup::IsPersistentGroup() ->
bool
131 return !m_components.empty()
132 ? m_components[0]->ParentEntity().IsPersistent()
Definition: FreeComponentGroup.h:15