Skip to content

Commit 94df1ac

Browse files
committed
Refactored MakeSignal to be consistent with rest of the new API, i.e. MakeSignal(x, func) or MakeSignal(With(x,y,z), func).
1 parent 2220475 commit 94df1ac

4 files changed

Lines changed: 100 additions & 131 deletions

File tree

include/react/Domain.h

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -124,23 +124,6 @@ class DomainBase
124124
return REACT::MakeVar<D>(std::forward<V>(value));
125125
}
126126

127-
///////////////////////////////////////////////////////////////////////////////////////////////////
128-
/// MakeSignal
129-
///////////////////////////////////////////////////////////////////////////////////////////////////
130-
template
131-
<
132-
typename FIn,
133-
typename ... TArgs,
134-
typename F = std::decay<FIn>::type,
135-
typename S = std::result_of<F(TArgs...)>::type,
136-
typename TOp = REACT_IMPL::FunctionOp<S,F,REACT_IMPL::SignalNodePtrT<D,TArgs> ...>
137-
>
138-
static auto MakeSignal(FIn&& func, const SignalT<TArgs>& ... args)
139-
-> TempSignal<D,S,TOp>
140-
{
141-
return REACT::MakeSignal<D>(std::forward<FIn>(func), args ...);
142-
}
143-
144127
///////////////////////////////////////////////////////////////////////////////////////////////////
145128
/// MakeEventSource
146129
///////////////////////////////////////////////////////////////////////////////////////////////////

include/react/ReactiveObject.h

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -122,22 +122,6 @@ class ReactiveObject
122122
return REACT::MakeVar<D>(std::forward<V>(value));
123123
}
124124

125-
///////////////////////////////////////////////////////////////////////////////////////////////
126-
/// MakeSignal
127-
///////////////////////////////////////////////////////////////////////////////////////////////
128-
template
129-
<
130-
typename FIn,
131-
typename ... TArgs,
132-
typename F = std::decay<FIn>::type,
133-
typename S = std::result_of<F(TArgs...)>::type
134-
>
135-
static auto MakeSignal(FIn&& func, const SignalT<TArgs>& ... args)
136-
-> SignalT<S>
137-
{
138-
return REACT::MakeSignal<D>(std::forward<FIn>(func), args ...);
139-
}
140-
141125
///////////////////////////////////////////////////////////////////////////////////////////////
142126
/// MakeEventSource
143127
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -165,20 +149,20 @@ class ReactiveObject
165149
#define REACTIVE_REF(obj, name) \
166150
Flatten( \
167151
MakeSignal( \
152+
obj, \
168153
[] (const REACT_IMPL::Identity<decltype(obj)>::Type::ValueT& r) \
169154
{ \
170155
using T = decltype(r.name); \
171156
return static_cast<RemoveInput<typename T::DomainT, T>::Type>(r.name); \
172-
}, \
173-
obj))
157+
}))
174158

175159
#define REACTIVE_PTR(obj, name) \
176160
Flatten( \
177161
MakeSignal( \
162+
obj, \
178163
[] (REACT_IMPL::Identity<decltype(obj)>::Type::ValueT r) \
179164
{ \
180165
REACT_ASSERT(r != nullptr); \
181166
using T = decltype(r->name); \
182167
return static_cast<RemoveInput<typename T::DomainT, T>::Type>(r->name); \
183-
}, \
184-
obj))
168+
}))

include/react/Signal.h

Lines changed: 89 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,43 @@ bool Equals(const Signal<D,L>& lhs, const Signal<D,R>& rhs)
247247

248248
/*****************************************/ REACT_BEGIN /*****************************************/
249249

