From 339291fc674e6c021b1a1ae4aa63c6c4c73c5569 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Tue, 16 Jul 2024 19:56:34 +0200 Subject: w --- compat/borrowed-ptr.hpp | 52 +++++++++++++++++-------------------------------- compat/borrowed-ptr.inl | 31 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 34 deletions(-) diff --git a/compat/borrowed-ptr.hpp b/compat/borrowed-ptr.hpp index 9ba28fc1..6a4e79f1 100644 --- a/compat/borrowed-ptr.hpp +++ b/compat/borrowed-ptr.hpp @@ -56,6 +56,12 @@ concept DerivedFrom = requires(From* from, To* to) { namespace floormat { +template requires detail_bptr::StaticCastable +bptr static_pointer_cast(bptr&& p) noexcept; + +template requires detail_bptr::StaticCastable +bptr static_pointer_cast(const bptr& p) noexcept; + template class bptr final // NOLINT(*-special-member-functions) { @@ -69,13 +75,13 @@ class bptr final // NOLINT(*-special-member-functions) public: template //requires std::is_constructible_v, Ts&&...> - explicit bptr(InPlaceInitT, Ts&&... args) noexcept; + CORRADE_ALWAYS_INLINE explicit bptr(InPlaceInitT, Ts&&... args) noexcept; - explicit bptr(T* ptr) noexcept; - bptr() noexcept; + CORRADE_ALWAYS_INLINE explicit bptr(T* ptr) noexcept; + CORRADE_ALWAYS_INLINE bptr() noexcept; + CORRADE_ALWAYS_INLINE bptr(std::nullptr_t) noexcept; // NOLINT(*-explicit-conversions) ~bptr() noexcept; - bptr(std::nullptr_t) noexcept; // NOLINT(*-explicit-conversions) bptr& operator=(std::nullptr_t) noexcept; bptr(const bptr>& ptr) noexcept requires std::is_const_v; @@ -123,7 +129,10 @@ public: friend bptr static_pointer_cast(const bptr& p) noexcept; }; -template bptr::bptr(std::nullptr_t) noexcept: blk{nullptr} {} +#ifdef __GNUG__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif template template @@ -132,6 +141,7 @@ bptr::bptr(InPlaceInitT, Ts&&... args) noexcept: bptr{ new std::remove_const_t{ forward(args)... } } {} +template bptr::bptr(std::nullptr_t) noexcept: blk{nullptr} {} template bptr::bptr() noexcept: bptr{nullptr} {} template @@ -143,35 +153,9 @@ bptr::bptr(T* ptr) noexcept: } : nullptr} {} -template -requires detail_bptr::StaticCastable -bptr static_pointer_cast(bptr&& p) noexcept -{ - if (p.blk && p.blk->_ptr) [[likely]] - { - bptr ret{nullptr}; - ret.blk = p.blk; - p.blk = nullptr; - return ret; - } - return bptr{nullptr}; -} - -template -requires detail_bptr::StaticCastable -bptr static_pointer_cast(const bptr& p) noexcept -{ - if (p.blk && p.blk->_ptr) [[likely]] - { - bptr ret{nullptr}; -#ifndef FM_NO_WEAK_BPTR - ++p.blk->_soft_count; +#ifdef __GNUG__ +#pragma GCC diagnostic pop #endif - ++p.blk->_hard_count; - ret.blk = p.blk; - return ret; - } - return bptr{nullptr}; -} + } // namespace floormat 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::use_count() const noexcept return 0; } +template +requires detail_bptr::StaticCastable +bptr static_pointer_cast(bptr&& p) noexcept +{ + if (p.blk && p.blk->_ptr) [[likely]] + { + bptr ret{nullptr}; + ret.blk = p.blk; + p.blk = nullptr; + return ret; + } + return bptr{nullptr}; +} + +template +requires detail_bptr::StaticCastable +bptr static_pointer_cast(const bptr& p) noexcept +{ + if (p.blk && p.blk->_ptr) [[likely]] + { + bptr ret{nullptr}; +#ifndef FM_NO_WEAK_BPTR + ++p.blk->_soft_count; +#endif + ++p.blk->_hard_count; + ret.blk = p.blk; + return ret; + } + return bptr{nullptr}; +} + } // namespace floormat #ifdef __GNUG__ -- cgit v1.2.3