Skip to content

Commit 40ac58e

Browse files
committed
Container/NetworkPtr/attachChild: Fix distance propagation
1 parent 10c8bc7 commit 40ac58e

1 file changed

Lines changed: 17 additions & 15 deletions

File tree

modules/Container/NetworkPtr.mpp

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)