6 #ifndef XENIUM_DETAL_GUARD_PTR_HPP
7 #define XENIUM_DETAL_GUARD_PTR_HPP
11 namespace xenium::reclamation::detail {
13 template <
class T,
class MarkedPtr,
class Derived>
16 ~guard_ptr() {
self().reset(); }
19 [[nodiscard]] T* get() const noexcept {
return ptr.get(); }
22 [[nodiscard]] uintptr_t mark() const noexcept {
return ptr.mark(); }
24 operator MarkedPtr() const noexcept {
return ptr; }
27 explicit operator bool() const noexcept {
return static_cast<bool>(ptr); }
30 T* operator->() const noexcept {
return ptr.get(); }
33 T& operator*() const noexcept {
return *ptr; }
36 void swap(Derived& g) noexcept {
37 std::swap(ptr, g.ptr);
43 guard_ptr(
const MarkedPtr& p = MarkedPtr{}) noexcept : ptr(p) {}
46 void do_swap(Derived&) noexcept {}
49 Derived&
self() {
return static_cast<Derived&
>(*this); }