Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -289,15 +289,15 @@ class World
class ObserverHandle
{
public:
ObserverHandle() : observer_(nullptr)
ObserverHandle() : observer_()
{
}

private:
ObserverHandle(const Observer* o) : observer_(o)
ObserverHandle(const std::shared_ptr<Observer>& o) : observer_(o)
{
}
const Observer* observer_;
std::weak_ptr<Observer> observer_;
friend class World;
};

Expand Down Expand Up @@ -349,6 +349,6 @@ class World
};

/// All registered observers of this world representation
std::vector<Observer*> observers_;
std::vector<std::shared_ptr<Observer>> observers_;
};
} // namespace collision_detection
11 changes: 5 additions & 6 deletions moveit_core/collision_detection/src/world.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ void World::updateGlobalPosesInternal(ObjectPtr& obj, bool update_shape_poses, b

World::ObserverHandle World::addObserver(const ObserverCallbackFn& callback)
{
const auto o = new Observer(callback);
const auto o = std::make_shared<Observer>(callback);
observers_.push_back(o);
return ObserverHandle(o);
}
Expand All @@ -411,9 +411,8 @@ void World::removeObserver(ObserverHandle observer_handle)
{
for (auto obs = observers_.begin(); obs != observers_.end(); ++obs)
{
if (*obs == observer_handle.observer_)
if (obs->get() == observer_handle.observer_.lock().get())
{
delete *obs;
observers_.erase(obs);
return;
}
Expand All @@ -428,15 +427,15 @@ void World::notifyAll(Action action)

void World::notify(const ObjectConstPtr& obj, Action action)
{
for (Observer* observer : observers_)
for (const auto& observer : observers_)
observer->callback_(obj, action);
}

void World::notifyObserverAllObjects(const ObserverHandle observer_handle, Action action) const
{
for (auto observer : observers_)
for (const auto& observer : observers_)
{
if (observer == observer_handle.observer_)
if (observer.get() == observer_handle.observer_.lock().get())
{
// call the callback for each object
for (const auto& object : objects_)
Expand Down