35 #include <Pt/Callable.h>
37 #include <type_traits>
46 BindAdaptorBase(
const Slot& s,
const T& a)
51 BindAdaptorBase(
const BindAdaptorBase& c)
52 : _slot( c._slot->clone() )
59 BindAdaptorBase& operator=(
const BindAdaptorBase& b)
64 Slot* s = b.slot().clone();
77 const Slot& slot()
const
92 namespace SigSlotDetail {
94 template <
typename R,
typename Tuple,
typename Indices>
97 template <
typename R,
typename Tuple, std::size_t... Is>
98 class BindAdaptor<R, Tuple, std::index_sequence<Is...>>
99 :
public Callable<R, typename std::tuple_element<Is, Tuple>::type...>
100 ,
public BindAdaptorBase<
101 typename std::tuple_element<std::tuple_size<Tuple>::value - 1, Tuple>::type>
104 typedef typename std::tuple_element<std::tuple_size<Tuple>::value - 1, Tuple>::type BoundT;
105 typedef BasicSlot<R, typename std::tuple_element<Is, Tuple>::type...> SlotBase;
106 typedef BasicSlot<R, typename std::tuple_element<Is, Tuple>::type..., BoundT> FullSlotBase;
107 typedef Callable<R, typename std::tuple_element<Is, Tuple>::type...> CallableBase;
108 typedef Callable<R, typename std::tuple_element<Is, Tuple>::type..., BoundT> FullCallable;
111 BindAdaptor(
const FullSlotBase& slot,
const BoundT& arg)
112 : BindAdaptorBase<BoundT>(slot, arg)
115 CallableBase* clone()
const
117 return new BindAdaptor(*
this);
121 R call(
typename std::tuple_element<Is, Tuple>::type... args)
const
123 const FullCallable* callable =
124 static_cast<const FullCallable*
>( this->slot().callable() );
125 return callable->call(args..., this->arg());
129 void invoke(
typename std::tuple_element<Is, Tuple>::type... args)
const
131 const FullCallable* callable =
132 static_cast<const FullCallable*
>( this->slot().callable() );
133 callable->call(args..., this->arg());
146 template <
typename R,
typename Tuple,
typename Indices>
148 :
public SigSlotDetail::BindAdaptor<R, Tuple, Indices>::SlotBase
150 typedef SigSlotDetail::BindAdaptor<R, Tuple, Indices> AdaptorT;
153 template <
typename T>
154 BoundSlot(
const typename AdaptorT::FullSlotBase&
slot,
const T& arg)
155 : _adaptor(
slot, arg)
164 virtual const Callback* callable()
const
169 virtual void onConnect(
const Connection& connection)
171 _adaptor.slot().onConnect(connection);
174 virtual void onDisconnect(
const Connection& connection)
176 _adaptor.slot().onDisconnect(connection);
179 virtual bool equals(
const Slot&
slot)
const
181 return _adaptor.slot().equals(
slot);
188 namespace SigSlotDetail {
190 template <
typename R,
typename Tuple>
191 struct BoundSlotTraits;
193 template <
typename R,
typename A,
typename... As>
194 struct BoundSlotTraits<R, std::tuple<A, As...>>
197 std::tuple<A, As...>,
198 std::make_index_sequence<
sizeof...(As)>> Type;
210 template <
typename R,
typename... As,
typename T>
211 typename SigSlotDetail::BoundSlotTraits<R, std::tuple<As...>>::Type
214 typedef typename SigSlotDetail::BoundSlotTraits<R, std::tuple<As...>>::Type BoundSlotT;
215 return BoundSlotT(slot, arg);