35 #include <pcl/pcl_config.h>
37 #ifndef __PCL_IO_GRABBER__
38 #define __PCL_IO_GRABBER__
47 #include <pcl/pcl_macros.h>
48 #include <pcl/io/boost.h>
49 #include <pcl/exceptions.h>
63 Grabber () : signals_ (), connections_ (), shared_connections_ () {}
66 virtual inline ~
Grabber () throw ();
72 template<typename T> boost::signals2::connection
73 registerCallback (const boost::function<T>& callback);
78 template<typename T>
bool
79 providesCallback () const;
103 isRunning () const = 0;
107 getFramesPerSecond () const = 0;
112 signalsChanged () { }
114 template<
typename T> boost::signals2::signal<T>*
115 find_signal ()
const;
117 template<
typename T>
int
120 template<
typename T>
void
121 disconnect_all_slots ();
123 template<
typename T>
void
126 template<
typename T>
void
135 template<
typename T> boost::signals2::signal<T>*
138 std::map<std::string, boost::signals2::signal_base*>
signals_;
139 std::map<std::string, std::vector<boost::signals2::connection> >
connections_;
145 for (std::map<std::string, boost::signals2::signal_base*>::iterator signal_it =
signals_.begin (); signal_it !=
signals_.end (); ++signal_it)
146 delete signal_it->second;
149 template<
typename T> boost::signals2::signal<T>*
152 typedef boost::signals2::signal<T> Signal;
154 std::map<std::string, boost::signals2::signal_base*>::const_iterator signal_it =
signals_.find (
typeid (T).name ());
156 return (dynamic_cast<Signal*> (signal_it->second));
161 template<
typename T>
void
164 typedef boost::signals2::signal<T> Signal;
168 Signal* signal =
dynamic_cast<Signal*
> (
signals_[
typeid (T).name ()]);
169 signal->disconnect_all_slots ();
173 template<
typename T>
void
177 for (std::vector<boost::signals2::shared_connection_block>::iterator cIt =
shared_connections_[
typeid (T).name ()].begin (); cIt !=
shared_connections_[
typeid (T).name ()].end (); ++cIt)
181 template<
typename T>
void
185 for (std::vector<boost::signals2::shared_connection_block>::iterator cIt =
shared_connections_[
typeid (T).name ()].begin (); cIt !=
shared_connections_[
typeid (T).name ()].end (); ++cIt)
192 for (std::map<std::string, boost::signals2::signal_base*>::iterator signal_it =
signals_.begin (); signal_it !=
signals_.end (); ++signal_it)
200 for (std::map<std::string, boost::signals2::signal_base*>::iterator signal_it =
signals_.begin (); signal_it !=
signals_.end (); ++signal_it)
205 template<
typename T>
int
208 typedef boost::signals2::signal<T> Signal;
211 std::map<std::string, boost::signals2::signal_base*>::const_iterator signal_it =
signals_.find (
typeid (T).name ());
214 Signal* signal =
dynamic_cast<Signal*
> (signal_it->second);
215 return (static_cast<int> (signal->num_slots ()));
220 template<
typename T> boost::signals2::signal<T>*
223 typedef boost::signals2::signal<T> Signal;
227 Signal* signal =
new Signal ();
228 signals_[
typeid (T).name ()] = signal;
234 template<
typename T> boost::signals2::connection
237 typedef boost::signals2::signal<T> Signal;
240 std::stringstream sstream;
242 sstream <<
"no callback for type:" <<
typeid (T).name ();
254 Signal* signal =
dynamic_cast<Signal*
> (
signals_[
typeid (T).name ()]);
255 boost::signals2::connection ret = signal->connect (callback);
263 template<
typename T>
bool
Grabber interface for PCL 1.x device drivers.
bool providesCallback() const
indicates whether a signal with given parameter-type exists or not
virtual ~Grabber()
virtual desctructor.
boost::signals2::connection registerCallback(const boost::function< T > &callback)
registers a callback function/method to a signal with the corresponding signature ...
void disconnect_all_slots()
std::map< std::string, std::vector< boost::signals2::connection > > connections_
virtual std::string getName() const =0
returns the name of the concrete subclass.
boost::signals2::signal< T > * createSignal()
std::map< std::string, boost::signals2::signal_base * > signals_
virtual void signalsChanged()
An exception that is thrown during an IO error (typical read/write errors)
boost::signals2::signal< T > * find_signal() const
std::map< std::string, std::vector< boost::signals2::shared_connection_block > > shared_connections_