Go to the documentation of this file.00001
00010
00011
00012
00013
00014 #ifndef ECL_SIGSLOTS_SLOT_HPP_
00015 #define ECL_SIGSLOTS_SLOT_HPP_
00016
00017
00018
00019
00020
00021 #include "sigslot.hpp"
00022 #include <ecl/config/macros.hpp>
00023 #include <ecl/utilities/void.hpp>
00024
00025
00026
00027
00028
00029 namespace ecl {
00030
00031
00032
00033
00034
00047 template <typename Data=Void>
00048 class ECL_PUBLIC Slot {
00049 public:
00058 Slot(void (*f)(Data)) : sigslot(NULL) {
00059 sigslot = new SigSlot<Data>(f);
00060 }
00072 Slot(void (*f)(Data), const std::string &topic) : sigslot(NULL) {
00073 sigslot = new SigSlot<Data>(f);
00074 connect(topic);
00075 }
00076
00086 template <typename C>
00087 Slot(void (C::*f)(Data), C &c) : sigslot(NULL) {
00088 sigslot = new SigSlot<Data>(f,c);
00089 }
00102 template <typename C>
00103 Slot(void (C::*f)(Data), C &c, const std::string& topic) : sigslot(NULL) {
00104 sigslot = new SigSlot<Data>(f,c);
00105 connect(topic);
00106 }
00107
00119 Slot(const Slot& slot) {
00120 *this = slot;
00121 sigslot->incrHandles();
00122 }
00123
00131 ~Slot() {
00132 sigslot->decrHandles();
00133 if ( sigslot->handles() == 0 ) {
00134 delete sigslot;
00135 }
00136 }
00143 const std::set<std::string>& connections() { return sigslot->subscribedTopics(); }
00152 void connect(const std::string& topic) { sigslot->connectSlot(topic); }
00158 void disconnect() { sigslot->disconnect(); }
00159
00160 private:
00161 SigSlot<Data>* sigslot;
00162 };
00163
00164
00165
00166
00176 template<>
00177 class ECL_PUBLIC Slot<Void> {
00178 public:
00187 Slot(VoidFunction f) : sigslot(NULL) {
00188 sigslot = new SigSlot<Void>(f);
00189 }
00199 Slot(VoidFunction f, const std::string &topic) : sigslot(NULL) {
00200 sigslot = new SigSlot<Void>(f);
00201 connect(topic);
00202 }
00212 template <typename C>
00213 Slot(void (C::*f)(void), C &c) : sigslot(NULL) {
00214 sigslot = new SigSlot<Void>(f,c);
00215 }
00226 template <typename C>
00227 Slot(void (C::*f)(void), C &c, const std::string &topic) : sigslot(NULL) {
00228 sigslot = new SigSlot<Void>(f,c);
00229 connect(topic);
00230 }
00242 Slot(const Slot& slot) {
00243 *this = slot;
00244 sigslot->incrHandles();
00245 }
00253 ~Slot() {
00254 sigslot->decrHandles();
00255 if ( sigslot->handles() == 0 ) {
00256 delete sigslot;
00257 }
00258 }
00267 void connect(const std::string& topic) { sigslot->connectSlot(topic); }
00273 void disconnect() { sigslot->disconnect(); }
00274
00275 private:
00276 SigSlot<Void>* sigslot;
00277
00278
00279
00280 };
00281
00282 }
00283
00284 #endif