Skip to content

Commit 819766a

Browse files
committed
Some fixes/tweaks for higher order reactives.
1 parent d7964db commit 819766a

5 files changed

Lines changed: 83 additions & 38 deletions

File tree

include/react/Operations.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,9 @@ auto Pulse(const RSignal<D,S>& target, const REvents<D,E>& trigger)
163163
template
164164
<
165165
typename D,
166-
template <typename Domain_, typename Val_> class THandle,
167-
typename TInnerValue,
168-
class = std::enable_if<std::is_base_of<
169-
REvents<D,TInnerValue>,
170-
THandle<D,TInnerValue>>::value>::type
166+
typename TInnerValue
171167
>
172-
auto Flatten(const RSignal<D,THandle<D,TInnerValue>>& node)
168+
auto Flatten(const RSignal<D,REvents<D,TInnerValue>>& node)
173169
-> REvents<D,TInnerValue>
174170
{
175171
return REvents<D,TInnerValue>(

include/react/ReactiveObject.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class ReactiveObject
2222
////////////////////////////////////////////////////////////////////////////////////////
2323
/// Aliases
2424
////////////////////////////////////////////////////////////////////////////////////////
25+
using DomainT = D;
26+
2527
template <typename S>
2628
using Signal = RSignal<D,S>;
2729

@@ -52,7 +54,7 @@ class ReactiveObject
5254
typename V,
5355
typename S = std::decay<V>::type,
5456
class = std::enable_if<
55-
!IsSignalT<D,S>::value>::type
57+
!IsSignal<D,S>::value>::type
5658
>
5759
static auto MakeVar(V&& value)
5860
-> VarSignal<S>
@@ -69,7 +71,7 @@ class ReactiveObject
6971
typename S = std::decay<V>::type,
7072
typename TInner = S::ValueT,
7173
class = std::enable_if<
72-
IsSignalT<D,S>::value>::type
74+
IsSignal<D,S>::value>::type
7375
>
7476
static auto MakeVar(V&& value)
7577
-> VarSignal<Signal<TInner>>
@@ -110,10 +112,10 @@ class ReactiveObject
110112
#define REACTIVE_REF(obj, name) \
111113
Flatten( \
112114
MakeSignal( \
113-
[] (REACT_IMPL::Identity<decltype(obj)>::Type::ValueT::type& r) \
115+
[] (REACT_IMPL::Identity<decltype(obj)>::Type::ValueT::type r) \
114116
{ \
115-
return r.name; \
116-
}, \
117+
return static_cast<RemoveInput<DomainT, decltype(r.name)>::Type>(r.name); \
118+
}, \
117119
obj))
118120

119121
#define REACTIVE_PTR(obj, name) \
@@ -122,7 +124,7 @@ class ReactiveObject
122124
[] (REACT_IMPL::Identity<decltype(obj)>::Type::ValueT r) \
123125
{ \
124126
REACT_ASSERT(r != nullptr); \
125-
return r->name; \
127+
return static_cast<RemoveInput<DomainT, decltype(r->name)>::Type>(r->name); \
126128
}, \
127129
obj))
128130
};

include/react/Signal.h

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ template
162162
typename V,
163163
typename S = std::decay<V>::type,
164164
class = std::enable_if<
165-
! IsSignalT<D,S>::value>::type
165+
! IsReactive<D,S>::value>::type
166166
>
167167
auto MakeVar(V&& value)
168168
-> RVarSignal<D,S>
@@ -173,7 +173,7 @@ auto MakeVar(V&& value)
173173
}
174174

175175
////////////////////////////////////////////////////////////////////////////////////////
176-
/// MakeVar (higher order signal)
176+
/// MakeVar (higher order reactives)
177177
////////////////////////////////////////////////////////////////////////////////////////
178178
template
179179
<
@@ -182,7 +182,7 @@ template
182182
typename S = std::decay<V>::type,
183183
typename TInner = S::ValueT,
184184
class = std::enable_if<
185-
IsSignalT<D,S>::value>::type
185+
IsSignal<D,S>::value>::type
186186
>
187187
auto MakeVar(V&& value)
188188
-> RVarSignal<D,RSignal<D,TInner>>
@@ -192,6 +192,23 @@ auto MakeVar(V&& value)
192192
std::forward<V>(value), false));
193193
}
194194

