19 #ifndef LIB_CS_NODEMANAGER_H
20 #define LIB_CS_NODEMANAGER_H
22 #include <cs_intrusive_pointer.h>
29 enum class VisitChildren {
34 enum class VisitStatus {
39 template <
typename T,
typename Policy = CsIntrusiveDefaultPolicy>
66 m_children.push_back(std::move(child));
69 const std::vector<CsIntrusivePointer<T, Policy>> &
children()
const {
76 std::vector<CsIntrusivePointer<T, Policy>> tmp;
77 swap(m_children, tmp);
83 template <
typename U,
typename F>
87 std::vector<CsIntrusivePointer<U, Policy>>
find_children()
const;
89 template <
typename U,
typename F>
90 std::vector<CsIntrusivePointer<U, Policy>>
find_children(
const F &lambda)
const;
97 }
else if (source < dest) {
98 std::rotate(m_children.begin() + source, m_children.begin() + source + 1,
99 m_children.begin() + dest + 1);
102 std::rotate(m_children.rend() - source - 1, m_children.rend() - source,
103 m_children.rend() - dest);
109 auto iter = std::find(m_children.begin(), m_children.end(), child);
111 if (iter != m_children.end()) {
112 m_children.erase(iter);
120 T *ptr = child.
get();
124 template <
typename U = T,
typename F>
125 VisitStatus
visit(
const F &lambda, VisitChildren option = VisitChildren::Recursive)
const;
128 std::vector<CsIntrusivePointer<T, Policy>> m_children;
131 template <
typename T,
typename Policy>
132 template <
typename U>
137 auto lambda_internal = [&retval] (
auto item) {
139 return VisitStatus::Finished;
142 visit<U>(lambda_internal);
147 template <
typename T,
typename Policy>
148 template <
typename U,
typename F>
153 auto lambda_internal = [&retval, &lambda] (
auto item) {
154 if (lambda(item) ==
true) {
156 return VisitStatus::Finished;
159 return VisitStatus::VisitMore;
162 visit<U>(lambda_internal);
167 template <
typename T,
typename Policy>
168 template <
typename U>
171 std::vector<CsIntrusivePointer<U, Policy>> retval;
173 auto lambda_internal = [&retval] (
auto item) {
174 retval.push_back(item);
175 return VisitStatus::VisitMore;
178 visit<U>(lambda_internal);
183 template <
typename T,
typename Policy>
184 template <
typename U,
typename F>
187 std::vector<CsIntrusivePointer<U, Policy>> retval;
189 auto lambda_internal = [&retval, &lambda] (
auto item) {
190 if (lambda(item) ==
true) {
191 retval.push_back(item);
194 return VisitStatus::VisitMore;
197 visit<U>(lambda_internal);
202 template <
typename T,
typename Policy>
203 template <
typename U,
typename F>
206 enum VisitStatus retval = VisitStatus::VisitMore;
208 for (
const auto &item : m_children) {
210 if constexpr(std::is_same_v<T, U>) {
211 retval = lambda(item);
213 if (retval == VisitStatus::Finished) {
220 if (child !=
nullptr) {
221 retval = lambda(child);
223 if (retval == VisitStatus::Finished) {
229 if (option == VisitChildren::Recursive) {
230 retval = item->template visit<U>(lambda);
232 if (retval == VisitStatus::Finished) {
VisitStatus visit(const F &lambda, VisitChildren option=VisitChildren::Recursive) const
Definition: cs_nodemanager.h:204
Pointer get() const noexcept
Definition: cs_intrusive_pointer.h:280
bool remove_child(const CsIntrusivePointer< T, Policy > &child)
Definition: cs_nodemanager.h:119
bool remove_child(T *child)
Definition: cs_nodemanager.h:108
CsIntrusivePointer< U, Policy > find_child() const
Definition: cs_nodemanager.h:133
const std::vector< CsIntrusivePointer< T, Policy > > & children() const
Definition: cs_nodemanager.h:69
Manages a pointer to an object, the reference count is stored in the object.
Definition: cs_intrusive_pointer.h:130
CsNodeManager & operator=(const CsNodeManager &other) = default
void clear()
Definition: cs_nodemanager.h:73
void add_child(T *child)
Definition: cs_nodemanager.h:61
virtual ~CsNodeManager()
Definition: cs_nodemanager.h:47
CsNodeManager() = default
void move_child(size_type source, size_type dest)
Definition: cs_nodemanager.h:92
typename std::vector< CsIntrusivePointer< T, Policy > >::size_type size_type
Definition: cs_nodemanager.h:43
Manages a container of intrusive pointers.
Definition: cs_nodemanager.h:40
std::vector< CsIntrusivePointer< U, Policy > > find_children() const
Definition: cs_nodemanager.h:169
void add_child(CsIntrusivePointer< T, Policy > child)
Definition: cs_nodemanager.h:65
Namespace for the CsPointer library.