37#include <pcl/pcl_config.h>
49#include <pcl/exceptions.h>
50#include <boost/signals2.hpp>
94 template<typename T>
boost::signals2::connection
100 template<typename T>
bool
143 template<
typename T> boost::signals2::signal<T>*
144 find_signal () const noexcept;
146 template<typename T>
int
147 num_slots () const noexcept;
149 template<typename T>
void
150 disconnect_all_slots ();
152 template<typename T>
void
155 template<typename T>
void
164 template<typename T>
boost::signals2::signal<T>*
167 std::map<std::
string, std::unique_ptr<
boost::signals2::signal_base>>
signals_;
185 template<
typename T> boost::signals2::signal<T>*
188 using Signal = boost::signals2::signal<T>;
190 const auto signal_it =
signals_.find (
typeid (T).name ());
193 return (
static_cast<Signal*
> (signal_it->second.get ()));
198 template<
typename T>
void
202 if (signal !=
nullptr)
204 signal->disconnect_all_slots ();
208 template<
typename T>
void
216 template<
typename T>
void
221 connection.unblock ();
237 connection.unblock ();
240 template<
typename T>
int
244 if (signal !=
nullptr)
246 return static_cast<int> (signal->num_slots ());
251 template<
typename T> boost::signals2::signal<T>*
254 using Signal = boost::signals2::signal<T>;
255 using Base = boost::signals2::signal_base;
262 operator std::unique_ptr<Base>()
const {
return std::make_unique<Signal>(); }
265 std::string signame{
typeid (T).name ()};
266 #ifdef __cpp_structured_bindings
267 const auto [iterator, success] =
269 typename decltype(
signals_)::const_iterator iterator;
271 std::tie (iterator, success) =
274 #ifdef __cpp_lib_map_try_emplace
279 signame, DefferedPtr ());
284 return static_cast<Signal*
> (iterator->second.get ());
287 template<
typename T> boost::signals2::connection
291 if (signal ==
nullptr)
293 std::stringstream sstream;
295 sstream <<
"no callback for type:" <<
typeid (T).name ();
300 boost::signals2::connection ret = signal->connect (callback);
308 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.