diff --git a/Sofa/framework/Core/simutest/objectmodel/BaseLink_simutest.cpp b/Sofa/framework/Core/simutest/objectmodel/BaseLink_simutest.cpp index a895d4bf6c4..f21dd0c4642 100644 --- a/Sofa/framework/Core/simutest/objectmodel/BaseLink_simutest.cpp +++ b/Sofa/framework/Core/simutest/objectmodel/BaseLink_simutest.cpp @@ -19,6 +19,7 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ +#include #include using sofa::core::objectmodel::Base ; using sofa::core::objectmodel::ComponentState; @@ -31,6 +32,7 @@ using sofa::simulation::Node ; #include using sofa::core::objectmodel::BaseObject; +using sofa::core::objectmodel::BaseComponent; #include using sofa::core::PathResolver; @@ -56,6 +58,7 @@ class BaseLink_test : public BaseSimulationTest, scene << "" " \n" " \n" + " \n" " \n" " \n" " \n" @@ -79,6 +82,38 @@ class BaseLink_test : public BaseSimulationTest, } }; +class FakeComponent : public BaseComponent { +public: + SOFA_CLASS(FakeComponent, BaseComponent); + + sofa::MultiLink l_target; + + FakeComponent() + : l_target(initLink("target", "link for test")) { + } +}; + +TEST_F(BaseLink_test, remove) +{ + FakeComponent owner; + FakeComponent target1; + FakeComponent target2; + + ASSERT_FALSE(owner.l_target.remove(&target1)); + + ASSERT_TRUE(owner.l_target.add(&target1, "")); + ASSERT_TRUE(owner.l_target.add(&target2, "")); + ASSERT_EQ(owner.l_target.size(), size_t(2)); + ASSERT_EQ(owner.l_target.get(0), &target1); + ASSERT_EQ(owner.l_target.get(1), &target2); + + ASSERT_TRUE(owner.l_target.remove(&target1)); + ASSERT_EQ(owner.l_target.size(), size_t(1)); + ASSERT_EQ(owner.l_target.get(0), &target2); + + ASSERT_FALSE(owner.l_target.remove(&target1)); + ASSERT_FALSE(owner.l_target.remove(nullptr)); +} //////////////////////// Testing valid path ////////////////////////////////////// class MultiLink_simutest : public BaseLink_test {}; diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseComponent.cpp b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseComponent.cpp index 656955cdd71..c611e7b7a3c 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 70a0674af2f..11a9c821a38 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/Node.cpp @@ -654,7 +654,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 ) ) @@ -1192,7 +1192,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); }