15 if (a_ptr->DecRef() == 0) {
35 template <
class T,
template <
class>
class RefManager = BSTSmartPointerIntrusiveRefCount>
56 std::is_convertible_v<
77 std::is_convertible_v<
89 _ptr(std::move(a_rhs._ptr))
98 std::is_convertible_v<
103 _ptr(std::move(a_rhs._ptr))
105 a_rhs._ptr =
nullptr;
116 if (
this != std::addressof(a_rhs)) {
128 std::is_convertible_v<
143 if (
this != std::addressof(a_rhs)) {
145 _ptr = std::move(a_rhs._ptr);
146 a_rhs._ptr =
nullptr;
155 std::is_convertible_v<
162 _ptr = std::move(a_rhs._ptr);
163 a_rhs._ptr =
nullptr;
175 std::is_convertible_v<
193 [[nodiscard]]
explicit constexpr
operator bool() const noexcept
195 return static_cast<bool>(
_ptr);
200 assert(
static_cast<bool>(*
this));
206 assert(
static_cast<bool>(*
this));
211 template <
class,
template <
class>
class>
217 reference_manager::Acquire(
_ptr);
224 reference_manager::Release(
_ptr);
234 template <
class T,
class... Args>
240 template <
class T1,
class T2>
243 return a_lhs.
get() == a_rhs.
get();
246 template <
class T1,
class T2>
249 return !(a_lhs == a_rhs);
267 return static_cast<bool>(a_lhs);
273 return static_cast<bool>(a_rhs);
284 #define BSSmartPointer(className) \
286 using className##Ptr = RE::BSTSmartPointer<className>;
Definition: BSTSmartPointer.h:37
BSTSmartPointer(const BSTSmartPointer< Y > &a_rhs)
Definition: BSTSmartPointer.h:81
BSTSmartPointer(BSTSmartPointer &&a_rhs) noexcept
Definition: BSTSmartPointer.h:88
constexpr element_type & operator*() const noexcept
Definition: BSTSmartPointer.h:198
BSTSmartPointer & operator=(const BSTSmartPointer &a_rhs)
Definition: BSTSmartPointer.h:114
void reset()
Definition: BSTSmartPointer.h:167
void TryAttach()
Definition: BSTSmartPointer.h:214
void TryDetach()
Definition: BSTSmartPointer.h:221
constexpr BSTSmartPointer(std::nullptr_t) noexcept
Definition: BSTSmartPointer.h:48
element_type * _ptr
Definition: BSTSmartPointer.h:230
constexpr BSTSmartPointer() noexcept
Definition: BSTSmartPointer.h:43
BSTSmartPointer & operator=(BSTSmartPointer< Y > &&a_rhs)
Definition: BSTSmartPointer.h:159
constexpr element_type * operator->() const noexcept
Definition: BSTSmartPointer.h:204
BSTSmartPointer(const BSTSmartPointer &a_rhs)
Definition: BSTSmartPointer.h:67
~BSTSmartPointer()
Definition: BSTSmartPointer.h:108
RefManager< T > reference_manager
Definition: BSTSmartPointer.h:40
BSTSmartPointer(BSTSmartPointer< Y > &&a_rhs) noexcept
Definition: BSTSmartPointer.h:102
T element_type
Definition: BSTSmartPointer.h:39
BSTSmartPointer(Y *a_rhs)
Definition: BSTSmartPointer.h:60
BSTSmartPointer & operator=(const BSTSmartPointer< Y > &a_rhs)
Definition: BSTSmartPointer.h:132
BSTSmartPointer & operator=(BSTSmartPointer &&a_rhs)
Definition: BSTSmartPointer.h:141
constexpr element_type * get() const noexcept
Definition: BSTSmartPointer.h:188
void reset(Y *a_ptr)
Definition: BSTSmartPointer.h:179
Definition: AbsorbEffect.h:6
constexpr bool operator==(const BSTSmartPointer< T1 > &a_lhs, const BSTSmartPointer< T2 > &a_rhs)
Definition: BSTSmartPointer.h:241
BSTSmartPointer(T *) -> BSTSmartPointer< T, BSTSmartPointerIntrusiveRefCount >
BSTSmartPointer< T > make_smart(Args &&... a_args)
Definition: BSTSmartPointer.h:235
constexpr bool operator!=(const BSTSmartPointer< T1 > &a_lhs, const BSTSmartPointer< T2 > &a_rhs)
Definition: BSTSmartPointer.h:247
Definition: BSTSmartPointer.h:23
static void Release(T *a_ptr)
Definition: BSTSmartPointer.h:29
constexpr static void Acquire(T *)
Definition: BSTSmartPointer.h:24
Definition: BSTSmartPointer.h:7
static void Release(T *a_ptr)
Definition: BSTSmartPointer.h:13
static void Acquire(T *a_ptr)
Definition: BSTSmartPointer.h:8