@@ -70,21 +70,22 @@ template <typename... TSignals> struct DomainTrait<SignalPack<TSignals...>> {
7070template <typename S, typename F, typename ... Args>
7171using functor_t = FunctionOp<S, F, Args...>;
7272
73- template <typename D, typename S, typename F, typename ... Args >
74- using signal_node_t = SignalOpNode<D, S, functor_t <S, F, std:: decay_t <Args>...> >;
73+ template <typename D, typename S, typename TOp >
74+ using signal_op_node_t = SignalOpNode<D, S, TOp >;
7575
7676template <typename D, typename S, typename F, typename ... Args>
77- auto make_node (F &&f, Args &&... args) {
78- return std::make_shared<signal_node_t <D, S, F, Args...>>(
79- std::forward<F>(f), std::forward<Args>(args)...);
77+ auto make_op_node (F &&f, Args &&... args) {
78+ using TOp = functor_t <S, F, std::decay_t <Args>...>;
79+ return std::make_shared<signal_op_node_t <D, S, TOp>>(
80+ TOp{std::forward<F>(f), std::forward<Args>(args)...});
8081}
8182
8283template <typename F, typename ... TSignals>
8384auto make_op_signal (F &&f, TSignals &&... args) {
8485 using D = domain_t <TSignals...>;
8586 using S = std::result_of_t <F (value_t <TSignals>...)>;
8687
87- return Signal<D, S>{make_node <D, S>(
88+ return Signal<D, S>{make_op_node <D, S>(
8889 std::forward<F>(f), GetNodePtr (std::forward<TSignals>(args))...)};
8990}
9091
@@ -155,14 +156,14 @@ template <typename D, typename V, typename FIn, typename F = std::decay_t<FIn>,
155156 typename S = std::result_of_t <F(V)>>
156157auto MakeSignal (const Signal<D, V> &arg, FIn &&func) {
157158 return Signal<D, S>(
158- impl::make_node <D, S>(std::forward<FIn>(func), GetNodePtr (arg)));
159+ impl::make_op_node <D, S>(std::forward<FIn>(func), GetNodePtr (arg)));
159160}
160161
161162// Multiple args
162163template <typename D, typename S, typename F, typename Tuple, std::size_t ... I>
163164auto MakeNode (F &&f, const Tuple &tuple, std::index_sequence<I...>) {
164- return impl::make_node <D, S>(std::forward<F>(f),
165- GetNodePtr (std::get<I>(tuple))...);
165+ return impl::make_op_node <D, S>(std::forward<F>(f),
166+ GetNodePtr (std::get<I>(tuple))...);
166167}
167168
168169// Multiple args
@@ -177,7 +178,7 @@ auto MakeSignal(const SignalPack<TSignals...> &argPack, FIn &&func) {
177178}
178179
179180// /////////////////////////////////////////////////////////////////////////////////////////////////
180- // / Utils
181+ // / ValueTypeTrait
181182// /////////////////////////////////////////////////////////////////////////////////////////////////
182183
183184template <typename S> struct ValueTypeTrait { using type = S; };
@@ -198,7 +199,7 @@ template <typename D, typename S> struct Signal {
198199 using DomainT = D;
199200
200201 Signal () : ptr_{} {}
201- explicit Signal (NodePtrT p) : ptr_{p } {}
202+ explicit Signal (NodePtrT p) : ptr_{std::move (p) } {}
202203
203204 // Signal(const Signal &) = delete;
204205 // Signal& operator =(const Signal &) = delete;
@@ -251,7 +252,7 @@ auto operator+(const Signal<D, LV> &l, RV &&r) {
251252
252253template <typename D, typename LV , typename RV ,
253254 class = impl::if_not_signal_t <LV >>
254- auto operator +(LV &&l, const Signal<D, RV > && r) {
255+ auto operator +(LV &&l, const Signal<D, RV > &r) {
255256 return impl::make_op_signal (
256257 std::bind (std::plus<>(), std::forward<LV >(l), impl::_1), r);
257258}
@@ -270,7 +271,7 @@ auto operator-(const Signal<D, LV> &l, RV &&r) {
270271
271272template <typename D, typename LV , typename RV ,
272273 class = impl::if_not_signal_t <LV >>
273- auto operator -(LV &&l, const Signal<D, RV > && r) {
274+ auto operator -(LV &&l, const Signal<D, RV > &r) {
274275 return impl::make_op_signal (
275276 std::bind (std::minus<>(), std::forward<LV >(l), impl::_1), r);
276277}
@@ -289,7 +290,7 @@ auto operator*(const Signal<D, LV> &l, RV &&r) {
289290
290291template <typename D, typename LV , typename RV ,
291292 class = impl::if_not_signal_t <LV >>
292- auto operator *(LV &&l, const Signal<D, RV > && r) {
293+ auto operator *(LV &&l, const Signal<D, RV > &r) {
293294 return impl::make_op_signal (
294295 std::bind (std::multiplies<>(), std::forward<LV >(l), impl::_1), r);
295296}
@@ -308,14 +309,14 @@ auto operator/(const Signal<D, LV> &l, RV &&r) {
308309
309310template <typename D, typename LV , typename RV ,
310311 class = impl::if_not_signal_t <LV >>
311- auto operator /(LV &&l, const Signal<D, RV > && r) {
312+ auto operator /(LV &&l, const Signal<D, RV > &r) {
312313 return impl::make_op_signal (
313314 std::bind (std::divides<>(), std::forward<LV >(l), impl::_1), r);
314315}
315316
316317template <typename D, typename S>
317318Signal<D, S> operator -(const Signal<D, S> &in) {
318- return in * S{-1 };
319+ return S{-1 } * in ;
319320}
320321
321322template <typename D, typename S>
0 commit comments