32#include <itpp/itexports.h>
34#if (defined(_MSC_VER) && defined(ITPP_SHARED_LIB) && !(defined(itpp_EXPORTS) || defined(itpp_debug_EXPORTS)))
36#ifndef ITPP_PROTOCOL_EXCLUDED
37#define ITPP_PROTOCOL_EXCLUDED
38#pragma message( "PROTOCOL definitions are not available for MSVC shared builds" )
55template<
class DataType>
class Signal;
56template<
class DataType>
class Base_Slot;
57template<
class ObjectType,
class DataType>
class Slot;
123template<
class DataType>
163 typedef typename std::list<Base_Slot<DataType>*, std::allocator< Base_Slot<DataType>* > >::iterator
Base_Slot_Iterator;
167 std::list<Base_Slot<DataType>*, std::allocator<Base_Slot<DataType>* > >
connected_slots;
183template<
class DataType>
204 typedef typename std::list<Signal<DataType>*, std::allocator< Signal<DataType>* > >::iterator
Signal_Iterator;
219template<
class ObjectType,
class DataType>
246template<
class ObjectType,
class DataType>
251 ATimer(
const std::string
Name =
"Unamed ATimer") {
254 time_out_signal->connect(time_out_slot);
259 void forward(ObjectType *po,
void(ObjectType::*pm)(DataType u)) { time_out_slot->forward(po, pm); }
262 void set(DataType u,
const Ttype delta_t) {
263 time_out_signal->operator()(u, delta_t);
267 void cancel() { time_out_signal->cancel(); }
270 void set_name(
const std::string Name) {
272 time_out_signal->set_name(name);
273 time_out_slot->set_name(name);
281 Signal<DataType> *time_out_signal;
282 Slot<ObjectType, DataType> *time_out_slot;
295template <
class THandler>
301 signal(
"timer_signal",
true) {
309 slot.set_name(
"timer_slot");
360 (*registered_handler.*registered_handler_function)(
currentTime);
391template<
class DataType>
401template<
class DataType>
405 begin = connected_slots.begin(),
406 end = connected_slots.end(),
409 for (
i = begin;
i != end;
i++)
410 (*i)->_disconnect(
this);
412 connected_slots.clear();
418template<
class DataType>
424template<
class DataType>
430template<
class DataType>
434 begin = connected_slots.begin(),
435 end = connected_slots.end(),
440 for (
i = begin;
i != end;
i++)
445 connected_slots.push_back(slot);
446 slot->_connect(
this);
449 std::cout <<
"Signal '" << name <<
"' and Slot '" << slot->name <<
"' are already connected. Multiple connections have no effect!" << std::endl;
453template<
class DataType>
457 begin = connected_slots.begin(),
458 end = connected_slots.end(),
461 for (
i = begin;
i != end;
i++)
463 (*i)->_disconnect(
this);
464 connected_slots.erase(
i);
469template<
class DataType>
476 std::cout <<
"Warning: Changing time for Signal '" << name <<
"'." << std::endl;
494template<
class DataType>
497 if (armed && single) {
505template<
class DataType>
511 begin = connected_slots.begin(),
512 end = connected_slots.end(),
515 for (
i = begin;
i != end;
i++) {
517 std::cout <<
"Time = " <<
Event_Queue::now() <<
". Signal '" << name <<
"' was sent to Slot '" << (*i)->name <<
"'." << std::endl;
522template<
class DataType>
526 begin = connected_slots.begin(),
527 end = connected_slots.end(),
530 for (
i = begin;
i != end;
i++)
532 connected_slots.erase(
i);
538template<
class DataType>
544template<
class DataType>
550template<
class DataType>
555 begin = connected_signals.begin(),
556 end = connected_signals.end(),
559 for (
i = begin;
i != end;
i++)
560 (*i)->_disconnect(
this);
562 connected_signals.clear();
565template<
class DataType>
568 connected_signals.push_back(signal);
571template<
class DataType>
576 begin = connected_signals.begin(),
577 end = connected_signals.end(),
580 for (
i = begin;
i != end;
i++)
581 if ((*
i) == signal) {
582 connected_signals.erase(
i);
587template<
class ObjectType,
class DataType>
594template<
class ObjectType,
class DataType>
597template<
class ObjectType,
class DataType>
610template<
class ObjectType,
class DataType>
T & operator()(int i)
Get the i element.
void _connect(Signal< DataType > *signal)
ADD DOCUMENTATION HERE.
virtual void operator()(DataType signal)=0
ADD DOCUMENTATION HERE.
std::list< Signal< DataType > *, std::allocator< Signal< DataType > * > > connected_signals
ADD DOCUMENTATION HERE.
Base_Slot(const std::string slot_name="Unamed Base_Slot")
Default Constructor.
std::string name
ADD DOCUMENTATION HERE.
virtual ~Base_Slot()
Desctuctor.
std::list< Signal< DataType > *, std::allocator< Signal< DataType > * > >::iterator Signal_Iterator
ADD DOCUMENTATION HERE.
void set_name(const std::string &slot_name)
set slot name
void _disconnect(Signal< DataType > *signal)
ADD DOCUMENTATION HERE.
static void add(Base_Event *e)
Add event to Queue.
static Ttype now()
Return current time.
Automatic naming when saving.
void set_name(const std::string &signal_name)
set name of signal
std::string name
ADD DOCUMENTATION HERE.
std::list< Base_Slot< DataType > *, std::allocator< Base_Slot< DataType > * > > connected_slots
ADD DOCUMENTATION HERE.
void connect(Base_Slot< DataType > *slot)
Connect a slot to the signal.
void cancel()
cancel signal
Signal(const std::string signal_name="Unamed Signal", const bool single_shot=false, const bool enable_debug=false)
Default constructor.
void set_debug(const bool enable_debug=true)
Set debug mode. If true all signals are printed to stdout.
Base_Event * operator()(DataType signal, const Ttype delta_time=0)
Issue a signal.
std::list< Base_Slot< DataType > *, std::allocator< Base_Slot< DataType > * > >::iterator Base_Slot_Iterator
ADD DOCUMENTATION HERE.
void disconnect(Base_Slot< DataType > *slot=NULL)
Disconnect the slot from the signal.
void _disconnect(Base_Slot< DataType > *slot)
ADD DOCUMENTATION HERE.
void trigger(DataType u)
ADD DOCUMENTATION HERE.
void operator()(DataType u)
ADD DOCUMENTATION HERE.
void forward(ObjectType *object_pointer, void(ObjectType::*object_function_pointer)(DataType u))
ADD DOCUMENTATION HERE.
Slot(const std::string _name="Unamed Slot")
Default constructor.
bool IsPending() const
ADD DOCUMENTATION HERE.
Ttype fExpirationTime
ADD DOCUMENTATION HERE.
virtual ~TTimer()
Destructor.
void Set(Ttype time, bool relative=true)
ADD DOCUMENTATION HERE.
Ttype ExpirationTime() const
ADD DOCUMENTATION HERE.
TTimer(THandler &handler, void(THandler::*handlerFunction)(Ttype time))
Default constructor.
void Reset()
ADD DOCUMENTATION HERE.
bool fPending
Flag denoting if timer is set.
virtual void HandleProcessEvent(Ttype currentTime)
ADD DOCUMENTATION HERE.
virtual void HandleCancelEvent(Ttype)
ADD DOCUMENTATION HERE.
Definitions of an event-based simulation class.
#define it_assert(t, s)
Abort if t is not true.
double Ttype
64-bit floating point time