Program Listing for File slot.hpp
↰ Return to documentation for file (include/ecl/sigslots_lite/slot.hpp
)
/*****************************************************************************
** Ifdefs
*****************************************************************************/
#ifndef ECL_SIGSLOTS_LITE_SLOT_HPP_
#define ECL_SIGSLOTS_LITE_SLOT_HPP_
/*****************************************************************************
** Includes
*****************************************************************************/
#include <cstddef> // defines NULL
/*****************************************************************************
** Namespaces
*****************************************************************************/
namespace ecl {
namespace lite {
/*****************************************************************************
** Slots
*****************************************************************************/
namespace sigslots {
template <typename Data>
class SlotBase {
public:
virtual void execute(Data data) = 0;
};
template <typename Data, typename FunctionClass>
class MemberSlot : public SlotBase<Data> {
public:
MemberSlot() {}
MemberSlot(void (FunctionClass::*func)(Data), FunctionClass &instance) :
object(&instance),
member_function(func)
{}
void execute(Data data) {
(*object.*member_function)(data);
}
FunctionClass *object;
void (FunctionClass::*member_function)(Data);
private:
};
template <typename Data>
class GlobalSlot : public SlotBase<Data> {
public:
GlobalSlot() : global_function(NULL) {}
GlobalSlot(void (*func)(Data)) : global_function(func) {}
void execute(Data data) {
if ( global_function != NULL ) {
(*global_function)(data);
}
}
void (*global_function)(Data);
};
/*****************************************************************************
** Slot Specialisations
*****************************************************************************/
template <>
class SlotBase<void> {
public:
virtual void execute() = 0;
};
template <typename FunctionClass>
class MemberSlot<void,FunctionClass> : public SlotBase<void> {
public:
MemberSlot() {}
MemberSlot(void (FunctionClass::*func)(void), FunctionClass &instance) :
object(&instance),
member_function(func)
{}
void execute() {
(*object.*member_function)();
}
FunctionClass *object;
void (FunctionClass::*member_function)(void);
private:
};
template <>
class GlobalSlot<void> : public SlotBase<void> {
public:
GlobalSlot() : global_function(NULL) {}
GlobalSlot(void (*func)(void)) : global_function(func) {}
void execute() {
if ( global_function != NULL ) {
(*global_function)();
}
}
void (*global_function)(void);
};
} // namespace sigslots
} // namespace lite
} // namespace ecl
#endif /* ECL_SIGSLOTS_LITE_SLOT_HPP_ */