// Copyright (c) 2020-2024 The Pybind Development Team. // All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #pragma once #include "pybind11/detail/struct_smart_holder.h" namespace pybindit { namespace memory { namespace smart_holder_poc { // Proof-of-Concept implementations. template T &as_lvalue_ref(const smart_holder &hld) { static const char *context = "as_lvalue_ref"; hld.ensure_is_populated(context); hld.ensure_has_pointee(context); return *hld.as_raw_ptr_unowned(); } template T &&as_rvalue_ref(const smart_holder &hld) { static const char *context = "as_rvalue_ref"; hld.ensure_is_populated(context); hld.ensure_has_pointee(context); return std::move(*hld.as_raw_ptr_unowned()); } template T *as_raw_ptr_release_ownership(smart_holder &hld, const char *context = "as_raw_ptr_release_ownership") { hld.ensure_can_release_ownership(context); T *raw_ptr = hld.as_raw_ptr_unowned(); hld.release_ownership(); return raw_ptr; } template > std::unique_ptr as_unique_ptr(smart_holder &hld) { static const char *context = "as_unique_ptr"; hld.ensure_compatible_rtti_uqp_del(context); hld.ensure_use_count_1(context); T *raw_ptr = hld.as_raw_ptr_unowned(); hld.release_ownership(); // KNOWN DEFECT (see PR #4850): Does not copy the deleter. return std::unique_ptr(raw_ptr); } } // namespace smart_holder_poc } // namespace memory } // namespace pybindit