Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-01-09 10:20:47

0001 // Copyright (c) 2021 The Pybind Development Team.
0002 // All rights reserved. Use of this source code is governed by a
0003 // BSD-style license that can be found in the LICENSE file.
0004 
0005 #pragma once
0006 
0007 #include "common.h"
0008 
0009 #include <type_traits>
0010 
0011 PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
0012 PYBIND11_NAMESPACE_BEGIN(detail)
0013 
0014 template <typename To, typename From, typename SFINAE = void>
0015 struct dynamic_raw_ptr_cast_is_possible : std::false_type {};
0016 
0017 template <typename To, typename From>
0018 struct dynamic_raw_ptr_cast_is_possible<
0019     To,
0020     From,
0021     detail::enable_if_t<!std::is_same<To, void>::value && std::is_polymorphic<From>::value>>
0022     : std::true_type {};
0023 
0024 template <typename To,
0025           typename From,
0026           detail::enable_if_t<!dynamic_raw_ptr_cast_is_possible<To, From>::value, int> = 0>
0027 To *dynamic_raw_ptr_cast_if_possible(From * /*ptr*/) {
0028     return nullptr;
0029 }
0030 
0031 template <typename To,
0032           typename From,
0033           detail::enable_if_t<dynamic_raw_ptr_cast_is_possible<To, From>::value, int> = 0>
0034 To *dynamic_raw_ptr_cast_if_possible(From *ptr) {
0035     return dynamic_cast<To *>(ptr);
0036 }
0037 
0038 PYBIND11_NAMESPACE_END(detail)
0039 PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)