1#include <cgv/signal/abst_signal.h>
7void connect(signal<>& s,
void(*fp)())
9 s.connect(function_functor<0>(fp));
12void disconnect(signal<>& s,
void(*fp)())
14 s.disconnect(function_functor<0>(fp));
17signal_base::~signal_base()
23unsigned signal_base::get_nr_functors()
const
25 return (
unsigned) functors.size();
29void signal_base::connect_abst(functor_base* fp)
34void signal_base::link(functor_base* fp)
36 const tacker* t = fp->get_tacker();
41void signal_base::unlink(functor_base* fp)
43 const tacker* t = fp->get_tacker();
49void signal_base::connect(functor_base* fp)
52 functors.push_back(fp);
55void signal_base::disconnect(
const functor_base* fp)
58 for (i=0; i<functors.size(); ++i) {
59 if (*functors[i] == *fp) {
61 functors.erase(functors.begin()+i);
67void signal_base::disconnect(
const tacker* c)
70 for (i=0; i<functors.size(); ++i) {
71 const auto tacker = functors[i]->get_tacker();
74 functors.erase(functors.begin()+i);
81void signal_base::disconnect_all()
84 for (i=0; i<functors.size(); ++i)
89functor_base::~functor_base()
93const tacker* functor_base::get_tacker()
const
95 return dynamic_cast<const tacker*
>(
this);
98bool functor_base::operator == (
const functor_base& f)
const
100 const void *p1, *p2, *q1, *q2;
102 f.put_pointers(q1,q2);
103 return p1 == q1 && p2 == q2;
111tacker::tacker(
const tacker&)
115void tacker::tack(signal_base* s)
const
119void tacker::untack(signal_base* s)
const
125 if (--signals[s] <= 0)
126 signals.erase(signals.find(s));
131 const auto sempty = signals.empty();
132 const auto ssize = signals.size();
133 constexpr std::size_t sanity_threshold = (
unsigned short)-1;
134 if (sempty || ssize < 1 || ssize > sanity_threshold)
136 const auto s_it = signals.find(s);
137 if (s_it != signals.end())
138 if (--(s_it->second) <= 0)
143void tacker::untack_all()
const
148 while (!signals.empty())
149 signals.begin()->first->disconnect(
this);
153 unsigned num_signals = signals.size();
154 while (!signals.empty()) {
155 signals.begin()->first->disconnect(
this);
156 if (signals.size() >= num_signals)
160 num_signals = signals.size();