diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2024-07-16 19:56:34 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2024-07-16 19:56:34 +0200 |
commit | 339291fc674e6c021b1a1ae4aa63c6c4c73c5569 (patch) | |
tree | be14a0415327a297072f63ee7554f0599f56318b /compat/borrowed-ptr.inl | |
parent | c3258606e206f91e89c2451c6afb6fb4fd96a11f (diff) |
w
Diffstat (limited to 'compat/borrowed-ptr.inl')
-rw-r--r-- | compat/borrowed-ptr.inl | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/compat/borrowed-ptr.inl b/compat/borrowed-ptr.inl index 79dd5e51..e1a5f591 100644 --- a/compat/borrowed-ptr.inl +++ b/compat/borrowed-ptr.inl @@ -172,6 +172,37 @@ uint32_t bptr<T>::use_count() const noexcept return 0; } +template<typename To, typename From> +requires detail_bptr::StaticCastable<From, To> +bptr<To> static_pointer_cast(bptr<From>&& p) noexcept +{ + if (p.blk && p.blk->_ptr) [[likely]] + { + bptr<To> ret{nullptr}; + ret.blk = p.blk; + p.blk = nullptr; + return ret; + } + return bptr<To>{nullptr}; +} + +template<typename To, typename From> +requires detail_bptr::StaticCastable<From, To> +bptr<To> static_pointer_cast(const bptr<From>& p) noexcept +{ + if (p.blk && p.blk->_ptr) [[likely]] + { + bptr<To> ret{nullptr}; +#ifndef FM_NO_WEAK_BPTR + ++p.blk->_soft_count; +#endif + ++p.blk->_hard_count; + ret.blk = p.blk; + return ret; + } + return bptr<To>{nullptr}; +} + } // namespace floormat #ifdef __GNUG__ |