Program Listing for File slot.hpp

Return to documentation for file (/tmp/ws/src/ecl_lite/ecl_sigslots_lite/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_ */