diff options
Diffstat (limited to 'compat/borrowed-ptr.hpp')
-rw-r--r-- | compat/borrowed-ptr.hpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/compat/borrowed-ptr.hpp b/compat/borrowed-ptr.hpp index d3feee2f..5caa2261 100644 --- a/compat/borrowed-ptr.hpp +++ b/compat/borrowed-ptr.hpp @@ -1,11 +1,16 @@ #pragma once #include "borrowed-ptr-fwd.hpp" #include "borrowed-ptr.inl" +#include "borrowed-ptr.inl" #define FM_BPTR_DEBUG + +#ifdef FM_NO_DEBUG +#undef FM_BPTR_DEBUG +#endif #ifdef FM_BPTR_DEBUG #include "compat/assert.hpp" -#define fm_bptr_assert(...) fm_debug_assert(__VA_ARGS__) +#define fm_bptr_assert(...) fm_assert(__VA_ARGS__) #else #define fm_bptr_assert(...) void() #endif @@ -23,26 +28,21 @@ concept StaticCastable = requires(From* from) { namespace floormat { -template<typename T> constexpr bptr<T>::bptr(std::nullptr_t) noexcept: ptr{nullptr}, blk{nullptr} {} -template<typename T> constexpr bptr<T>::bptr() noexcept: bptr{nullptr} {} - -template<typename T> constexpr T* bptr<T>::get() const noexcept { return ptr; } -template<typename T> constexpr T& bptr<T>::operator*() const noexcept { fm_debug_assert(ptr); return *ptr; } -template<typename T> constexpr T* bptr<T>::operator->() const noexcept { fm_debug_assert(ptr); return ptr; } - template<typename T, typename U> bptr<U> static_pointer_cast(const bptr<T>& p) noexcept { static_assert(detail_borrowed_ptr::StaticCastable<T, U>); - if (auto* blk = p.blk) [[likely]] + if (p.blk) [[likely]] { - auto* ptr = static_cast<U*>(p.ptr); - blk->incr(); - return bptr<U>{DirectInit, ptr, blk}; + if (auto* ptr = p.blk->_ptr) + { + fm_bptr_assert(p.casted_ptr); + auto* ret = static_cast<U*>(p.casted_ptr); + return bptr<U>{DirectInit, ret, p.blk}; + } } - else - return bptr<U>{nullptr}; + return bptr<U>{nullptr}; } } // namespace floormat |