37 #include <pcl/pcl_config.h>
49 #include <pcl/exceptions.h>
50 #include <boost/signals2.hpp>
89 virtual inline ~
Grabber () noexcept {}
98 template<
typename T> boost::signals2::connection
99 registerCallback (
const std::function<T>& callback);
104 template<
typename T>
bool
105 providesCallback () const noexcept;
130 getName () const = 0;
136 isRunning () const = 0;
140 getFramesPerSecond () const = 0;
145 signalsChanged () { }
147 template<
typename T> boost::signals2::signal<T>*
148 find_signal () const noexcept;
150 template<typename T>
int
151 num_slots () const noexcept;
153 template<typename T>
void
154 disconnect_all_slots ();
156 template<typename T>
void
159 template<typename T>
void
168 template<typename T>
boost::signals2::signal<T>*
171 std::map<std::
string, std::unique_ptr<
boost::signals2::signal_base>> signals_;
172 std::map<std::
string, std::vector<
boost::signals2::connection> > connections_;
173 std::map<std::
string, std::vector<
boost::signals2::shared_connection_block> > shared_connections_;
189 template<
typename T> boost::signals2::signal<T>*
192 using Signal = boost::signals2::signal<T>;
194 const auto signal_it = signals_.find (
typeid (T).name ());
195 if (signal_it != signals_.end ())
197 return (
static_cast<Signal*
> (signal_it->second.get ()));
202 template<
typename T>
void
205 const auto signal = find_signal<T> ();
206 if (signal !=
nullptr)
208 signal->disconnect_all_slots ();
212 template<
typename T>
void
215 if (connections_.find (typeid (T).name ()) != connections_.end ())
216 for (
auto &connection : shared_connections_[
typeid (T).name ()])
220 template<
typename T>
void
223 if (connections_.find (typeid (T).name ()) != connections_.end ())
224 for (
auto &connection : shared_connections_[
typeid (T).name ()])
225 connection.unblock ();
231 for (
const auto &signal : signals_)
232 for (
auto &connection : shared_connections_[signal.first])
239 for (
const auto &signal : signals_)
240 for (
auto &connection : shared_connections_[signal.first])
241 connection.unblock ();
244 template<
typename T>
int
247 const auto signal = find_signal<T> ();
248 if (signal !=
nullptr)
250 return static_cast<int> (signal->num_slots ());
255 template<
typename T> boost::signals2::signal<T>*
258 using Signal = boost::signals2::signal<T>;
259 using Base = boost::signals2::signal_base;
266 operator std::unique_ptr<Base>()
const {
return std::make_unique<Signal>(); }
269 #ifdef __cpp_structured_bindings
270 const auto [iterator, success] =
272 typename decltype(signals_)::const_iterator iterator;
274 std::tie (iterator, success) =
277 #ifdef __cpp_lib_map_try_emplace
278 signals_.try_emplace (
282 std::string (typeid (T).name ()), DefferedPtr ());
287 return static_cast<Signal*
> (iterator->second.get ());
290 template<
typename T> boost::signals2::connection
293 const auto signal = find_signal<T> ();
294 if (signal ==
nullptr)
296 std::stringstream sstream;
298 sstream <<
"no callback for type:" <<
typeid (T).name ();
300 PCL_THROW_EXCEPTION (
pcl::IOException,
"[" << getName () <<
"] " << sstream.str ());
303 boost::signals2::connection ret = signal->connect (callback);
305 connections_[
typeid (T).name ()].push_back (ret);
306 shared_connections_[
typeid (T).name ()].push_back (boost::signals2::shared_connection_block (connections_[
typeid (T).name ()].back (),
false));
311 template<
typename T>
bool
314 return find_signal<T> ();
Grabber interface for PCL 1.x device drivers.
Grabber(Grabber &&)=default
Move ctor.
Grabber & operator=(Grabber &&)=default
Move assign operator.
bool providesCallback() const noexcept
indicates whether a signal with given parameter-type exists or not
boost::signals2::signal< T > * find_signal() const noexcept
Grabber(const Grabber &)=delete
No copy ctor since Grabber can't be copied.
int num_slots() const noexcept
boost::signals2::signal< T > * createSignal()
Grabber()=default
Default ctor.
Grabber & operator=(const Grabber &)=delete
No copy assign operator since Grabber can't be copied.
virtual ~Grabber() noexcept=default
virtual destructor.
void disconnect_all_slots()
boost::signals2::connection registerCallback(const std::function< T > &callback)
registers a callback function/method to a signal with the corresponding signature
An exception that is thrown during an IO error (typical read/write errors)
Defines all the PCL and non-PCL macros used.