diff options
Diffstat (limited to 'compat/borrowed-ptr.hpp')
-rw-r--r-- | compat/borrowed-ptr.hpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/compat/borrowed-ptr.hpp b/compat/borrowed-ptr.hpp index 5134f279..872902a2 100644 --- a/compat/borrowed-ptr.hpp +++ b/compat/borrowed-ptr.hpp @@ -3,16 +3,22 @@ namespace floormat { -template<typename T> constexpr bptr<T>::bptr(NoInitT) noexcept {}; 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> bptr(T* ptr) -> bptr<T>; - template<typename T, typename U> -CORRADE_ALWAYS_INLINE bptr<U> static_pointer_cast(const bptr<T>& p) noexcept +bptr<U> static_pointer_cast(const bptr<T>& p) noexcept { - return p.template static_pointer_cast<U>(); + static_assert(detail_borrowed_ptr::StaticCastable<T, U>); + + if (auto* blk = p.blk) [[likely]] + { + auto* ptr = static_cast<U*>(p.ptr); + blk->incr(); + return bptr<U>{DirectInit, ptr, blk}; + } + else + return bptr<U>{nullptr}; } } // namespace floormat |