@@ -86,15 +86,14 @@ export namespace CppUtils::Container
8686 throw std::logic_error{"Child node not found"};
8787 if (m_distanceFromRoot == std::numeric_limits<std::size_t>::max())
8888 throw std::logic_error{"Root node not found"};
89- if (not childValue.isRoot())
90- if (std::empty( childValue.m_parents) or childValue.m_distanceFromRoot > m_distanceFromRoot + 1)
91- childValue.m_distanceFromRoot = m_distanceFromRoot + 1 ;
89+
90+ childValue.m_parents.push_back(m_weakThis);
91+ childValue.updateDistance(m_weakThis, m_distanceFromRoot) ;
9292
9393 if (childValue.m_distanceFromRoot > m_distanceFromRoot)
9494 m_children.push_back(childPtr);
9595 else
9696 m_children.push_back(WeakPtr{childPtr});
97- childValue.m_parents.push_back(m_weakThis);
9897 }
9998
10099 inline auto detachChild(NetworkPtr& childValue) -> void
@@ -190,20 +189,23 @@ export namespace CppUtils::Container
190189 {
191190 const auto oldDistanceFromRoot = m_distanceFromRoot;
192191
193- m_distanceFromRoot = std::numeric_limits<std::size_t>::max();
194- for (const auto& parentWeak : m_parents )
192+ m_distanceFromRoot = m_isRoot ? 0 : std::numeric_limits<std::size_t>::max();
193+ if (not m_isRoot )
195194 {
196- auto parentDistance = std::numeric_limits<std::size_t>::max();
197- if (Thread::SharedPtr::ownerEqual(parentWeak, lockedParentWeak))
198- parentDistance = lockedParentDistance;
199- else if (auto parent = parentWeak.lock())
195+ for (const auto& parentWeak : m_parents)
200196 {
201- auto accessor = parent->sharedAccess();
202- parentDistance = accessor->getDistanceFromRoot();
203- }
197+ auto parentDistance = std::numeric_limits<std::size_t>::max();
198+ if (Thread::SharedPtr::ownerEqual(parentWeak, lockedParentWeak))
199+ parentDistance = lockedParentDistance;
200+ else if (auto parent = parentWeak.lock())
201+ {
202+ auto accessor = parent->sharedAccess();
203+ parentDistance = accessor->getDistanceFromRoot();
204+ }
204205
205- if (parentDistance != std::numeric_limits<std::size_t>::max() and parentDistance + 1 < m_distanceFromRoot)
206- m_distanceFromRoot = parentDistance + 1;
206+ if (parentDistance != std::numeric_limits<std::size_t>::max() and parentDistance + 1 < m_distanceFromRoot)
207+ m_distanceFromRoot = parentDistance + 1;
208+ }
207209 }
208210
209211 if (m_distanceFromRoot == oldDistanceFromRoot)
0 commit comments