LeviLamina
Loading...
Searching...
No Matches
NonOwnerPointer.h
1#pragma once
2
3#include "mc/_HeaderOutputPredefine.h"
4#include "mc/deps/core/utility/EnableNonOwnerReferences.h"
5
6namespace Bedrock {
7
8template <typename T>
10public:
11 std::shared_ptr<::Bedrock::EnableNonOwnerReferences::ControlBlock> mControlBlock;
12 T* mPointer{};
13
14 NonOwnerPointer(std::shared_ptr<::Bedrock::EnableNonOwnerReferences::ControlBlock> cb, T* p)
15 : mControlBlock(std::move(cb)),
16 mPointer(p) {}
17
18 template <typename U = T>
19 requires std::is_convertible_v<U*, T*>
20 NonOwnerPointer(U const& t)
22 static_cast<::Bedrock::EnableNonOwnerReferences const&>(t).mControlBlock,
23 const_cast<T*>(std::addressof(t))
24 ) {}
25 template <typename U = T>
26 requires std::is_convertible_v<U*, T*>
27 NonOwnerPointer(NonOwnerPointer<U> const& p) : NonOwnerPointer(p.mControlBlock, p.mPointer) {}
28 template <typename U = T>
29 requires std::is_convertible_v<U*, T*>
31 : NonOwnerPointer(std::move(p.mControlBlock), std::exchange(p.mPointer, nullptr)) {}
32
33
34 NonOwnerPointer() noexcept {}
35 NonOwnerPointer(std::nullptr_t) noexcept {}
36 T* get() const {
37 if (mControlBlock && mControlBlock->mIsValid) {
38 return mPointer;
39 }
40 return nullptr;
41 }
42 explicit operator bool() const noexcept { return get() != nullptr; }
43
44 [[nodiscard]] constexpr operator T*() const { return get(); }
45 [[nodiscard]] constexpr T* operator->() const { return get(); }
46 [[nodiscard]] constexpr T& operator*() const { return *get(); }
47
48 [[nodiscard]] bool operator==(nullptr_t) noexcept { return get() == nullptr; }
49 template <class U>
50 [[nodiscard]] bool operator==(NonOwnerPointer<U> const& r) noexcept {
51 return get() == r.get();
52 }
53 template <class U>
54 [[nodiscard]] bool operator<=>(NonOwnerPointer<U> const& r) noexcept {
55 return get() <=> r.get();
56 }
57};
58
59}; // namespace Bedrock
Definition EnableNonOwnerReferences.h:7
Definition NonOwnerPointer.h:9