Skip to content

Commit a8be863

Browse files
committed
Covariance for Flatten/FlattenList/FlattenMap.
1 parent 7860d4c commit a8be863

3 files changed

Lines changed: 33 additions & 27 deletions

File tree

examples/src/BasicAlgorithms.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -391,15 +391,15 @@ void test1()
391391
auto w2 = StateVar<string>::Create(g, "Widget2");
392392
auto w3 = StateVar<string>::Create(g, "Widget3");
393393

394-
auto allWidgets = { CreateRef(w1), CreateRef(w2), CreateRef(w3) };
394+
auto allWidgets = { w1, w2, w3 };
395395

396396
auto d1 = StateVar<string>::Create(g, "Data1");
397397
auto d2 = StateVar<string>::Create(g, "Data2");
398398
auto d3 = StateVar<string>::Create(g, "Data3");
399399

400-
auto allData = { CreateRef(d1), CreateRef(d2), CreateRef(d3) };
400+
auto allData = { d1, d2, d3 };
401401

402-
auto objects = StateVar<vector<StateRef<string>>>::Create(g);
402+
auto objects = StateVar<vector<StateVar<string>>>::Create(g);
403403

404404
auto obs = Observer::Create([] (const auto& flatList)
405405
{
@@ -412,7 +412,7 @@ void test1()
412412

413413
objects.Modify([&] (auto& w)
414414
{
415-
w.push_back(CreateRef(w1));
415+
w.push_back(w1);
416416
});
417417
// Objects: Widget1
418418

include/react/algorithm.h

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -172,54 +172,60 @@ auto Pulse(const State<S>& state, const Event<E>& evnt) -> Event<S>
172172
///////////////////////////////////////////////////////////////////////////////////////////////////
173173
/// Flatten
174174
///////////////////////////////////////////////////////////////////////////////////////////////////
175-
template <typename S>
176-
auto Flatten(const Group& group, const State<State<S>>& state) -> State<S>
175+
template <typename S, template <typename> class TState,
176+
typename = std::enable_if_t<std::is_base_of_v<State<S>, TState<S>>>>
177+
auto Flatten(const Group& group, const State<TState<S>>& state) -> State<S>
177178
{
178179
using REACT_IMPL::FlattenStateNode;
179180
using REACT_IMPL::SameGroupOrLink;
180181
using REACT_IMPL::CreateWrappedNode;
181182

182-
return CreateWrappedNode<State<S>, FlattenStateNode<S>>(group, SameGroupOrLink(group, state));
183+
return CreateWrappedNode<State<S>, FlattenStateNode<S, TState>>(group, SameGroupOrLink(group, state));
183184
}
184185

185-
template <typename S>
186-
auto Flatten(const State<State<S>>& state) -> State<S>
186+
template <typename S, template <typename> class TState,
187+
typename = std::enable_if_t<std::is_base_of_v<State<S>, TState<S>>>>
188+
auto Flatten(const State<TState<S>>& state) -> State<S>
187189
{ return Flatten(state.GetGroup(), state); }
188190

189191
///////////////////////////////////////////////////////////////////////////////////////////////////
190192
/// FlattenList
191193
///////////////////////////////////////////////////////////////////////////////////////////////////
192-
template <template <typename ...> class TList, typename V, typename ... TParams>
193-
auto FlattenList(const Group& group, const State<TList<State<V>, TParams ...>>& list) -> State<TList<V>>
194+
template <template <typename ...> class TList, template <typename> class TState, typename V, typename ... TParams,
195+
typename = std::enable_if_t<std::is_base_of_v<State<V>, TState<V>>>>
196+
auto FlattenList(const Group& group, const State<TList<TState<V>, TParams ...>>& list) -> State<TList<V>>
194197
{
195198
using REACT_IMPL::FlattenStateListNode;
196199
using REACT_IMPL::SameGroupOrLink;
197200
using REACT_IMPL::CreateWrappedNode;
198201

199-
return CreateWrappedNode<State<TList<V>>, FlattenStateListNode<TList, V, TParams ...>>(
202+
return CreateWrappedNode<State<TList<V>>, FlattenStateListNode<TList, TState, V, TParams ...>>(
200203
group, SameGroupOrLink(group, list));
201204
}
202205

203-
template <template <typename ...> class TList, typename V, typename ... TParams>
204-
auto FlattenList(const State<TList<State<V>, TParams ...>>& list) -> State<TList<V>>
206+
template <template <typename ...> class TList, template <typename> class TState, typename V, typename ... TParams,
207+
typename = std::enable_if_t<std::is_base_of_v<State<V>, TState<V>>>>
208+
auto FlattenList(const State<TList<TState<V>, TParams ...>>& list) -> State<TList<V>>
205209
{ return FlattenList(list.GetGroup(), list); }
206210

207211
///////////////////////////////////////////////////////////////////////////////////////////////////
208212
/// FlattenMap
209213
///////////////////////////////////////////////////////////////////////////////////////////////////
210-
template <template <typename ...> class TMap, typename K, typename V, typename ... TParams>
211-
auto FlattenMap(const Group& group, const State<TMap<K, State<V>, TParams ...>>& map) -> State<TMap<K, V>>
214+
template <template <typename ...> class TMap, template <typename> class TState, typename K, typename V, typename ... TParams,
215+
typename = std::enable_if_t<std::is_base_of_v<State<V>, TState<V>>>>
216+
auto FlattenMap(const Group& group, const State<TMap<K, TState<V>, TParams ...>>& map) -> State<TMap<K, V>>
212217
{
213218
using REACT_IMPL::FlattenStateMapNode;
214219
using REACT_IMPL::SameGroupOrLink;
215220
using REACT_IMPL::CreateWrappedNode;
216221

217-
return CreateWrappedNode<State<TMap<K, V>>, FlattenStateMapNode<TMap, K, V, TParams ...>>(
222+
return CreateWrappedNode<State<TMap<K, V>>, FlattenStateMapNode<TMap, TState, K, V, TParams ...>>(
218223
group, SameGroupOrLink(group, map));
219224
}
220225

221-
template <template <typename ...> class TMap, typename K, typename V, typename ... TParams>
222-
auto FlattenMap(const State<TMap<K, State<V>, TParams ...>>& map) -> State<TMap<K, V>>
226+
template <template <typename ...> class TMap, template <typename> class TState, typename K, typename V, typename ... TParams,
227+
typename = std::enable_if_t<std::is_base_of_v<State<V>, TState<V>>>>
228+
auto FlattenMap(const State<TMap<K, TState<V>, TParams ...>>& map) -> State<TMap<K, V>>
223229
{ return FlattenMap(map.GetGroup(), map); }
224230

225231
///////////////////////////////////////////////////////////////////////////////////////////////////

include/react/detail/algorithm_nodes.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -375,11 +375,11 @@ class PulseNode : public EventNode<S>
375375
///////////////////////////////////////////////////////////////////////////////////////////////////
376376
/// FlattenStateNode
377377
///////////////////////////////////////////////////////////////////////////////////////////////////
378-
template <typename S>
378+
template <typename S, template <typename> class TState>
379379
class FlattenStateNode : public StateNode<S>
380380
{
381381
public:
382-
FlattenStateNode(const Group& group, const State<State<S>>& outer) :
382+
FlattenStateNode(const Group& group, const State<TState<S>>& outer) :
383383
FlattenStateNode::StateNode( group, GetInternals(GetInternals(outer).Value()).Value() ),
384384
outer_( outer ),
385385
inner_( GetInternals(outer).Value() )
@@ -421,18 +421,18 @@ class FlattenStateNode : public StateNode<S>
421421
}
422422

423423
private:
424-
State<State<S>> outer_;
425-
State<S> inner_;
424+
State<TState<S>> outer_;
425+
State<S> inner_;
426426
};
427427

428428
///////////////////////////////////////////////////////////////////////////////////////////////////
429429
/// FlattenStateListNode
430430
///////////////////////////////////////////////////////////////////////////////////////////////////
431-
template <template <typename ...> class TList, typename V, typename ... TParams>
431+
template <template <typename ...> class TList, template <typename> class TState, typename V, typename ... TParams>
432432
class FlattenStateListNode : public StateNode<TList<V>>
433433
{
434434
public:
435-
using InputListType = TList<State<V>, TParams ...>;
435+
using InputListType = TList<TState<V>, TParams ...>;
436436
using FlatListType = TList<V>;
437437

438438
FlattenStateListNode(const Group& group, const State<InputListType>& outer) :
@@ -501,11 +501,11 @@ class FlattenStateListNode : public StateNode<TList<V>>
501501
///////////////////////////////////////////////////////////////////////////////////////////////////
502502
/// FlattenStateListNode
503503
///////////////////////////////////////////////////////////////////////////////////////////////////
504-
template <template <typename ...> class TMap, typename K, typename V, typename ... TParams>
504+
template <template <typename ...> class TMap, template <typename> class TState, typename K, typename V, typename ... TParams>
505505
class FlattenStateMapNode : public StateNode<TMap<K, V>>
506506
{
507507
public:
508-
using InputMapType = TMap<K, State<V>, TParams ...>;
508+
using InputMapType = TMap<K, TState<V>, TParams ...>;
509509
using FlatMapType = TMap<K, V>;
510510

511511
FlattenStateMapNode(const Group& group, const State<InputMapType>& outer) :

0 commit comments

Comments
 (0)