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