diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseComponent.cpp b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseComponent.cpp index 827aa9659bb..97012792575 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseComponent.cpp +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseComponent.cpp @@ -224,7 +224,7 @@ void BaseComponent::addSlave(BaseComponent::SPtr s) const BaseComponent::SPtr previous = s->getMaster(); if (previous == this) return; if (previous) - previous->l_slaves.remove(s); + previous->l_slaves.remove(s.get()); l_slaves.add(s); if (previous) this->getContext()->notifyMoveSlave(previous.get(), this, s.get()); @@ -234,7 +234,7 @@ void BaseComponent::addSlave(BaseComponent::SPtr s) void BaseComponent::removeSlave(BaseComponent::SPtr s) { - if (l_slaves.remove(s)) + if (l_slaves.remove(s.get())) { this->getContext()->notifyRemoveSlave(this, s.get()); } diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseLink.h b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseLink.h index d5c71fc6d57..8106c223e84 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseLink.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseLink.h @@ -175,6 +175,8 @@ class SOFA_CORE_API BaseLink /// Change the link's target at the provided index. bool set(Base* baseptr, size_t index=0) { return _doSet_(baseptr, index); } + bool remove(Base* baseptr) {return _doRemove_(baseptr); } + protected: virtual bool _doSet_(Base* target, const size_t index=0) = 0; virtual Base* _doGetOwner_() const = 0 ; @@ -183,6 +185,7 @@ class SOFA_CORE_API BaseLink virtual bool _doAdd_(Base* target, const std::string&) = 0; virtual void _doClear_() = 0; virtual std::string _doGetLinkedPath_(const size_t=0) const = 0; + virtual bool _doRemove_(Base* target) = 0; unsigned int m_flags; std::string m_name; diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/Link.h b/Sofa/framework/Core/src/sofa/core/objectmodel/Link.h index b1519d4bc89..5571d3cc7b0 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/Link.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/Link.h @@ -408,11 +408,11 @@ class TLink : public BaseLink return add(ptr, path); } - bool remove(DestPtr v) + bool _doRemove_(Base* target) override { - if (!v) + if (!target) return false; - return removeAt(TraitsContainer::find(m_value,v)); + return removeAt(TraitsContainer::find(m_value,castTo(target))); } bool removeAt(std::size_t index) diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp index bcc0dd329fa..54f22148158 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp @@ -647,7 +647,7 @@ bool Node::doRemoveObject(sofa::core::objectmodel::BaseComponent::SPtr sobj) dmsg_warning_when(sobj == nullptr) << "Trying to remove a nullptr object"; this->clearObjectContext(sobj); - object.remove(sobj); + object.remove(sobj.get()); sofa::core::objectmodel::BaseComponent* obj = sobj.get(); if(obj != nullptr && !obj->removeInNode( this ) ) @@ -1185,7 +1185,7 @@ void Node::doRemoveChild(BaseNode::SPtr node) { const Node::SPtr dagnode = sofa::core::objectmodel::SPtr_static_cast(node); setDirtyDescendancy(); - child.remove(dagnode); + child.remove(dagnode.get()); dagnode->l_parents.remove(this); }