diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2024-05-04 14:37:06 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2024-05-05 03:31:19 +0200 |
commit | c1ad7d0ead5132520956c8d6ee6a9c6887d38556 (patch) | |
tree | 1272a4555a544b06da5e315336ad102c53667dd7 /compat/borrowed-ptr.hpp | |
parent | bbe2474e248dceffe89fe7f23ad7abce5452fc97 (diff) |
a w
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 |