22bool AreCoroutineSwitchesAllowed()
noexcept;
24void IncrementLocalCoroutineSwitchBans()
noexcept;
26void DecrementLocalCoroutineSwitchBans()
noexcept;
28#ifdef USERVER_IMPL_UNEVALUATED_LAMBDAS
29template <
typename T,
typename Factory =
decltype([] {
return T{}; })>
30using UniqueDefaultFactory = Factory;
33struct UniqueDefaultFactory final {
36 "Defaulted syntax for compiler::ThreadLocal is unavailable on "
37 "your compiler. Please use the lambda-factory syntax, see the "
38 "documentation for compiler::ThreadLocal."
48template <
typename VariableType>
49class ThreadLocalScope final {
51 ThreadLocalScope(ThreadLocalScope&&) =
delete;
52 ThreadLocalScope& operator=(ThreadLocalScope&&) =
delete;
56 VariableType&
operator*() &
noexcept USERVER_IMPL_LIFETIME_BOUND;
59 VariableType*
operator->() &
noexcept USERVER_IMPL_LIFETIME_BOUND;
62 explicit ThreadLocalScope(VariableType& variable)
noexcept;
65 VariableType& operator*() &&
noexcept =
delete;
68 VariableType* operator->() &&
noexcept =
delete;
72 static_assert(!std::is_reference_v<VariableType>);
73 static_assert(!std::is_const_v<VariableType>);
75 VariableType& variable_;
136template <
typename VariableType,
typename Factory = impl::UniqueDefaultFactory<VariableType>>
137class ThreadLocal final {
138 static_assert(std::is_empty_v<Factory>);
139 static_assert(std::is_same_v<VariableType, std::invoke_result_t<
const Factory&>>);
142 consteval ThreadLocal()
143 : factory_(Factory{})
146 consteval ThreadLocal(Factory factory)
150 ThreadLocalScope<VariableType> Use() {
return ThreadLocalScope<VariableType>(impl::ThreadLocal(factory_)); }
163template <
typename VariableType>
164ThreadLocalScope<VariableType>::ThreadLocalScope(VariableType& variable)
noexcept : variable_(variable) {
166 impl::IncrementLocalCoroutineSwitchBans();
170template <
typename VariableType>
171ThreadLocalScope<VariableType>::~ThreadLocalScope() {
173 impl::DecrementLocalCoroutineSwitchBans();
177template <
typename VariableType>
178VariableType& ThreadLocalScope<VariableType>::
operator*() &
noexcept
179USERVER_IMPL_LIFETIME_BOUND {
183template <
typename VariableType>
184VariableType* ThreadLocalScope<VariableType>::
operator->() &
noexcept
185USERVER_IMPL_LIFETIME_BOUND {