Skip to content

Commit 8e1f42f

Browse files
committed
WIP: Flattening for nested state.
1 parent 90057e3 commit 8e1f42f

4 files changed

Lines changed: 440 additions & 3 deletions

File tree

examples/src/BasicAlgorithms.cpp

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,17 +340,133 @@ namespace example6
340340
}
341341
}
342342

343+
344+
using namespace react;
345+
346+
347+
template <typename T>
348+
class MyContainer { };
349+
350+
template <typename C>
351+
struct Flattened : public C
352+
{
353+
using C::C;
354+
355+
Flattened(const C& base) :
356+
C( base )
357+
{ }
358+
359+
Flattened(const C& base, int m) :
360+
C( base ),
361+
mode( m )
362+
{ }
363+
364+
template <typename T>
365+
T* Flatten(State<T>& signal)
366+
{
367+
if (mode == 1)
368+
{
369+
memberIds_.push_back(GetInternals(signal).GetNodeId());
370+
}
371+
372+
return &GetInternals(signal).Value();
373+
}
374+
375+
public:
376+
int mode = 0;
377+
std::vector<REACT_IMPL::NodeId> memberIds_;
378+
};
379+
380+
Group g;
381+
382+
struct MyClass
383+
{
384+
StateVar<int> a = StateVar<int>::Create(g, 10);
385+
StateVar<int> b = StateVar<int>::Create(g, 20);
386+
387+
int hello = 12435;
388+
389+
bool operator==(const MyClass& other)
390+
{ return hello == other.hello; }
391+
392+
struct Flat;
393+
};
394+
395+
struct MyClass::Flat : public Flattened<MyClass>
396+
{
397+
using Flattened::Flattened;
398+
399+
int* a = this->Flatten(MyClass::a);
400+
int* b = this->Flatten(MyClass::b);
401+
};
402+
403+
404+
void test1()
405+
{
406+
using namespace react;
407+
408+
/*StateVar<int> x;
409+
State<int> y;
410+
State<int> z;
411+
412+
State<std::vector<State<int>>> list;
413+
State<std::map<int, State<int>>> map;
414+
415+
State<std::vector<int>> flatlist = FlattenList(list);
416+
State<std::map<int, int>> flatmap = FlattenMap(map);
417+
418+
MyClass cls1;
419+
MyClass::Flat cls2(cls1);
420+
421+
StateVar<State<int>> sig;
422+
423+
Flatten(g, sig);*/
424+
425+
StateVar<MyClass> st = StateVar<MyClass>::Create(g);
426+
427+
State<Ref<MyClass>> ref = CreateRef(st);
428+
429+
auto obs2 = Observer::Create([] (const MyClass& obj)
430+
{
431+
printf("aa %d\n", obj.hello);
432+
}, ref);
433+
434+
auto flat = FlattenObject(st);
435+
436+
auto flat2 = FlattenObject(ref);
437+
438+
auto obs = Observer::Create([] (const MyClass::Flat& obj)
439+
{
440+
int x = *obj.a;
441+
int y = *obj.b;
442+
printf("%d\n", x);
443+
printf("%d\n", y);
444+
}, flat2);
445+
446+
447+
GetInternals(st).Value().a.Set(999);
448+
449+
MyClass a2{ };
450+
a2.hello = 3333;
451+
452+
st.Set(a2);
453+
st.Set(a2);
454+
455+
}
456+
343457
///////////////////////////////////////////////////////////////////////////////////////////////////
344458
/// Run examples
345459
///////////////////////////////////////////////////////////////////////////////////////////////////
346460
int main()
347461
{
348-
example1::Run();
462+
/*example1::Run();
349463
example2::Run();
350464
example3::Run();
351465
example4::Run();
352466
example5::Run();
353-
example6::Run();
467+
example6::Run();*/
468+
469+
test1();
354470

355471
return 0;
356472
}

include/react/algorithm.h

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,90 @@ template <typename S, typename E>
169169
auto Pulse(const State<S>& state, const Event<E>& evnt) -> Event<S>
170170
{ return Pulse(state.GetGroup(), state, evnt); }
171171

