37 #include <pcl/pcl_config.h>
49 #include <pcl/io/boost.h>
50 #include <pcl/exceptions.h>
89 virtual inline ~
Grabber () noexcept {}
91 virtual inline ~
Grabber () noexcept =
default;
98 template<
typename T> boost::signals2::connection
99 registerCallback (
const std::function<T>& callback);
105 template<
typename T,
template<
typename>
class FunctionT>
106 PCL_DEPRECATED (1, 12,
"please assign the callback to a std::function.")
107 boost::signals2::connection
110 return registerCallback (std::function<T> (callback));
116 template<
typename T>
bool
117 providesCallback () const noexcept;
142 getName () const = 0;
148 isRunning () const = 0;
152 getFramesPerSecond () const = 0;
157 signalsChanged () { }
159 template<
typename T> boost::signals2::signal<T>*
160 find_signal () const noexcept;
162 template<typename T>
int
163 num_slots () const noexcept;
165 template<typename T>
void
166 disconnect_all_slots ();
168 template<typename T>
void
171 template<typename T>
void
180 template<typename T>
boost::signals2::signal<T>*
183 std::map<std::
string, std::unique_ptr<
boost::signals2::signal_base>> signals_;
184 std::map<std::
string, std::vector<
boost::signals2::connection> > connections_;
185 std::map<std::
string, std::vector<
boost::signals2::shared_connection_block> > shared_connections_;
201 template<
typename T> boost::signals2::signal<T>*
204 using Signal = boost::signals2::signal<T>;
206 const auto signal_it = signals_.find (
typeid (T).name ());
207 if (signal_it != signals_.end ())
209 return (
static_cast<Signal*
> (signal_it->second.get ()));
214 template<
typename T>
void
217 const auto signal = find_signal<T> ();
218 if (signal !=
nullptr)
220 signal->disconnect_all_slots ();
224 template<
typename T>
void
227 if (connections_.find (typeid (T).name ()) != connections_.end ())
228 for (
auto &connection : shared_connections_[
typeid (T).name ()])
232 template<
typename T>
void
235 if (connections_.find (typeid (T).name ()) != connections_.end ())
236 for (
auto &connection : shared_connections_[
typeid (T).name ()])
237 connection.unblock ();
243 for (
const auto &signal : signals_)
244 for (
auto &connection : shared_connections_[signal.first])
251 for (
const auto &signal : signals_)
252 for (
auto &connection : shared_connections_[signal.first])
253 connection.unblock ();
256 template<
typename T>
int
259 const auto signal = find_signal<T> ();
260 if (signal !=
nullptr)
262 return static_cast<int> (signal->num_slots ());
267 template<
typename T> boost::signals2::signal<T>*
270 using Signal = boost::signals2::signal<T>;
271 using Base = boost::signals2::signal_base;
278 operator std::unique_ptr<Base>()
const {
return std::make_unique<Signal>(); }
281 #ifdef __cpp_structured_bindings
282 const auto [iterator, success] =
284 typename decltype(signals_)::const_iterator iterator;
286 std::tie (iterator, success) =
289 #ifdef __cpp_lib_map_try_emplace
290 signals_.try_emplace (
294 std::string (typeid (T).name ()), DefferedPtr ());
299 return static_cast<Signal*
> (iterator->second.get ());
302 template<
typename T> boost::signals2::connection
305 const auto signal = find_signal<T> ();
306 if (signal ==
nullptr)
308 std::stringstream sstream;
310 sstream <<
"no callback for type:" <<
typeid (T).name ();
312 PCL_THROW_EXCEPTION (
pcl::IOException,
"[" << getName () <<
"] " << sstream.str ());
315 boost::signals2::connection ret = signal->connect (callback);
317 connections_[
typeid (T).name ()].push_back (ret);
318 shared_connections_[
typeid (T).name ()].push_back (boost::signals2::shared_connection_block (connections_[
typeid (T).name ()].back (),
false));
323 template<
typename T>
bool
326 return find_signal<T> ();