Parameter.hpp
Go to the documentation of this file.
1 #ifndef _ASTRA_ROS_PARAMETER_HPP_
2 #define _ASTRA_ROS_PARAMETER_HPP_
3 
4 #include <functional>
5 #include <boost/optional.hpp>
6 
7 #include <mutex>
8 
9 namespace astra_ros
10 {
15  template<typename T>
17  {
18  public:
19  typedef T ValueType;
20  typedef std::function<bool (const T &value, const T &previous)> OnChange;
21 
23  : value_(T())
24  {
25  }
26 
27  ParameterImpl(const T &value)
28  : value_(value)
29  {
30  }
31 
32  bool set(const T &value) noexcept
33  {
34  std::lock_guard<std::mutex> lock(mutex_);
35 
36  if (on_change_)
37  {
38  if ((*on_change_)(value, value_))
39  {
40  // Accept the changes
41  value_ = value;
42  return true;
43  }
44 
45  return false;
46  }
47 
48  // No handler, always accept the change
49  value_ = value;
50  return true;
51  }
52 
53  const T &get() const noexcept
54  {
55  std::lock_guard<std::mutex> lock(mutex_);
56  return value_;
57  }
58 
59  void setOnChangeHandler(const boost::optional<OnChange> &on_change)
60  {
61  on_change_ = on_change;
62  }
63 
64  const boost::optional<OnChange> &getOnChangeHandler() const
65  {
66  return on_change_;
67  }
68 
69  private:
70  mutable std::mutex mutex_;
71 
72  T value_;
73  boost::optional<OnChange> on_change_;
74  };
75 
76  // Parameter wraps a value to make it "live"
77  // A listener can register a callback when the value changes
84  template<typename T>
85  class Parameter
86  {
87  public:
90 
96  : impl_(std::make_shared<ParameterImpl<T>>())
97  {
98  }
99 
104  Parameter(const T &value)
105  : impl_(std::make_shared<ParameterImpl<T>>(value))
106  {
107  }
108 
113  bool set(const T &value)
114  {
115  return impl_->set(value);
116  }
117 
122  const T &get() const
123  {
124  return impl_->get();
125  }
126 
131  const T &operator *() const
132  {
133  return get();
134  }
135 
141  void setOnChangeHandler(const boost::optional<OnChange> &on_change)
142  {
143  impl_->setOnChangeHandler(on_change);
144  }
145 
150  template<typename F, typename... Args>
151  void bindOnChangeHandler(F &&f, Args &&...args)
152  {
154  }
155 
161  const boost::optional<OnChange> &getOnChangeHandler() const
162  {
163  return impl_->getOnChangeHandler();
164  }
165 
169  template<typename F, typename... Args>
170  static OnChange bind(F &&f, Args &&...args)
171  {
172  return OnChange(std::bind(f, args..., std::placeholders::_1, std::placeholders::_2));
173  }
174 
175  private:
176  std::shared_ptr<ParameterImpl<T>> impl_;
177  };
178 
179 }
180 
181 
182 
183 #endif
astra_ros::ParameterImpl::getOnChangeHandler
const boost::optional< OnChange > & getOnChangeHandler() const
Definition: Parameter.hpp:64
astra_ros::ParameterImpl
Internal implementation of a Parameter.
Definition: Parameter.hpp:16
astra_ros::Parameter::setOnChangeHandler
void setOnChangeHandler(const boost::optional< OnChange > &on_change)
Definition: Parameter.hpp:141
astra_ros::ParameterImpl::value_
T value_
Definition: Parameter.hpp:72
astra_ros::ParameterImpl::ParameterImpl
ParameterImpl(const T &value)
Definition: Parameter.hpp:27
astra_ros::ParameterImpl::mutex_
std::mutex mutex_
Definition: Parameter.hpp:70
astra_ros::Parameter::Parameter
Parameter(const T &value)
Definition: Parameter.hpp:104
astra_ros::ParameterImpl::set
bool set(const T &value) noexcept
Definition: Parameter.hpp:32
f
f
astra_ros::Parameter::bindOnChangeHandler
void bindOnChangeHandler(F &&f, Args &&...args)
Definition: Parameter.hpp:151
astra_ros::Parameter::bind
static OnChange bind(F &&f, Args &&...args)
Definition: Parameter.hpp:170
astra_ros::Parameter
A "live" value that can be changed at runtime. Changes are broadcast to a listener.
Definition: Parameter.hpp:85
astra_ros::Parameter::impl_
std::shared_ptr< ParameterImpl< T > > impl_
Definition: Parameter.hpp:176
astra_ros::Parameter::ValueType
ParameterImpl< T >::ValueType ValueType
Definition: Parameter.hpp:88
astra_ros::Parameter::set
bool set(const T &value)
Definition: Parameter.hpp:113
astra_ros::ParameterImpl::on_change_
boost::optional< OnChange > on_change_
Definition: Parameter.hpp:73
astra_ros::Parameter::get
const T & get() const
Definition: Parameter.hpp:122
astra_ros::ParameterImpl::ValueType
T ValueType
Definition: Parameter.hpp:19
astra_ros::Parameter::operator*
const T & operator*() const
Definition: Parameter.hpp:131
astra_ros::ParameterImpl::get
const T & get() const noexcept
Definition: Parameter.hpp:53
astra_ros::Parameter::Parameter
Parameter()
Definition: Parameter.hpp:95
std
astra_ros::Parameter::getOnChangeHandler
const boost::optional< OnChange > & getOnChangeHandler() const
Definition: Parameter.hpp:161
args
astra_ros::Parameter::OnChange
ParameterImpl< T >::OnChange OnChange
Definition: Parameter.hpp:89
astra_ros::ParameterImpl::OnChange
std::function< bool(const T &value, const T &previous)> OnChange
Definition: Parameter.hpp:20
astra_ros::ParameterImpl::setOnChangeHandler
void setOnChangeHandler(const boost::optional< OnChange > &on_change)
Definition: Parameter.hpp:59
astra_ros::ParameterImpl::ParameterImpl
ParameterImpl()
Definition: Parameter.hpp:22
astra_ros
Definition: Device.hpp:14


astra_ros
Author(s): Braden McDorman
autogenerated on Wed Mar 2 2022 00:53:06