172+
///////////////////////////////////////////////////////////////////////////////////////////////////
173+
/// Flatten
174+
///////////////////////////////////////////////////////////////////////////////////////////////////
175+
template <typename S>
176+
auto Flatten(const Group& group, const State<State<S>>& state) -> State<S>
177+
{
178+
using REACT_IMPL::FlattenStateNode;
179+
using REACT_IMPL::SameGroupOrLink;
180+
using REACT_IMPL::CreateWrappedNode;
181+
182+
return CreateWrappedNode<State<S>, FlattenStateNode<S>>(group, SameGroupOrLink(group, state));
183+
}
184+
185+
template <typename S>
186+
auto Flatten(const State<State<S>>& state) -> State<S>
187+
{ return Flatten(state.GetGroup(), state); }
188+
189+
///////////////////////////////////////////////////////////////////////////////////////////////////
190+
/// FlattenList
191+
///////////////////////////////////////////////////////////////////////////////////////////////////
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+
{
195+
using REACT_IMPL::FlattenStateListNode;
196+
using REACT_IMPL::SameGroupOrLink;
197+
using REACT_IMPL::CreateWrappedNode;
198+
199+
return CreateWrappedNode<State<TList<V>>, FlattenStateListNode<TList, V, TParams ...>>(
200+
group, SameGroupOrLink(group, list));
201+
}
202+
203+
template <template <typename ...> class TList, typename V, typename ... TParams>
204+
auto FlattenList(const State<TList<State<V>, TParams ...>>& list) -> State<TList<V>>
205+
{ return FlattenList(list.GetGroup(), list); }
206+
207+
///////////////////////////////////////////////////////////////////////////////////////////////////
208+
/// FlattenMap
209+
///////////////////////////////////////////////////////////////////////////////////////////////////
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>>
212+
{
213+
using REACT_IMPL::FlattenStateMapNode;
214+
using REACT_IMPL::SameGroupOrLink;
215+
using REACT_IMPL::CreateWrappedNode;
216+
217+
return CreateWrappedNode<State<TMap<K, V>>, FlattenStateMapNode<TMap, K, V, TParams ...>>(
218+
group, SameGroupOrLink(group, map));
219+
}
220+
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>>
223+
{ return FlattenMap(map.GetGroup(), map); }
224+
225+
///////////////////////////////////////////////////////////////////////////////////////////////////
226+
/// FlattenObject
227+
///////////////////////////////////////////////////////////////////////////////////////////////////
228+
template <typename T, typename TFlat = typename T::Flat>
229+
auto FlattenObject(const Group& group, const State<T>& obj) -> State<TFlat>
230+
{
231+
using REACT_IMPL::FlattenObjectNode;
232+
using REACT_IMPL::SameGroupOrLink;
233+
using REACT_IMPL::CreateWrappedNode;
234+
235+
return CreateWrappedNode<State<TFlat>, FlattenObjectNode<T, TFlat>>(group, obj);
236+
}
237+
238+
template <typename T, typename TFlat = typename T::Flat>
239+
auto FlattenObject(const State<T>& obj) -> State<TFlat>
240+
{ return FlattenObject(obj.GetGroup(), obj); }
241+
242+
template <typename T, typename TFlat = typename T::Flat>
243+
auto FlattenObject(const Group& group, const State<Ref<T>>& obj) -> State<TFlat>
244+
{
245+
using REACT_IMPL::FlattenObjectNode;
246+
using REACT_IMPL::SameGroupOrLink;
247+
using REACT_IMPL::CreateWrappedNode;
248+
249+
return CreateWrappedNode<State<TFlat>, FlattenObjectNode<Ref<T>, TFlat>>(group, obj);
250+
}
251+
252+
template <typename T, typename TFlat = typename T::Flat>
253+
auto FlattenObject(const State<Ref<T>>& obj) -> State<TFlat>
254+
{ return FlattenObject(obj.GetGroup(), obj); }
255+
172256
/******************************************/ REACT_END /******************************************/
173257

174258
#endif // REACT_ALGORITHM_H_INCLUDED

0 commit comments

Comments
 (0)