Program Listing for File signal.hpp
↰ Return to documentation for file (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_ */