44 template<
class DataType>
class Signal;
45 template<
class DataType>
class Base_Slot;
46 template<
class ObjectType,
class DataType>
class Slot;
112 template<
class DataType>
119 Signal(
const std::string signal_name =
"Unamed Signal",
const bool single_shot =
false,
const bool enable_debug =
false);
142 void set_name(
const std::string &signal_name);
145 void set_debug(
const bool enable_debug =
true);
152 typedef typename std::list<Base_Slot<DataType>*, std::allocator< Base_Slot<DataType>* > >::iterator
Base_Slot_Iterator;
156 std::list<Base_Slot<DataType>*, std::allocator<Base_Slot<DataType>* > >
connected_slots;
172 template<
class DataType>
176 friend class Signal<DataType>;
179 Base_Slot(
const std::string slot_name =
"Unamed Base_Slot");
185 void set_name(
const std::string &slot_name);
193 typedef typename std::list<Signal<DataType>*, std::allocator< Signal<DataType>* > >::iterator
Signal_Iterator;
208 template<
class ObjectType,
class DataType>
213 Slot(
const std::string _name =
"Unamed Slot");
216 void forward(ObjectType *object_pointer,
void(ObjectType::*object_function_pointer)(DataType u));
228 void(ObjectType::*pm)(DataType signal);
235 template<
class ObjectType,
class DataType>
240 ATimer(
const std::string
Name =
"Unamed ATimer") {
243 time_out_signal->connect(time_out_slot);
248 void forward(ObjectType *po,
void(ObjectType::*pm)(DataType u)) { time_out_slot->forward(po, pm); }
251 void set(DataType u,
const Ttype delta_t) {
252 time_out_signal->operator()(u, delta_t);
256 void cancel() { time_out_signal->
cancel(); }
259 void set_name(
const std::string Name) {
261 time_out_signal->set_name(name);
270 Signal<DataType> *time_out_signal;
271 Slot<ObjectType, DataType> *time_out_slot;
284 template <
class THandler>
289 TTimer(THandler & handler,
void (THandler::*handlerFunction)(
Ttype time)) :
290 signal(
"timer_signal", true) {
294 registered_handler = &handler;
295 registered_handler_function = handlerFunction;
323 delta_time = time - current_time;
349 (*registered_handler.*registered_handler_function)(currentTime);
366 THandler *registered_handler;
367 void(THandler::*registered_handler_function)(
Ttype expiry_time);
380 template<
class DataType>
385 single = single_shot;
386 set_name(signal_name);
387 set_debug(enable_debug);
390 template<
class DataType>
394 begin = connected_slots.begin(),
395 end = connected_slots.end(),
398 for (i = begin; i != end; i++)
399 (*i)->_disconnect(
this);
401 connected_slots.clear();
407 template<
class DataType>
413 template<
class DataType>
416 debug = enable_debug;
419 template<
class DataType>
423 begin = connected_slots.begin(),
424 end = connected_slots.end(),
427 bool is_already_connected =
false;
429 for (i = begin; i != end; i++)
431 is_already_connected =
true;
433 if (!is_already_connected) {
434 connected_slots.push_back(slot);
438 std::cout <<
"Signal '" << name <<
"' and Slot '" << slot->
name <<
"' are already connected. Multiple connections have no effect!" << std::endl;
442 template<
class DataType>
446 begin = connected_slots.begin(),
447 end = connected_slots.end(),
450 for (i = begin; i != end; i++)
452 (*i)->_disconnect(
this);
453 connected_slots.erase(i);
458 template<
class DataType>
465 std::cout <<
"Warning: Changing time for Signal '" << name <<
"'." << std::endl;
467 operator()(signal, delta_time);
483 template<
class DataType>
486 if (armed && single) {
494 template<
class DataType>
500 begin = connected_slots.begin(),
501 end = connected_slots.end(),
504 for (i = begin; i != end; i++) {
506 std::cout <<
"Time = " <<
Event_Queue::now() <<
". Signal '" << name <<
"' was sent to Slot '" << (*i)->name <<
"'." << std::endl;
511 template<
class DataType>
515 begin = connected_slots.begin(),
516 end = connected_slots.end(),
519 for (i = begin; i != end; i++)
521 connected_slots.erase(i);
527 template<
class DataType>
533 template<
class DataType>
539 template<
class DataType>
544 begin = connected_signals.begin(),
545 end = connected_signals.end(),
548 for (i = begin; i != end; i++)
549 (*i)->_disconnect(
this);
551 connected_signals.clear();
554 template<
class DataType>
557 connected_signals.push_back(signal);
560 template<
class DataType>
565 begin = connected_signals.begin(),
566 end = connected_signals.end(),
569 for (i = begin; i != end; i++)
570 if ((*i) == signal) {
571 connected_signals.erase(i);
576 template<
class ObjectType,
class DataType>
583 template<
class ObjectType,
class DataType>
586 template<
class ObjectType,
class DataType>
589 pm = object_function_pointer;
599 template<
class ObjectType,
class DataType>
610 #endif // #ifndef SIGNAL_SLOT_H