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