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_;
88 using SnapshotEventSource =
concurrent::AsyncEventSource<
const Snapshot&>;
89 using DiffEventSource =
concurrent::AsyncEventSource<
const Diff&>;
93 explicit Source(impl::StorageData& storage);
96 Source(
const Source&) =
default;
97 Source(Source&&) =
default;
98 Source& operator=(
const Source&) =
default;
99 Source& operator=(Source&&) =
default;
101 Snapshot GetSnapshot()
const;
103 template <
typename VariableType>
104 VariableSnapshotPtr<VariableType> GetSnapshot(
const Key<VariableType>& key)
const {
105 return VariableSnapshotPtr{GetSnapshot(), key};
108 template <
typename VariableType>
109 VariableType GetCopy(
const Key<VariableType>& key)
const {
110 const auto snapshot = GetSnapshot();
111 return snapshot[key];
130 template <
typename Class>
133 std::string_view name,
134 void (Class::*func)(
const dynamic_config::Snapshot& config)
136 return DoUpdateAndListen(
139 [obj, func](
const dynamic_config::Snapshot& config) { (obj->*func)(config); }
172 template <
typename Class>
175 std::string_view name,
176 void (Class::*func)(
const dynamic_config::Diff& diff)
178 return DoUpdateAndListen(
concurrent::FunctionId(obj), name, [obj, func](
const dynamic_config::Diff& diff) {
206 template <
typename Class,
typename... Keys>
209 std::string_view name,
210 void (Class::*func)(
const dynamic_config::Snapshot& config),
213 auto wrapper = [obj, func, &keys...](
const Diff& diff) {
214 if (!diff.HasConfigsChanged(keys...)) {
217 (obj->*func)(diff.current);
219 return DoUpdateAndListen(
concurrent::FunctionId(obj), name, std::move(wrapper));
222 SnapshotEventSource& GetEventChannel();
225 concurrent::AsyncEventSubscriberScope DoUpdateAndListen(
227 std::string_view name,
228 SnapshotEventSource::Function&& func
231 concurrent::AsyncEventSubscriberScope DoUpdateAndListen(
233 std::string_view name,
234 DiffEventSource::Function&& func
237 impl::StorageData* storage_;