SPARK  0.1.0
A general purpose game engine written in C++.
Loading...
Searching...
No Matches
Composite.h
1#pragma once
2
3#include "spark/base/Exception.h"
4
5namespace spark::patterns
6{
7 template <typename DerivedType, template <typename> class Deleter>
8 Composite<DerivedType, Deleter>::Composite(DerivedType* parent)
9 {
10 setParent(parent);
11 }
12
13 template <typename DerivedType, template<typename> typename Deleter>
14 Composite<DerivedType, Deleter>::~Composite()
15 {
16 if (m_parent)
17 m_parent->remove(static_cast<DerivedType*>(this));
18 m_parent = nullptr;
19
20 for (std::size_t i = 0; i < m_children.size(); ++i)
21 Deleter<DerivedType>()(m_children[i]);
22 }
23
24 template <typename DerivedType, template<typename> typename Deleter>
25 DerivedType* Composite<DerivedType, Deleter>::parent()
26 {
27 return m_parent;
28 }
29
30 template <typename DerivedType, template<typename> typename Deleter>
31 const DerivedType* Composite<DerivedType, Deleter>::parent() const
32 {
33 return m_parent;
34 }
35
36 template <typename DerivedType, template<typename> typename Deleter>
37 DerivedType* Composite<DerivedType, Deleter>::root()
38 {
39 auto* ptr = static_cast<DerivedType*>(this);
40 while (ptr->parent() != nullptr)
41 ptr = ptr->parent();
42 return ptr;
43 }
44
45 template <typename DerivedType, template<typename> typename Deleter>
46 const DerivedType* Composite<DerivedType, Deleter>::root() const
47 {
48 const auto* ptr = static_cast<const DerivedType*>(this);
49 while (ptr->parent() != nullptr)
50 ptr = ptr->parent();
51 return ptr;
52 }
53
54 template <typename DerivedType, template<typename> typename Deleter>
55 std::vector<DerivedType*> Composite<DerivedType, Deleter>::children() const
56 {
57 return m_children;
58 }
59
60 template <typename DerivedType, template<typename> typename Deleter>
61 void Composite<DerivedType, Deleter>::add(DerivedType* child)
62 {
63 auto it = std::ranges::find(m_children, child);
64 if (it != m_children.end())
65 throw spark::base::BadArgumentException("Child already exists in the children list!");
66 m_children.push_back(child);
67 }
68
69 template <typename DerivedType, template<typename> typename Deleter>
70 void Composite<DerivedType, Deleter>::remove(DerivedType* child)
71 {
72 const auto it = std::ranges::find(m_children, child);
73 if (it == m_children.end())
74 throw spark::base::BadArgumentException("Child could not be found in the children list!");
75 m_children.erase(it);
76 }
77
78 template <typename DerivedType, template<typename> typename Deleter>
79 void Composite<DerivedType, Deleter>::setParent(DerivedType* parent)
80 {
81 // Remove from old parent if it not nullptr
82 if (m_parent)
83 m_parent->remove(static_cast<DerivedType*>(this));
84
85 // Set new parent
86 m_parent = parent;
87
88 // Add this child to the new parent il it is not nullptr
89 if (m_parent)
90 m_parent->add(static_cast<DerivedType*>(this));
91 }
92}
Exception thrown when an argument is not valid.
Definition Exception.h:32