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;
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 ());
155 if (signal_it != signals_.end ())
156 return (dynamic_cast<Signal*> (signal_it->second));
161 template<
typename T>
void 164 typedef boost::signals2::signal<T> Signal;
166 if (signals_.find (typeid (T).name ()) != signals_.end ())
168 Signal* signal =
dynamic_cast<Signal*
> (signals_[
typeid (T).name ()]);
169 signal->disconnect_all_slots ();
173 template<
typename T>
void 176 if (connections_.find (typeid (T).name ()) != connections_.end ())
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 184 if (connections_.find (typeid (T).name ()) != connections_.end ())
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)
193 for (std::vector<boost::signals2::shared_connection_block>::iterator cIt = shared_connections_[signal_it->first].begin (); cIt != shared_connections_[signal_it->first].end (); ++cIt)
200 for (std::map<std::string, boost::signals2::signal_base*>::iterator signal_it = signals_.begin (); signal_it != signals_.end (); ++signal_it)
201 for (std::vector<boost::signals2::shared_connection_block>::iterator cIt = shared_connections_[signal_it->first].begin (); cIt != shared_connections_[signal_it->first].end (); ++cIt)
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 ());
212 if (signal_it != signals_.end ())
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;
225 if (signals_.find (typeid (T).name ()) == signals_.end ())
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;
238 if (signals_.find (typeid (T).name ()) == signals_.end ())
240 std::stringstream sstream;
242 sstream <<
"no callback for type:" <<
typeid (T).name ();
251 PCL_THROW_EXCEPTION (
pcl::IOException,
"[" << getName () <<
"] " << sstream.str ());
254 Signal* signal =
dynamic_cast<Signal*
> (signals_[
typeid (T).name ()]);
255 boost::signals2::connection ret = signal->connect (callback);
257 connections_[
typeid (T).name ()].push_back (ret);
258 shared_connections_[
typeid (T).name ()].push_back (boost::signals2::shared_connection_block (connections_[
typeid (T).name ()].back (),
false));
263 template<
typename T>
bool 266 if (signals_.find (typeid (T).name ()) == signals_.end ())
std::map< std::string, std::vector< boost::signals2::connection > > connections_
bool providesCallback() const
indicates whether a signal with given parameter-type exists or not
Grabber interface for PCL 1.x device drivers.
virtual ~Grabber()
virtual desctructor.
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)
void disconnect_all_slots()
std::map< std::string, std::vector< boost::signals2::shared_connection_block > > shared_connections_
boost::signals2::connection registerCallback(const boost::function< T > &callback)
registers a callback function/method to a signal with the corresponding signature ...
boost::signals2::signal< T > * find_signal() const