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;
57template<
class ObjectType,
class DataType>
class Slot;
123template<
class DataType>
130 Signal(
const std::string signal_name =
"Unamed Signal",
const bool single_shot =
false,
const bool enable_debug =
false);
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>
187 friend class Signal<DataType>;
190 Base_Slot(
const std::string slot_name =
"Unamed Base_Slot");
204 typedef typename std::list<Signal<DataType>*, std::allocator< Signal<DataType>* > >::iterator
Signal_Iterator;
219template<
class ObjectType,
class DataType>
224 Slot(
const std::string _name =
"Unamed Slot");
227 void forward(ObjectType *object_pointer,
void(ObjectType::*object_function_pointer)(DataType u));
239 void(ObjectType::*pm)(DataType signal);
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>
300 TTimer(THandler & handler,
void (THandler::*handlerFunction)(
Ttype time)) :
301 signal(
"timer_signal", true) {
305 registered_handler = &handler;
306 registered_handler_function = handlerFunction;
309 slot.set_name(
"timer_slot");
310 signal.set_debug(
false);
311 signal.connect(&slot);
334 delta_time = time - current_time;
360 (*registered_handler.*registered_handler_function)(currentTime);
377 THandler *registered_handler;
378 void(THandler::*registered_handler_function)(
Ttype expiry_time);
391template<
class DataType>
396 single = single_shot;
401template<
class DataType>
409 for (i = begin; i != end; i++)
410 (*i)->_disconnect(
this);
418template<
class DataType>
424template<
class DataType>
427 debug = enable_debug;
430template<
class DataType>
438 bool is_already_connected =
false;
440 for (i = begin; i != end; i++)
442 is_already_connected =
true;
444 if (!is_already_connected) {
449 std::cout <<
"Signal '" <<
name <<
"' and Slot '" << slot->
name <<
"' are already connected. Multiple connections have no effect!" << std::endl;
453template<
class DataType>
461 for (i = begin; i != end; i++)
463 (*i)->_disconnect(
this);
469template<
class DataType>
476 std::cout <<
"Warning: Changing time for Signal '" <<
name <<
"'." << std::endl;
494template<
class DataType>
497 if (armed && single) {
505template<
class DataType>
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>
530 for (i = begin; i != end; i++)
538template<
class DataType>
544template<
class DataType>
550template<
class DataType>
559 for (i = begin; i != end; i++)
560 (*i)->_disconnect(
this);
565template<
class DataType>
571template<
class DataType>
580 for (i = begin; i != end; i++)
581 if ((*i) == signal) {
587template<
class ObjectType,
class DataType>
594template<
class ObjectType,
class DataType>
597template<
class ObjectType,
class DataType>
600 pm = object_function_pointer;
610template<
class ObjectType,
class DataType>
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.
An Event class that executes a function with some data as input when the event expires.
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