allow storing arbitrary singletons in the Context
This commit is contained in:
parent
94bf5ffb8c
commit
5568cc2326
1 changed files with 38 additions and 3 deletions
|
@ -15,16 +15,24 @@
|
||||||
#ifndef RCLCPP_RCLCPP_CONTEXT_HPP_
|
#ifndef RCLCPP_RCLCPP_CONTEXT_HPP_
|
||||||
#define RCLCPP_RCLCPP_CONTEXT_HPP_
|
#define RCLCPP_RCLCPP_CONTEXT_HPP_
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#include <rclcpp/macros.hpp>
|
#include <rclcpp/macros.hpp>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
#include <typeinfo>
|
||||||
|
#include <typeindex>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include <rmw/rmw.h>
|
||||||
|
|
||||||
namespace rclcpp
|
namespace rclcpp
|
||||||
{
|
{
|
||||||
|
|
||||||
namespace context
|
namespace context
|
||||||
{
|
{
|
||||||
|
|
||||||
/* ROS Context */
|
|
||||||
class Context
|
class Context
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -32,9 +40,36 @@ public:
|
||||||
|
|
||||||
Context() {}
|
Context() {}
|
||||||
|
|
||||||
|
template<typename SubContext, typename ... Args>
|
||||||
|
std::shared_ptr<SubContext>
|
||||||
|
get_sub_context(Args && ... args)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
|
||||||
|
std::type_index type_i(typeid(SubContext));
|
||||||
|
std::shared_ptr<SubContext> sub_context;
|
||||||
|
auto it = sub_contexts_.find(type_i);
|
||||||
|
if (it == sub_contexts_.end()) {
|
||||||
|
// It doesn't exist yet, make it
|
||||||
|
sub_context = std::shared_ptr<SubContext>(
|
||||||
|
new SubContext(std::forward<Args>(args) ...),
|
||||||
|
[] (SubContext * sub_context_ptr) {
|
||||||
|
delete sub_context_ptr;
|
||||||
|
});
|
||||||
|
sub_contexts_[type_i] = sub_context;
|
||||||
|
} else {
|
||||||
|
// It exists, get it out and cast it.
|
||||||
|
sub_context = std::static_pointer_cast<SubContext>(it->second);
|
||||||
|
}
|
||||||
|
return sub_context;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RCLCPP_DISABLE_COPY(Context);
|
RCLCPP_DISABLE_COPY(Context);
|
||||||
|
|
||||||
|
std::unordered_map<std::type_index, std::shared_ptr<void>> sub_contexts_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace context */
|
} /* namespace context */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue