22class VariableSnapshotPtr
final {
24 VariableSnapshotPtr(VariableSnapshotPtr&&) =
delete;
25 VariableSnapshotPtr& operator=(VariableSnapshotPtr&&) =
delete;
27 const VariableType& operator*()
const& USERVER_IMPL_LIFETIME_BOUND {
return *variable_; }
28 const VariableType& operator*() && { ReportMisuse(); }
30 const VariableType* operator->()
const& USERVER_IMPL_LIFETIME_BOUND {
return variable_; }
31 const VariableType* operator->() && { ReportMisuse(); }
34 [[noreturn]]
static void ReportMisuse() {
35 static_assert(!
sizeof(VariableType),
"keep the pointer before using, please");
38 explicit VariableSnapshotPtr(Snapshot&& snapshot,
const Key<VariableType>& key)
39 : snapshot_(std::move(snapshot)),
40 variable_(&snapshot_[key])
47 const VariableType* variable_;
92 using SnapshotEventSource =
concurrent::AsyncEventSource<
const Snapshot&>;
93 using DiffEventSource =
concurrent::AsyncEventSource<
const Diff&>;
97 explicit Source(impl::StorageData& storage);
100 Source(
const Source&) =
default;
101 Source(Source&&) =
default;
102 Source& operator=(
const Source&) =
default;
103 Source& operator=(Source&&) =
default;
105 Snapshot GetSnapshot()
const;
107 template <
typename VariableType>
108 VariableSnapshotPtr<VariableType> GetSnapshot(
const Key<VariableType>& key)
const {
109 return VariableSnapshotPtr{GetSnapshot(), key};
112 template <
typename VariableType>
113 VariableType GetCopy(
const Key<VariableType>& key)
const {
114 const auto snapshot = GetSnapshot();
115 return snapshot[key];
134 template <
typename Class>
137 std::string_view name,
138 void (Class::*func)(
const dynamic_config::Snapshot& config)
140 return DoUpdateAndListen(
143 [obj, func](
const dynamic_config::Snapshot& config) { (obj->*func)(config); }
180 template <
typename Class>
183 std::string_view name,
184 void (Class::*func)(
const dynamic_config::Diff& diff)
186 return DoUpdateAndListen(
concurrent::FunctionId(obj), name, [obj, func](
const dynamic_config::Diff& diff) {
214 template <
typename Class,
typename... Keys>
217 std::string_view name,
218 void (Class::*func)(
const dynamic_config::Snapshot& config),
221 auto wrapper = [obj, func, &keys...](
const Diff& diff) {
222 if (!diff.HasConfigsChanged(keys...)) {
225 (obj->*func)(diff.current);
227 return DoUpdateAndListen(
concurrent::FunctionId(obj), name, std::move(wrapper));
230 SnapshotEventSource& GetEventChannel();
233 concurrent::AsyncEventSubscriberScope DoUpdateAndListen(
235 std::string_view name,
236 SnapshotEventSource::Function&& func
239 concurrent::AsyncEventSubscriberScope DoUpdateAndListen(
241 std::string_view name,
242 DiffEventSource::Function&& func
245 impl::StorageData* storage_;