Nymph  v1.5.2
Flow-Based Data Processing Framework
KTSlotWrapper.hh
Go to the documentation of this file.
1 /*
2  * KTSlotWrapper.hh
3  *
4  * Created on: Feb 10, 2012
5  * Author: nsoblath
6  */
7 
8 #ifndef KTSLOTWRAPPER_HH_
9 #define KTSLOTWRAPPER_HH_
10 
11 #include "KTConnection.hh"
12 #include "KTSignalWrapper.hh"
13 
14 #include <boost/function.hpp>
15 #include <boost/signals2.hpp>
16 
17 namespace Nymph
18 {
19  class SlotException : public std::logic_error
20  {
21  public:
22  SlotException(std::string const& why);
23  };
24 
25  class KTSlotWrapper : public boost::noncopyable
26  {
27  private:
29  {
30  public:
33 
34  virtual KTConnection Connect(KTSignalWrapper* signalWrap, int groupNum=-1) = 0;
35  };
36 
37  template< typename XSignature, typename XTypeContainer >
38  class KTSpecifiedInternalSlotWrapper : public KTInternalSlotWrapper, public boost::noncopyable
39  {
40  public:
41  KTSpecifiedInternalSlotWrapper(XSignature* funcPtr, XTypeContainer* typeCont=NULL) :
42  fSlot(funcPtr)
43  {
44  (void)typeCont; // to suppress warnings
45  }
47  {
48  delete fSlot;
49  }
50 
51  virtual KTConnection Connect(KTSignalWrapper* signalWrap, int groupNum=-1)
52  {
53  typedef KTSignalWrapper::KTInternalSignalWrapper SignalWrapperBase;
55 
56  SignalWrapperBase* internalSignalWrap = signalWrap->GetInternal();
57  SignalWrapper* derivedSignalWrapper = dynamic_cast< SignalWrapper* >(internalSignalWrap);
58  if (derivedSignalWrapper == NULL)
59  {
60  throw SignalException("In KTSpecifiedInternalSlotWrapper::Connect:\nUnable to cast from KTInternalSignalWrapper* to derived type.");
61  }
62  if (groupNum >= 0)
63  {
64  return derivedSignalWrapper->GetSignal()->connect(groupNum, *fSlot);
65  }
66  return derivedSignalWrapper->GetSignal()->connect(*fSlot);
67  }
68 
69  private:
70  XSignature* fSlot; // is owned by this KTSlot
71  };
72 
73  public:
74  template< typename XSignature, typename XTypeContainer >
75  KTSlotWrapper(XSignature* signalPtr, XTypeContainer* typeCont);
76  ~KTSlotWrapper();
77 
78  private:
79  KTSlotWrapper();
80 
82 
83  public:
84  void SetConnection(KTConnection conn);
85  void SetConnection(KTSignalWrapper* signalWrap, int groupNum=-1);
86  void Disconnect();
87 
88  private:
90 
91  };
92 
93  template< typename XSignature, typename XTypeContainer >
94  KTSlotWrapper::KTSlotWrapper(XSignature* signalPtr, XTypeContainer* typeCont) :
95  fSlotWrapper(new KTSpecifiedInternalSlotWrapper< XSignature, XTypeContainer >(signalPtr, typeCont)),
96  fConnection()
97  {}
98 
100  {
101  fConnection = conn;
102  return;
103  }
104 
105  inline void KTSlotWrapper::SetConnection(KTSignalWrapper* signalWrap, int groupNum)
106  {
107  fConnection = this->fSlotWrapper->Connect(signalWrap, groupNum);
108  return;
109  }
110 
112  {
113  fConnection.disconnect();
114  return;
115  }
116 
117 } /* namespace Nymph */
118 #endif /* KTSLOTWRAPPER_HH_ */
virtual KTConnection Connect(KTSignalWrapper *signalWrap, int groupNum=-1)=0
virtual KTConnection Connect(KTSignalWrapper *signalWrap, int groupNum=-1)
KTConnection fConnection
boost::signals2::connection KTConnection
Definition: KTConnection.hh:15
KTSpecifiedInternalSlotWrapper(XSignature *funcPtr, XTypeContainer *typeCont=NULL)
void SetConnection(KTConnection conn)
KTInternalSignalWrapper * GetInternal() const
KTInternalSlotWrapper * fSlotWrapper
SlotException(std::string const &why)