#pragma once #include "borrowed-ptr-fwd.hpp" #include "borrowed-ptr.inl" #include "borrowed-ptr.inl" #define FM_BPTR_DEBUG #ifdef FM_NO_DEBUG #undef FM_BPTR_DEBUG #endif #ifdef FM_BPTR_DEBUG #include "compat/assert.hpp" #define fm_bptr_assert(...) fm_assert(__VA_ARGS__) #else #define fm_bptr_assert(...) void() #endif namespace floormat::detail_borrowed_ptr { //static_assert(std::is_same_v || std::has_virtual_destructor_v && std::has_virtual_destructor_v); // todo! for simple_bptr template concept StaticCastable = requires(From* from) { static_cast(from); }; } // namespace floormat::detail_borrowed_ptr namespace floormat { template bptr static_pointer_cast(const bptr& p) noexcept { static_assert(detail_borrowed_ptr::StaticCastable); if (p.blk) [[likely]] { if (auto* ptr = p.blk->_ptr) { fm_bptr_assert(p.casted_ptr); auto* ret = static_cast(p.casted_ptr); return bptr{DirectInit, ret, p.blk}; } } return bptr{nullptr}; } } // namespace floormat