195+
template
196+
<
197+
typename D,
198+
typename V,
199+
typename S = std::decay<V>::type,
200+
typename TInner = S::ValueT,
201+
class = std::enable_if<
202+
IsEvent<D,S>::value>::type
203+
>
204+
auto MakeVar(V&& value)
205+
-> RVarSignal<D,REvents<D,TInner>>
206+
{
207+
return RVarSignal<D,REvents<D,TInner>>(
208+
std::make_shared<REACT_IMPL::VarNode<D,REvents<D,TInner>>>(
209+
std::forward<V>(value), false));
210+
}
211+
195212
////////////////////////////////////////////////////////////////////////////////////////
196213
/// MakeVal
197214
////////////////////////////////////////////////////////////////////////////////////////
@@ -241,7 +258,7 @@ template \
241258
template <typename D_, typename V_> class TSignal, \
242259
typename TVal, \
243260
class = std::enable_if< \
244-
IsSignalT<D,TSignal<D,TVal>>::value>::type \
261+
IsSignal<D,TSignal<D,TVal>>::value>::type \
245262
> \
246263
auto operator ## op(const TSignal<D,TVal>& arg) \
247264
-> RSignal<D,decltype(op std::declval<TVal>())> \
@@ -270,9 +287,9 @@ template \
270287
typename TLeftVal, \
271288
typename TRightVal, \
272289
class = std::enable_if< \
273-
IsSignalT<D,TLeftSignal<D,TLeftVal>>::value>::type, \
290+
IsSignal<D,TLeftSignal<D,TLeftVal>>::value>::type, \
274291
class = std::enable_if< \
275-
IsSignalT<D,TRightSignal<D,TRightVal>>::value>::type \
292+
IsSignal<D,TRightSignal<D,TRightVal>>::value>::type \
276293
> \
277294
auto operator ## op(const TLeftSignal<D,TLeftVal>& lhs, \
278295
const TRightSignal<D,TRightVal>& rhs) \
@@ -295,9 +312,9 @@ template \
295312
typename TLeftVal, \
296313
typename TRightVal, \
297314
class = std::enable_if< \
298-
IsSignalT<D,TLeftSignal<D,TLeftVal>>::value>::type, \
315+
IsSignal<D,TLeftSignal<D,TLeftVal>>::value>::type, \
299316
class = std::enable_if< \
300-
! IsSignalT<D,TRightVal>::value>::type \
317+
! IsSignal<D,TRightVal>::value>::type \
301318
> \
302319
auto operator ## op(const TLeftSignal<D,TLeftVal>& lhs, \
303320
const TRightVal& rhs) \
@@ -319,9 +336,9 @@ template \
319336
template <typename D_, typename V_> class TRightSignal, \
320337
typename TRightVal, \
321338
class = std::enable_if< \
322-
! IsSignalT<D,TRightVal>::value>::type, \
339+
! IsSignal<D,TRightVal>::value>::type, \
323340
class = std::enable_if< \
324-
IsSignalT<D,TRightSignal<D,TRightVal>>::value>::type \
341+
IsSignal<D,TRightSignal<D,TRightVal>>::value>::type \
325342
> \
326343
auto operator ## op(const TLeftVal& lhs, \
327344
const TRightSignal<D,TRightVal>& rhs) \
@@ -362,9 +379,9 @@ DECLARE_OP(||);
362379
// typename TLeftVal,
363380
// typename TRightVal,
364381
// class = std::enable_if<
365-
// IsSignalT<D,TLeftSignal<D,TLeftVal>>::value>::type,
382+
// IsSignal<D,TLeftSignal<D,TLeftVal>>::value>::type,
366383
// class = std::enable_if<
367-
// IsSignalT<D,TRightSignal<D,TRightVal>>::value>::type
384+
// IsSignal<D,TRightSignal<D,TRightVal>>::value>::type
368385
//>
369386
//auto operator+(TLeftSignal<D,TLeftVal>&& lhs,
370387
// const TRightSignal<D,TRightVal>& rhs)
@@ -464,7 +481,7 @@ template
464481
template <typename D_, typename V_> class TSignal,
465482
typename TValue,
466483
class = std::enable_if<
467-
IsSignalT<D,TSignal<D,TValue>>::value>::type
484+
IsSignal<D,TSignal<D,TValue>>::value>::type
468485
>
469486
auto operator->*(const TSignal<D,TValue>& inputNode, F&& func)
470487
-> RSignal<D, typename std::result_of<F(TValue)>::type>
@@ -500,7 +517,7 @@ auto Flatten(const RSignal<D,RSignal<D,TInnerValue>>& node)
500517
{
501518
return RSignal<D,TInnerValue>(
502519
std::make_shared<REACT_IMPL::FlattenNode<D, RSignal<D,TInnerValue>, TInnerValue>>(
503-
node.GetPtr(), node().GetPtr(), false));
520+
node.GetPtr(), node.Value().GetPtr(), false));
504521
}
505522

