You.i Engine
YiSignal.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_SIGNAL_H_
3 #define _YI_SIGNAL_H_
4 
5 #include "signal/YiSignalBase.h"
6 
7 #include <functional>
8 
163 template<typename... SignalTypes>
164 class CYISignal : public CYISignalBase
165 {
166 public:
169 
179  template<typename HandlerType, typename SlotReturnType, typename... SlotTypes>
180  bool IsConnected(const HandlerType &rSignalHandler, SlotReturnType (HandlerType::*const pSlot)(SlotTypes...)) const;
181 
191  template<typename HandlerType, typename SlotReturnType, typename... SlotTypes>
192  inline bool IsConnected(const HandlerType &rSignalHandler, SlotReturnType (HandlerType::*const pSlot)(SlotTypes...) const) const;
193 
202  template<typename SlotReturnType, typename... SlotTypes>
203  bool IsConnected(SlotReturnType (*const pSlot)(SlotTypes...)) const;
204 
218  template<typename HandlerType, typename SlotHandlerType, typename SlotReturnType, typename... SlotTypes>
219  CYISignalConnectionID Connect(HandlerType &rSignalHandler, SlotReturnType (SlotHandlerType::*const pSlot)(SlotTypes...), YI_CONNECTION_TYPE type = YI_CONNECTION_AUTO);
220 
236  template<typename HandlerType, typename SlotHandlerType, typename SlotReturnType, typename... SlotTypes>
237  inline CYISignalConnectionID Connect(const HandlerType &rSignalHandler, SlotReturnType (SlotHandlerType::*const pSlot)(SlotTypes...) const, YI_CONNECTION_TYPE type = YI_CONNECTION_AUTO);
238 
248  template<typename SlotReturnType, typename... SlotTypes>
249  CYISignalConnectionID Connect(SlotReturnType (*const pSlot)(SlotTypes...), YI_CONNECTION_TYPE type = YI_CONNECTION_AUTO);
250 
267  template<typename HandlerType, typename SlotHandlerType, typename SlotReturnType, typename... SlotTypes>
268  CYISignalConnectionID Connect(HandlerType &rSignalHandler, const std::function<SlotReturnType(SlotHandlerType &, SlotTypes...)> &slot, YI_CONNECTION_TYPE type = YI_CONNECTION_AUTO);
269 
282  template<typename CallableType>
283  CYISignalConnectionID Connect(const CallableType &callable, YI_CONNECTION_TYPE type = YI_CONNECTION_AUTO);
284 
301  template<typename CallableType>
302  CYISignalConnectionID Connect(const CYISignalHandler &rSignalHandler, const CallableType &callable, YI_CONNECTION_TYPE type = YI_CONNECTION_AUTO);
303 
315  template<typename... OtherSignalTypes>
317 
327  inline void operator()(const typename std::decay<SignalTypes>::type &... params) const;
328 
338  inline void Emit(const typename std::decay<SignalTypes>::type &... params) const;
339 
351  template<class SlotReturnType, typename SlotHandlerType, typename... SlotTypes>
352  void Disconnect(CYISignalHandler &rSignalHandler, SlotReturnType (SlotHandlerType::*const pSlot)(SlotTypes...));
353 
365  template<class SlotReturnType, typename SlotHandlerType, typename... SlotTypes>
366  inline void Disconnect(CYISignalHandler &rSignalHandler, SlotReturnType (SlotHandlerType::*const pSlot)(SlotTypes...) const);
367 
377  template<typename SlotReturnType, typename... SlotTypes>
378  void Disconnect(SlotReturnType (*const pSlot)(SlotTypes...));
379 
380 #ifndef DOXY
381  // The following definitions exist only to generate more understandable compilation errors.
385  template<typename HandlerType, typename SlotHandlerType, typename SlotReturnType, typename... SlotTypes>
386  CYISignalConnectionID Connect(const HandlerType &rSignalHandler, SlotReturnType (SlotHandlerType::*const pSlot)(SlotTypes...), YI_CONNECTION_TYPE type = YI_CONNECTION_AUTO);
387 
391  template<typename SlotHandlerType, typename SlotReturnType, typename... SlotTypes>
392  CYISignalConnectionID Connect(SlotReturnType (SlotHandlerType::*const pSlot)(SlotTypes...), YI_CONNECTION_TYPE type = YI_CONNECTION_AUTO);
393 
397  template<typename SlotHandlerType, typename SlotReturnType, typename... SlotTypes>
398  CYISignalConnectionID Connect(SlotReturnType (SlotHandlerType::*const pSlot)(SlotTypes...) const, YI_CONNECTION_TYPE type = YI_CONNECTION_AUTO);
399 #endif
400 
401 private:
402  template<typename SlotHandlerType, typename SlotReturnType, typename... SlotTypes>
403  std::list<std::unique_ptr<CYISignalAbstractConnection>>::const_iterator FindConnection(const CYISignalHandler &rSignalHandler, SlotReturnType (SlotHandlerType::*const pSlot)(SlotTypes...)) const;
404 
405  template<typename SlotHandlerType, typename SlotReturnType, typename... SlotTypes>
406  inline std::list<std::unique_ptr<CYISignalAbstractConnection>>::const_iterator FindConnection(const CYISignalHandler &rSignalHandler, SlotReturnType (SlotHandlerType::*const pSlot)(SlotTypes...) const) const;
407 
408  template<typename SlotReturnType, typename... SlotTypes>
409  std::list<std::unique_ptr<CYISignalAbstractConnection>>::const_iterator FindConnection(SlotReturnType (*const pSlot)(SlotTypes...)) const;
410 
411  void EmitInternal(const typename std::decay<SignalTypes>::type &... params);
412 };
413 
416 #include "signal/internal/YiSignal.inl"
417 
418 #endif /* _YI_SIGNAL_H_ */
virtual bool IsConnected() const override
Definition: YiSignalAbstractConnection.h:32
void Disconnect(CYISignalHandler &rSignalHandler)
void Emit(const typename std::decay< SignalTypes >::type &...params) const
The base abstract class for CYISignal.
Definition: YiSignalBase.h:23
An object used to identify a specific CYISignal connection.
Definition: YiSignalConnectionID.h:14
void Disconnect(CYISignalHandler &rSignalHandler, SlotReturnType(SlotHandlerType::*const pSlot)(SlotTypes...))
void operator()(const typename std::decay< SignalTypes >::type &...params) const
Definition: YiSignalHandler.h:174
YI_CONNECTION_TYPE
Definition: YiSignalAbstractConnection.h:18
Signals and slots are a thread-safe and flexible communication framework that will allow various obje...
Definition: YiSignal.h:164
CYISignalConnectionID Connect(HandlerType &rSignalHandler, SlotReturnType(SlotHandlerType::*const pSlot)(SlotTypes...), YI_CONNECTION_TYPE type=YI_CONNECTION_AUTO)