ReactivePlusPlus
ReactiveX implementation for C++20
Toggle main menu visibility
Loading...
Searching...
No Matches
dynamic_observable.hpp
1
// ReactivePlusPlus library
2
//
3
// Copyright Aleksey Loginov 2023 - present.
4
// Distributed under the Boost Software License, Version 1.0.
5
// (See accompanying file LICENSE_1_0.txt or copy at
6
// https://www.boost.org/LICENSE_1_0.txt)
7
//
8
// Project home: https://github.com/AlexInLog/ReactivePlusPlus
9
10
#pragma once
11
12
#include <rpp/observables/fwd.hpp>
13
#include <rpp/subjects/fwd.hpp>
14
15
#include <rpp/observables/observable.hpp>
16
#include <rpp/observers/dynamic_observer.hpp>
17
18
#include <memory>
19
#include <utility>
20
21
namespace
rpp::details::observables
22
{
23
template
<
typename
T,
typename
Observable>
24
void
forwarding_subscribe(
const
void
*
const
ptr, dynamic_observer<T>&& obs)
25
{
26
static_cast<
const
Observable*
>
(ptr)->
subscribe
(std::move(obs));
27
}
28
29
template
<rpp::constra
int
::decayed_type Type>
30
class
dynamic_strategy final
31
{
32
public
:
33
using
value_type = Type;
34
using
optimal_disposables_strategy = rpp::details::observables::default_disposables_strategy;
35
36
template
<rpp::constra
int
::observable_strategy<Type> Strategy>
37
requires
(!
rpp::constraint::decayed_same_as<Strategy, dynamic_strategy<Type>
>)
38
explicit
dynamic_strategy(
observable<Type, Strategy>
&& obs)
39
: m_forwarder{std::make_shared<observable<Type, Strategy>>(std::move(obs))}
40
, m_vtable{vtable::template create<observable<Type, Strategy>>()}
41
{
42
}
43
44
template
<rpp::constra
int
::observable_strategy<Type> Strategy>
45
requires
(!
rpp::constraint::decayed_same_as<Strategy, dynamic_strategy<Type>
>)
46
explicit
dynamic_strategy(
const
observable<Type, Strategy>
& obs)
47
: m_forwarder{std::make_shared<observable<Type, Strategy>>(obs)}
48
, m_vtable{vtable::template create<observable<Type, Strategy>>()}
49
{
50
}
51
52
template
<rpp::constra
int
::observer_strategy<Type> ObserverStrategy>
53
void
subscribe(
observer<Type, ObserverStrategy>
&&
observer
)
const
54
{
55
m_vtable->subscribe(m_forwarder.get(), std::move(
observer
).as_dynamic());
56
}
57
58
private
:
59
struct
vtable
60
{
61
void (*subscribe)(
const
void
*,
dynamic_observer<Type>
&&){};
62
63
template
<rpp::constra
int
::observable Observable>
64
static
const
vtable* create()
noexcept
65
{
66
static
vtable s_res{.subscribe = forwarding_subscribe<Type, Observable>};
67
return
&s_res;
68
}
69
};
70
71
private
:
72
std::shared_ptr<void> m_forwarder;
73
const
vtable* m_vtable;
74
};
75
}
// namespace rpp::details::observables
76
77
namespace
rpp
78
{
87
template
<constra
int
::decayed_type Type>
88
class
dynamic_observable :
public
observable<Type, details::observables::dynamic_strategy<Type>>
89
{
90
using
base = observable<Type, details::observables::dynamic_strategy<Type>>;
91
92
public
:
93
using
base::base;
94
95
dynamic_observable(base&& b)
96
: base{std::move(b)}
97
{
98
}
99
100
dynamic_observable(
const
base& b)
101
: base{b}
102
{
103
}
104
};
105
}
// namespace rpp
rpp::dynamic_observer
Type-erased version of the rpp::observer. Any observer can be converted to dynamic_observer via rpp::...
Definition
dynamic_observer.hpp:127
rpp::observable
Base class for any observable used in RPP. It handles core callbacks of observable.
Definition
observable.hpp:38
rpp::observer
Base class for any observer used in RPP. It handles core callbacks of observers. Objects of this clas...
Definition
observer.hpp:172
rpp::constraint::decayed_same_as
Definition
constraints.hpp:19
rpp::operators::subscribe
auto subscribe(observer< Type, ObserverStrategy > &&observer)
Subscribes passed observer to emissions from this observable.
Definition
subscribe.hpp:226
src
rpp
rpp
observables
dynamic_observable.hpp
Generated by
1.17.0