You.i Engine
YiSignalCallableConnection.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_SIGNAL_CALLABLE_CONNECTION_H_
3 #define _YI_SIGNAL_CALLABLE_CONNECTION_H_
4 
5 #ifndef _YI_SIGNAL_H_
6 #error "Do not include YiSignalCallableConnection.h directly. Include YiSignal.h instead."
7 #endif
8 
10 
16 template<typename CallableType, typename... SignalTypes>
18 {
19 public:
23  typedef CallableType YI_SLOT;
24 
29 
30  static_assert(Arity <= sizeof...(SignalTypes), "Cannot connect a slot of a given arity to a signal with a lower arity.");
31 
32  CYISignalCallableConnection(const CYISignalHandler *pSignalHandler, const YI_SLOT &slot, YI_CONNECTION_TYPE connectionType, const CYISignalConnectionID &connectionID = CYISignalConnectionID::CreateUnique()) :
33  CYISignalBaseConnection<SignalTypes...>(const_cast<CYISignalHandler *>(pSignalHandler), connectionType, connectionID),
34  m_slot(slot)
35  {
36  }
37 
38  virtual std::unique_ptr<CYISignalAbstractConnection> Clone(CYISignalHandler *pSignalHandler, YI_CONNECTION_TYPE eConnectionType) const override
39  {
40  return std::make_unique<CYISignalCallableConnection<CallableType, SignalTypes...>>(pSignalHandler, m_slot, eConnectionType, this->GetConnectionID());
41  }
42 
43  virtual void Emit(const SignalTypes &... args) override
44  {
45  const std::tuple<const SignalTypes &...> wrappedArgs = std::forward_as_tuple(args...);
46  EmitInternal((typename YiMakeIndexSequence<Arity>::type *)nullptr, wrappedArgs);
47  }
48 
49 protected:
50  // Note: this is non-const to allow calling functors with non-const functions
51  YI_SLOT m_slot;
52 
53 private:
54  template<int... S>
55  inline void EmitInternal(YiIndexSequence<S...> *, const std::tuple<const SignalTypes &...> &args)
56  {
57  m_slot(std::get<S>(args)...);
58  }
59 };
60 
61 #endif /* _YI_SIGNAL_CALLABLE_CONNECTION_H_ */
YiIndexSequence< S... > type
Definition: YiTypeTraits.h:508
static CYISignalConnectionID CreateUnique()
YI_SLOT m_slot
Definition: YiSignalCallableConnection.h:51
const CYISignalConnectionID & GetConnectionID() const
An object used to identify a specific CYISignal connection.
Definition: YiSignalConnectionID.h:14
The templated abstract class for signal connections.
Definition: YiSignalBaseConnection.h:26
virtual void Emit(const SignalTypes &...args) override
Definition: YiSignalCallableConnection.h:43
virtual std::unique_ptr< CYISignalAbstractConnection > Clone(CYISignalHandler *pSignalHandler, YI_CONNECTION_TYPE eConnectionType) const override
Definition: YiSignalCallableConnection.h:38
CallableType YI_SLOT
Definition: YiSignalCallableConnection.h:23
A signal connection class for connection to generic CALLABLE objects, with optional lifetime tracking...
Definition: YiSignalCallableConnection.h:17
Definition: YiSignalHandler.h:174
YI_CONNECTION_TYPE
Definition: YiSignalAbstractConnection.h:18
CYISignalCallableConnection(const CYISignalHandler *pSignalHandler, const YI_SLOT &slot, YI_CONNECTION_TYPE connectionType, const CYISignalConnectionID &connectionID=CYISignalConnectionID::CreateUnique())
Definition: YiSignalCallableConnection.h:32
static const size_t Arity
Definition: YiSignalCallableConnection.h:28
Definition: YiTypeTraits.h:569