summaryrefslogtreecommitdiffhomepage
path: root/compat/borrowed-ptr.inl
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-07-16 19:56:34 +0200
committerStanislaw Halik <sthalik@misaki.pl>2024-07-16 19:56:34 +0200
commit339291fc674e6c021b1a1ae4aa63c6c4c73c5569 (patch)
treebe14a0415327a297072f63ee7554f0599f56318b /compat/borrowed-ptr.inl
parentc3258606e206f91e89c2451c6afb6fb4fd96a11f (diff)
w
Diffstat (limited to 'compat/borrowed-ptr.inl')
-rw-r--r--compat/borrowed-ptr.inl31
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__