37 #ifndef __PCL_IO_GRABBER__
38 #define __PCL_IO_GRABBER__
44 #include <boost/signals2.hpp>
45 #include <boost/signals2/slot.hpp>
64 Grabber () : signals_ (), connections_ (), shared_connections_ () {}
67 virtual inline ~
Grabber () throw ();
73 template<typename T> boost::signals2::connection
74 registerCallback (const boost::function<T>& callback);
79 template<typename T>
bool
80 providesCallback () const;
104 isRunning () const = 0;
108 getFramesPerSecond () const = 0;
113 signalsChanged () { }
115 template<
typename T> boost::signals2::signal<T>*
116 find_signal ()
const;
118 template<
typename T>
int
121 template<
typename T>
void
122 disconnect_all_slots ();
124 template<
typename T>
void
127 template<
typename T>
void
136 template<
typename T> boost::signals2::signal<T>*
139 std::map<std::string, boost::signals2::signal_base*> signals_;
140 std::map<std::string, std::vector<boost::signals2::connection> > connections_;
141 std::map<std::string, std::vector<boost::signals2::shared_connection_block> > shared_connections_;
146 for (std::map<std::string, boost::signals2::signal_base*>::iterator signal_it = signals_.begin (); signal_it != signals_.end (); ++signal_it)
147 delete signal_it->second;
150 template<
typename T> boost::signals2::signal<T>*
151 Grabber::find_signal ()
const
153 typedef boost::signals2::signal<T> Signal;
155 std::map<std::string, boost::signals2::signal_base*>::const_iterator signal_it = signals_.find (
typeid (T).name ());
156 if (signal_it != signals_.end ())
157 return (dynamic_cast<Signal*> (signal_it->second));
162 template<
typename T>
void
163 Grabber::disconnect_all_slots ()
165 typedef boost::signals2::signal<T> Signal;
167 if (signals_.find (typeid (T).name ()) != signals_.end ())
169 Signal* signal =
dynamic_cast<Signal*
> (signals_[
typeid (T).name ()]);
170 signal->disconnect_all_slots ();
174 template<
typename T>
void
175 Grabber::block_signal ()
177 if (connections_.find (typeid (T).name ()) != connections_.end ())
178 for (std::vector<boost::signals2::shared_connection_block>::iterator cIt = shared_connections_[
typeid (T).name ()].begin (); cIt != shared_connections_[
typeid (T).name ()].end (); ++cIt)
182 template<
typename T>
void
183 Grabber::unblock_signal ()
185 if (connections_.find (typeid (T).name ()) != connections_.end ())
186 for (std::vector<boost::signals2::shared_connection_block>::iterator cIt = shared_connections_[
typeid (T).name ()].begin (); cIt != shared_connections_[
typeid (T).name ()].end (); ++cIt)
191 Grabber::block_signals ()
193 for (std::map<std::string, boost::signals2::signal_base*>::iterator signal_it = signals_.begin (); signal_it != signals_.end (); ++signal_it)
194 for (std::vector<boost::signals2::shared_connection_block>::iterator cIt = shared_connections_[signal_it->first].begin (); cIt != shared_connections_[signal_it->first].end (); ++cIt)
199 Grabber::unblock_signals ()
201 for (std::map<std::string, boost::signals2::signal_base*>::iterator signal_it = signals_.begin (); signal_it != signals_.end (); ++signal_it)
202 for (std::vector<boost::signals2::shared_connection_block>::iterator cIt = shared_connections_[signal_it->first].begin (); cIt != shared_connections_[signal_it->first].end (); ++cIt)
206 template<
typename T>
int
207 Grabber::num_slots ()
const
209 typedef boost::signals2::signal<T> Signal;
212 std::map<std::string, boost::signals2::signal_base*>::const_iterator signal_it = signals_.find (
typeid (T).name ());
213 if (signal_it != signals_.end ())
215 Signal* signal =
dynamic_cast<Signal*
> (signal_it->second);
216 return (static_cast<int> (signal->num_slots ()));
221 template<
typename T> boost::signals2::signal<T>*
222 Grabber::createSignal ()
224 typedef boost::signals2::signal<T> Signal;
226 if (signals_.find (typeid (T).name ()) == signals_.end ())
228 Signal* signal =
new Signal ();
229 signals_[
typeid (T).name ()] = signal;
235 template<
typename T> boost::signals2::connection
238 typedef boost::signals2::signal<T> Signal;
239 if (signals_.find (typeid (T).name ()) == signals_.end ())
241 std::stringstream sstream;
243 sstream <<
"no callback for type:" <<
typeid (T).name ();
255 Signal* signal =
dynamic_cast<Signal*
> (signals_[
typeid (T).name ()]);
256 boost::signals2::connection ret = signal->connect (callback);
258 connections_[
typeid (T).name ()].push_back (ret);
259 shared_connections_[
typeid (T).name ()].push_back (boost::signals2::shared_connection_block (connections_[
typeid (T).name ()].back (),
false));
264 template<
typename T>
bool
267 if (signals_.find (typeid (T).name ()) == signals_.end ())