250+
///////////////////////////////////////////////////////////////////////////////////////////////////
251+
/// SignalPack - Wraps several nodes in a tuple. Create with comma operator.
252+
///////////////////////////////////////////////////////////////////////////////////////////////////
253+
template
254+
<
255+
typename D,
256+
typename ... TValues
257+
>
258+
class SignalPack
259+
{
260+
public:
261+
SignalPack(const Signal<D,TValues>& ... deps) :
262+
Data{ std::tie(deps ...) }
263+
{}
264+
265+
template <typename ... TCurValues, typename TAppendValue>
266+
SignalPack(const SignalPack<D, TCurValues ...>& curArgs, const Signal<D,TAppendValue>& newArg) :
267+
Data{ std::tuple_cat(curArgs.Data, std::tie(newArg)) }
268+
{}
269+
270+
std::tuple<const Signal<D,TValues>& ...> Data;
271+
};
272+
273+
///////////////////////////////////////////////////////////////////////////////////////////////////
274+
/// With - Utility function to create a SignalPack
275+
///////////////////////////////////////////////////////////////////////////////////////////////////
276+
template
277+
<
278+
typename D,
279+
typename ... TValues
280+
>
281+
auto With(const Signal<D,TValues>& ... deps)
282+
-> SignalPack<D,TValues ...>
283+
{
284+
return SignalPack<D,TValues...>(deps ...);
285+
}
286+
250287
///////////////////////////////////////////////////////////////////////////////////////////////////
251288
/// MakeVar
252289
///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -318,24 +355,61 @@ auto MakeVar(V&& value)
318355
///////////////////////////////////////////////////////////////////////////////////////////////////
319356
/// MakeSignal
320357
///////////////////////////////////////////////////////////////////////////////////////////////////
358+
// Single arg
321359
template
322360
<
323361
typename D,
362+
typename TValue,
324363
typename FIn,
364+
typename F = std::decay<FIn>::type,
365+
typename S = std::result_of<F(TValue)>::type,
366+
typename TOp = REACT_IMPL::FunctionOp<S,F, REACT_IMPL::SignalNodePtrT<D,TValue>>
367+
>
368+
auto MakeSignal(const Signal<D,TValue>& arg, FIn&& func)
369+
-> TempSignal<D,S,TOp>
370+
{
371+
return TempSignal<D,S,TOp>(
372+
std::make_shared<REACT_IMPL::SignalOpNode<D,S,TOp>>(
373+
std::forward<FIn>(func), arg.NodePtr()));
374+
}
375+
376+
// Multiple args
377+
template
378+
<
379+
typename D,
325380
typename ... TValues,
381+
typename FIn,
326382
typename F = std::decay<FIn>::type,
327383
typename S = std::result_of<F(TValues...)>::type,
328384
typename TOp = REACT_IMPL::FunctionOp<S,F, REACT_IMPL::SignalNodePtrT<D,TValues> ...>
329385
>
330-
auto MakeSignal(FIn&& func, const Signal<D,TValues>& ... args)
386+
auto MakeSignal(const SignalPack<D,TValues...>& argPack, FIn&& func)
331387
-> TempSignal<D,S,TOp>
332388
{
333-
static_assert(sizeof...(TValues) > 0,
334-
"react::MakeSignal requires at least 1 signal dependency.");
389+
using REACT_IMPL::SignalOpNode;
335390

336-
return TempSignal<D,S,TOp>(
337-
std::make_shared<REACT_IMPL::SignalOpNode<D,S,TOp>>(
338-
std::forward<FIn>(func), args.NodePtr() ... ));
391+
using F = std::decay<FIn>::type;
392+
393+
struct NodeBuilder_
394+
{
395+
NodeBuilder_(FIn&& func) :
396+
MyFunc{ std::forward<FIn>(func) }
397+
{}
398+
399+
auto operator()(const Signal<D,TValues>& ... args)
400+
-> TempSignal<D,S,TOp>
401+
{
402+
return TempSignal<D,S,TOp>(
403+
std::make_shared<SignalOpNode<D,S,TOp>>(
404+
std::forward<FIn>(MyFunc), args.NodePtr() ...));
405+
}
406+
407+
FIn MyFunc;
408+
};
409+
410+
return REACT_IMPL::apply(
411+
NodeBuilder_{ std::forward<FIn>(func) },
412+
argPack.Data);
339413
}
340414

341415
///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -659,44 +733,7 @@ DECLARE_OP(^, BitwiseXor);
659733
#undef DECLARE_OP
660734

661735
///////////////////////////////////////////////////////////////////////////////////////////////////
662-
/// SignalPack - Wraps several nodes in a tuple. Create with comma operator.
663-
///////////////////////////////////////////////////////////////////////////////////////////////////
664-
template
665-
<
666-
typename D,
667-
typename ... TValues
668-
>
669-
class SignalPack
670-
{
671-
public:
672-
SignalPack(const Signal<D,TValues>& ... deps) :
673-
Data{ std::tie(deps ...) }
674-
{}
675-
676-
template <typename ... TCurValues, typename TAppendValue>
677-
SignalPack(const SignalPack<D, TCurValues ...>& curArgs, const Signal<D,TAppendValue>& newArg) :
678-
Data{ std::tuple_cat(curArgs.Data, std::tie(newArg)) }
679-
{}
680-
681-
std::tuple<const Signal<D,TValues>& ...> Data;
682-
};
683-
684-
///////////////////////////////////////////////////////////////////////////////////////////////////
685-
/// With - Utility function to create a SignalPack
686-
///////////////////////////////////////////////////////////////////////////////////////////////////
687-
template
688-
<
689-
typename D,
690-
typename ... TValues
691-
>
692-
auto With(const Signal<D,TValues>& ... deps)
693-
-> SignalPack<D,TValues ...>
694-
{
695-
return SignalPack<D,TValues...>(deps ...);
696-
}
697-
698-
///////////////////////////////////////////////////////////////////////////////////////////////////
699-
/// Comma operator overload to create input pack from 2 signals.
736+
/// Comma operator overload to create signal pack from 2 signals.
700737
///////////////////////////////////////////////////////////////////////////////////////////////////
701738
template
702739
<
@@ -711,7 +748,7 @@ auto operator,(const Signal<D,TLeftVal>& a, const Signal<D,TRightVal>& b)
711748
}
712749

