Program Listing for File signal.hpp

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

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

#ifndef ECL_SIGSLOTS_SIGNAL_HPP_
#define ECL_SIGSLOTS_SIGNAL_HPP_

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

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

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

namespace ecl {

/*****************************************************************************
** Interface [General]
*****************************************************************************/
template <typename Data=Void>
class ECL_PUBLIC Signal {
public:
    Signal() : sigslot(NULL) {
        sigslot = new SigSlot<Data>();
    }
    Signal(const std::string &topic) : sigslot(NULL) {
        sigslot = new SigSlot<Data>();
        connect(topic);
    }

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

    ~Signal() {
        sigslot->decrHandles();
        if ( sigslot->handles() == 0 ) {
            delete sigslot;
        }
    }

    void operator=( const Signal<Data>& signal) {
        sigslot = signal.sigslot;
    }

    void connect(const std::string& topic) { sigslot->connectSignal(topic); }
    void connectAsSlot(const std::string& topic) { sigslot->connectSlot(topic); }
    void disconnect() { sigslot->disconnect(); }

    void emit(Data data) { sigslot->emit(data); }

private:
    SigSlot<Data>* sigslot;
};

/*****************************************************************************
** Interface [Void]
*****************************************************************************/
template<>
class ECL_PUBLIC Signal<Void> {
public:
    Signal() : sigslot(NULL) {
        sigslot = new SigSlot<Void>();
    }
    Signal(const std::string &topic) : sigslot(NULL) {
        sigslot = new SigSlot<Void>();
        connect(topic);
    }
    Signal(const Signal<Void>& signal) {
        *this = signal;
        sigslot->incrHandles();
    }

    void operator=( const Signal<Void>& signal) {
        sigslot = signal.sigslot;
    }

    ~Signal() {
        sigslot->decrHandles();
        if ( sigslot->handles() == 0 ) {
            delete sigslot;
        }
    }
    void connect(const std::string& topic) { sigslot->connectSignal(topic); }
    void connectAsSlot(const std::string& topic) { sigslot->connectSlot(topic); }
    void disconnect() { sigslot->disconnect(); }

    void emit() { sigslot->emit(); }

private:
    SigSlot<Void>* sigslot;

};

} // namespace ecl

#endif /* ECL_SIGSLOTS_SIGNAL_HPP_ */