Program Listing for File slot.hpp

Return to documentation for file (/tmp/ws/src/ecl_core/ecl_sigslots/include/ecl/sigslots/slot.hpp)

/*****************************************************************************
** Ifdefs
*****************************************************************************/

#ifndef ECL_SIGSLOTS_SLOT_HPP_
#define ECL_SIGSLOTS_SLOT_HPP_

/*****************************************************************************
** Includes
*****************************************************************************/

#include "sigslot.hpp"
#include <ecl/config/macros.hpp>
#include <ecl/utilities/void.hpp>

/*****************************************************************************
** Namespaces
*****************************************************************************/

namespace ecl {

/*****************************************************************************
** Interface [General]
*****************************************************************************/

template <typename Data=Void>
class ECL_PUBLIC Slot {
public:
    Slot(void (*f)(Data)) : sigslot(NULL) {
        sigslot = new SigSlot<Data>(f);
    }
    Slot(void (*f)(Data), const std::string &topic) : sigslot(NULL) {
        sigslot = new SigSlot<Data>(f);
        connect(topic);
    }

    template <typename C>
    Slot(void (C::*f)(Data), C &c) : sigslot(NULL) {
        sigslot = new SigSlot<Data>(f,c);
    }
    template <typename C>
    Slot(void (C::*f)(Data), C &c, const std::string& topic) : sigslot(NULL) {
        sigslot = new SigSlot<Data>(f,c);
        connect(topic);
    }

    Slot(const Slot<Data>& slot) {
        *this = slot;
        sigslot->incrHandles();
    }

    ~Slot() {
        sigslot->decrHandles();
        if ( sigslot->handles() == 0 ) {
            delete sigslot;
        }
    }
    void operator=( const Slot<Data>& slot) {
        sigslot = slot.sigslot;
    }
    const std::set<std::string>& connections() { return sigslot->subscribedTopics(); }
    void connect(const std::string& topic) {    sigslot->connectSlot(topic); }
    void disconnect() { sigslot->disconnect(); }

private:
    SigSlot<Data>* sigslot;
};

/*****************************************************************************
** Interface [Void]
*****************************************************************************/
template<>
class ECL_PUBLIC Slot<Void> {
public:
    Slot(VoidFunction f) : sigslot(NULL) {
        sigslot = new SigSlot<Void>(f);
    }
    Slot(VoidFunction f, const std::string &topic) : sigslot(NULL) {
        sigslot = new SigSlot<Void>(f);
        connect(topic);
    }
    template <typename C>
    Slot(void (C::*f)(void), C &c) : sigslot(NULL) {
        sigslot = new SigSlot<Void>(f,c);
    }
    template <typename C>
    Slot(void (C::*f)(void), C &c, const std::string &topic) : sigslot(NULL) {
        sigslot = new SigSlot<Void>(f,c);
        connect(topic);
    }
    Slot(const Slot<Void>& slot) {
        *this = slot;
        sigslot->incrHandles();
    }
    ~Slot() {
        sigslot->decrHandles();
        if ( sigslot->handles() == 0 ) {
            delete sigslot;
        }
    }
    void operator=( const Slot<Void>& slot) {
        sigslot = slot.sigslot;
    }
    void connect(const std::string& topic) {    sigslot->connectSlot(topic); }
    void disconnect() { sigslot->disconnect(); }

private:
    SigSlot<Void>* sigslot;

// unused:
//    unsigned int copies() { return sigslot->handles(); }
};

} // namespace ecl

#endif /* ECL_SIGSLOTS_SLOT_HPP_ */