506523
/************************************/ REACT_END /*************************************/

include/react/Traits.h

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,27 +40,57 @@ auto MakeSignal(F&& func, const RSignal<D,TArgs>& ... args)
4040
-> RSignal<D, typename std::result_of<F(TArgs...)>::type>;
4141

4242
////////////////////////////////////////////////////////////////////////////////////////
43-
/// IsSignalT
43+
/// IsSignal
4444
////////////////////////////////////////////////////////////////////////////////////////
4545
template <typename D, typename T>
46-
struct IsSignalT { static const bool value = false; };
46+
struct IsSignal { static const bool value = false; };
4747

4848
template <typename D, typename T>
49-
struct IsSignalT<D, RSignal<D,T>> { static const bool value = true; };
49+
struct IsSignal<D, RSignal<D,T>> { static const bool value = true; };
5050

5151
template <typename D, typename T>
52-
struct IsSignalT<D, RVarSignal<D,T>> { static const bool value = true; };
52+
struct IsSignal<D, RVarSignal<D,T>> { static const bool value = true; };
5353

5454
////////////////////////////////////////////////////////////////////////////////////////
55-
/// IsEventT
55+
/// IsEvent
5656
////////////////////////////////////////////////////////////////////////////////////////
5757
template <typename D, typename T>
58-
struct IsEventT { static const bool value = false; };
58+
struct IsEvent { static const bool value = false; };
5959

6060
template <typename D, typename T>
61-
struct IsEventT<D, REvents<D,T>> { static const bool value = true; };
61+
struct IsEvent<D, REvents<D,T>> { static const bool value = true; };
6262

6363
template <typename D, typename T>
64-
struct IsEventT<D, REventSource<D,T>> { static const bool value = true; };
64+
struct IsEvent<D, REventSource<D,T>> { static const bool value = true; };
65+
66+
////////////////////////////////////////////////////////////////////////////////////////
67+
/// IsReactive
68+
////////////////////////////////////////////////////////////////////////////////////////
69+
template <typename D, typename T>
70+
struct IsReactive { static const bool value = false; };
71+
72+
template <typename D, typename T>
73+
struct IsReactive<D, RSignal<D,T>> { static const bool value = true; };
74+
75+
template <typename D, typename T>
76+
struct IsReactive<D, RVarSignal<D,T>> { static const bool value = true; };
77+
78+
template <typename D, typename T>
79+
struct IsReactive<D, REvents<D,T>> { static const bool value = true; };
80+
81+
template <typename D, typename T>
82+
struct IsReactive<D, REventSource<D,T>> { static const bool value = true; };
83+
84+
////////////////////////////////////////////////////////////////////////////////////////
85+
/// RemoveInput
86+
////////////////////////////////////////////////////////////////////////////////////////
87+
template <typename D, typename T>
88+
struct RemoveInput { using Type = T; };
89+
90+
template <typename D, typename T>
91+
struct RemoveInput<D, RVarSignal<D,T>> { using Type = RSignal<D,T>; };
92+
93+
template <typename D, typename T>
94+
struct RemoveInput<D, REventSource<D,T>> { using Type = REvents<D,T>; };
6595

6696
/************************************/ REACT_END /*************************************/

src/test/SignalTest.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,16 @@ TYPED_TEST_P(SignalTest, Signals1)
100100

101101
bool b = false;
102102

103-
b = IsSignalT<MyDomain, decltype(v1)>::value;
103+
b = IsSignal<MyDomain, decltype(v1)>::value;
104104
ASSERT_TRUE(b);
105105

106-
b = IsSignalT<MyDomain, decltype(s1)>::value;
106+
b = IsSignal<MyDomain, decltype(s1)>::value;
107107
ASSERT_TRUE(b);
108108

109-
b = IsSignalT<MyDomain, decltype(s2)>::value;
109+
b = IsSignal<MyDomain, decltype(s2)>::value;
110110
ASSERT_TRUE(b);
111111

112-
b = IsSignalT<MyDomain, decltype(10)>::value;
112+
b = IsSignal<MyDomain, decltype(10)>::value;
113113
ASSERT_FALSE(b);
114114
}
115115

0 commit comments

Comments
 (0)