// Copyright David Abrahams 2002. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef CAST_DWA200269_HPP # define CAST_DWA200269_HPP # include # include # include # include # include # include namespace boost { namespace python { namespace detail { template inline Target* upcast_impl(Source*, Target*); template inline Target* upcast(Source* p, yes_convertible, no_convertible, Target*) { return p; } template inline Target* upcast(Source* p, no_convertible, no_convertible, Target*) { typedef typename base_type_traits::type base; return detail::upcast_impl((base*)p, (Target*)0); } template struct upcaster { template static inline T* execute(T* x, T*) { return x; } }; template <> struct upcaster { template static inline Target* execute(Source* x, Target*) { return detail::upcast( x, detail::convertible::check(x) , detail::convertible::check((Target*)0) , (Target*)0); } }; template inline Target* downcast(Source* p, yes_convertible) { return static_cast(p); } template inline Target* downcast(Source* p, no_convertible, boost::type* = 0) { typedef typename base_type_traits::type base; return (Target*)detail::downcast(p, convertible::check((base*)0)); } template inline void assert_castable(boost::type* = 0) { typedef char must_be_a_complete_type[sizeof(T)]; } template inline Target* upcast_impl(Source* x, Target*) { typedef typename add_cv::type src_t; typedef typename add_cv::type target_t; bool const same = is_same::value; return detail::upcaster::execute(x, (Target*)0); } } template inline Target* upcast(Source* x, Target* = 0) { detail::assert_castable(); detail::assert_castable(); return detail::upcast_impl(x, (Target*)0); } template inline Target* downcast(Source* x, Target* = 0) { detail::assert_castable(); detail::assert_castable(); return detail::downcast(x, detail::convertible::check((Target*)0)); } }} // namespace boost::python #endif // CAST_DWA200269_HPP