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
104 template<
typename T>
bool
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_;
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 ());
197 return (
static_cast<Signal*
> (signal_it->second.get ()));
202 template<
typename T>
void
206 if (signal !=
nullptr)
208 signal->disconnect_all_slots ();
212 template<
typename T>
void
220 template<
typename T>
void
225 connection.unblock ();
241 connection.unblock ();
244 template<
typename T>
int
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
282 std::string (typeid (T).name ()), DefferedPtr ());
287 return static_cast<Signal*
> (iterator->second.get ());
290 template<
typename T> boost::signals2::connection
294 if (signal ==
nullptr)
296 std::stringstream sstream;
298 sstream <<
"no callback for type:" <<
typeid (T).name ();
303 boost::signals2::connection ret = signal->connect (callback);
311 template<
typename T>
bool
virtual float getFramesPerSecond() const =0
returns fps.
bool toggle()
For devices that are streaming, stopped streams are started and running stream are stopped.
Grabber(Grabber &&)=default
Move ctor.
virtual void signalsChanged()
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.
std::map< std::string, std::unique_ptr< boost::signals2::signal_base > > signals_
virtual ~Grabber() noexcept=default
virtual destructor.
std::map< std::string, std::vector< boost::signals2::connection > > connections_
std::map< std::string, std::vector< boost::signals2::shared_connection_block > > shared_connections_
Grabber & operator=(const Grabber &)=delete
No copy assign operator since Grabber can't be copied.
void disconnect_all_slots()
virtual void start()=0
For devices that are streaming, the streams are started by calling this method.
boost::signals2::connection registerCallback(const std::function< T > &callback)
registers a callback function/method to a signal with the corresponding signature
virtual bool isRunning() const =0
Indicates whether the grabber is streaming or not.
virtual std::string getName() const =0
returns the name of the concrete subclass.
virtual void stop()=0
For devices that are streaming, the streams are stopped.
Grabber & operator=(Grabber &&)=default
Move assign operator.
An exception that is thrown during an IO error (typical read/write errors).
Defines all the PCL and non-PCL macros used.