713750
///////////////////////////////////////////////////////////////////////////////////////////////////
714-
/// Comma operator overload to append node to existing input pack.
751+
/// Comma operator overload to append node to existing signal pack.
715752
///////////////////////////////////////////////////////////////////////////////////////////////////
716753
template
717754
<
@@ -725,33 +762,10 @@ auto operator,(const SignalPack<D, TCurValues ...>& cur, const Signal<D,TAppendV
725762
return SignalPack<D, TCurValues ... , TAppendValue>(cur, append);
726763
}
727764

728-
/******************************************/ REACT_END /******************************************/
729-
730-
/***************************************/ REACT_IMPL_BEGIN /**************************************/
731-
732-
template
733-
<
734-
typename D,
735-
typename F,
736-
typename ... TValues
737-
>
738-
struct ApplyHelper
739-
{
740-
static inline auto MakeSignal(F&& func, const Signal<D,TValues>& ... args)
741-
-> Signal<D, typename std::result_of<F(TValues ...)>::type>
742-
{
743-
return D::MakeSignal(std::forward<F>(func), args ...);
744-
}
745-
};
746-
747-
/****************************************/ REACT_IMPL_END /***************************************/
748-
749-
/*****************************************/ REACT_BEGIN /*****************************************/
750-
751765
///////////////////////////////////////////////////////////////////////////////////////////////////
752-
/// operator->* overload to connect inputs to a function and return the resulting node.
766+
/// operator->* overload to connect signals to a function and return the resulting signal.
753767
///////////////////////////////////////////////////////////////////////////////////////////////////
754-
// Single input
768+
// Single arg
755769
template
756770
<
757771
typename D,
@@ -761,25 +775,23 @@ template
761775
class = std::enable_if<
762776
IsSignal<TSignal<D,TValue>>::value>::type
763777
>
764-
auto operator->*(const TSignal<D,TValue>& inputNode, F&& func)
778+
auto operator->*(const TSignal<D,TValue>& arg, F&& func)
765779
-> Signal<D, typename std::result_of<F(TValue)>::type>
766780
{
767-
return D::MakeSignal(std::forward<F>(func), inputNode);
781+
return REACT::MakeSignal(arg, std::forward<F>(func));
768782
}
769783

770-
// Multiple inputs
784+
// Multiple args
771785
template
772786
<
773787
typename D,
774788
typename F,
775789
typename ... TValues
776790
>
777-
auto operator->*(const SignalPack<D,TValues ...>& inputPack, F&& func)
791+
auto operator->*(const SignalPack<D,TValues ...>& argPack, F&& func)
778792
-> Signal<D, typename std::result_of<F(TValues ...)>::type>
779793
{
780-
return apply(
781-
REACT_IMPL::ApplyHelper<D,F,TValues ...>::MakeSignal,
782-
std::tuple_cat(std::forward_as_tuple(std::forward<F>(func)), inputPack.Data));
794+
return REACT::MakeSignal(argPack, std::forward<F>(func));
783795
}
784796

785797
///////////////////////////////////////////////////////////////////////////////////////////////////

src/test/SignalTest.h

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -66,23 +66,13 @@ TYPED_TEST_P(SignalTest, Signals1)
6666
auto v3 = MyDomain::MakeVar(3);
6767
auto v4 = MyDomain::MakeVar(4);
6868

69-
auto s1 = MyDomain::MakeSignal
70-
(
71-
[] (int a, int b)
72-
{
73-
return a + b;
74-
},
75-
v1, v2
76-
);
77-
78-
auto s2 = MyDomain::MakeSignal
79-
(
80-
[] (int a, int b)
81-
{
82-
return a + b;
83-
},
84-
v3, v4
85-
);
69+
auto s1 = MakeSignal(With(v1,v2), [] (int a, int b) {
70+
return a + b;
71+
});
72+
73+
auto s2 = MakeSignal(With(v3,v4), [] (int a, int b) {
74+
return a + b;
75+
});
8676

8777
auto s3 = s1 + s2;
8878

0 commit comments

Comments
 (0)