Skip to content
LeviMC
English
AutoLightDark
LeviLamina
Loading...
Searching...
No Matches
InstancedThreadLocalValue.h
1#pragma once
2
3#include "mc/_HeaderOutputPredefine.h"
4
5#include "mc/deps/core/threading/InstancedThreadLocalBase.h"
6#include "mc/platform/threading/TlsSlot.h"
7
8namespace Bedrock::Threading {
9
10template <typename T>
11 requires((::std::is_pointer_v<T> || ::std::is_integral_v<T> || ::std::is_enum_v<T>) && sizeof(T) <= sizeof(void*))
12class InstancedThreadLocalValue : public ::Bedrock::Threading::InstancedThreadLocalBase {
13public:
14 InstancedThreadLocalValue() = default;
15
16 InstancedThreadLocalValue(InstancedThreadLocalValue const&) = delete;
17 InstancedThreadLocalValue& operator=(InstancedThreadLocalValue const&) = delete;
18
19 [[nodiscard]] T get() const {
20 auto raw = reinterpret_cast<::std::uintptr_t>(mKey.getValue());
21 if constexpr (::std::is_pointer_v<T>) {
22 return reinterpret_cast<T>(raw);
23 } else {
24 return static_cast<T>(raw);
25 }
26 }
27
28 void set(T value) {
29 if constexpr (::std::is_pointer_v<T>) {
30 mKey.setValue(reinterpret_cast<void*>(reinterpret_cast<::std::uintptr_t>(value)));
31 } else {
32 mKey.setValue(reinterpret_cast<void*>(static_cast<::std::uintptr_t>(value)));
33 }
34 }
35
36private:
38};
39
40} // namespace Bedrock::Threading
Definition InstancedThreadLocalBase.h:7
Definition TlsSlot.h:10