annotate DEPENDENCIES/generic/include/boost/python/object/inheritance.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // Copyright David Abrahams 2002.
Chris@16 2 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 3 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 4 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 5 #ifndef INHERITANCE_DWA200216_HPP
Chris@16 6 # define INHERITANCE_DWA200216_HPP
Chris@16 7
Chris@16 8 # include <boost/python/type_id.hpp>
Chris@16 9 # include <boost/shared_ptr.hpp>
Chris@16 10 # include <boost/mpl/if.hpp>
Chris@16 11 # include <boost/type_traits/is_polymorphic.hpp>
Chris@16 12 # include <boost/type_traits/is_base_and_derived.hpp>
Chris@16 13 # include <boost/detail/workaround.hpp>
Chris@16 14
Chris@16 15 namespace boost { namespace python { namespace objects {
Chris@16 16
Chris@16 17 typedef type_info class_id;
Chris@16 18 using python::type_id;
Chris@16 19
Chris@16 20 // Types used to get address and id of most derived type
Chris@16 21 typedef std::pair<void*,class_id> dynamic_id_t;
Chris@16 22 typedef dynamic_id_t (*dynamic_id_function)(void*);
Chris@16 23
Chris@16 24 BOOST_PYTHON_DECL void register_dynamic_id_aux(
Chris@16 25 class_id static_id, dynamic_id_function get_dynamic_id);
Chris@16 26
Chris@16 27 BOOST_PYTHON_DECL void add_cast(
Chris@16 28 class_id src_t, class_id dst_t, void* (*cast)(void*), bool is_downcast);
Chris@16 29
Chris@16 30 //
Chris@16 31 // a generator with an execute() function which, given a source type
Chris@16 32 // and a pointer to an object of that type, returns its most-derived
Chris@16 33 // /reachable/ type identifier and object pointer.
Chris@16 34 //
Chris@16 35
Chris@16 36 // first, the case where T has virtual functions
Chris@16 37 template <class T>
Chris@16 38 struct polymorphic_id_generator
Chris@16 39 {
Chris@16 40 static dynamic_id_t execute(void* p_)
Chris@16 41 {
Chris@16 42 T* p = static_cast<T*>(p_);
Chris@16 43 return std::make_pair(dynamic_cast<void*>(p), class_id(typeid(*p)));
Chris@16 44 }
Chris@16 45 };
Chris@16 46
Chris@16 47 // now, the non-polymorphic case.
Chris@16 48 template <class T>
Chris@16 49 struct non_polymorphic_id_generator
Chris@16 50 {
Chris@16 51 static dynamic_id_t execute(void* p_)
Chris@16 52 {
Chris@16 53 return std::make_pair(p_, python::type_id<T>());
Chris@16 54 }
Chris@16 55 };
Chris@16 56
Chris@16 57 // Now the generalized selector
Chris@16 58 template <class T>
Chris@16 59 struct dynamic_id_generator
Chris@16 60 : mpl::if_<
Chris@16 61 boost::is_polymorphic<T>
Chris@16 62 , boost::python::objects::polymorphic_id_generator<T>
Chris@16 63 , boost::python::objects::non_polymorphic_id_generator<T>
Chris@16 64 >
Chris@16 65 {};
Chris@16 66
Chris@16 67 // Register the dynamic id function for T with the type-conversion
Chris@16 68 // system.
Chris@16 69 template <class T>
Chris@16 70 void register_dynamic_id(T* = 0)
Chris@16 71 {
Chris@16 72 typedef typename dynamic_id_generator<T>::type generator;
Chris@16 73 register_dynamic_id_aux(
Chris@16 74 python::type_id<T>(), &generator::execute);
Chris@16 75 }
Chris@16 76
Chris@16 77 //
Chris@16 78 // a generator with an execute() function which, given a void*
Chris@16 79 // pointing to an object of type Source will attempt to convert it to
Chris@16 80 // an object of type Target.
Chris@16 81 //
Chris@16 82
Chris@16 83 template <class Source, class Target>
Chris@16 84 struct dynamic_cast_generator
Chris@16 85 {
Chris@16 86 static void* execute(void* source)
Chris@16 87 {
Chris@16 88 return dynamic_cast<Target*>(
Chris@16 89 static_cast<Source*>(source));
Chris@16 90 }
Chris@16 91
Chris@16 92 };
Chris@16 93
Chris@16 94 template <class Source, class Target>
Chris@16 95 struct implicit_cast_generator
Chris@16 96 {
Chris@16 97 static void* execute(void* source)
Chris@16 98 {
Chris@16 99 Target* result = static_cast<Source*>(source);
Chris@16 100 return result;
Chris@16 101 }
Chris@16 102 };
Chris@16 103
Chris@16 104 template <class Source, class Target>
Chris@16 105 struct cast_generator
Chris@16 106 : mpl::if_<
Chris@16 107 is_base_and_derived<Target,Source>
Chris@16 108 , implicit_cast_generator<Source,Target>
Chris@16 109 , dynamic_cast_generator<Source,Target>
Chris@16 110 >
Chris@16 111 {
Chris@16 112 };
Chris@16 113
Chris@16 114 template <class Source, class Target>
Chris@16 115 inline void register_conversion(
Chris@16 116 bool is_downcast = ::boost::is_base_and_derived<Source,Target>::value
Chris@16 117 // These parameters shouldn't be used; they're an MSVC bug workaround
Chris@16 118 , Source* = 0, Target* = 0)
Chris@16 119 {
Chris@16 120 typedef typename cast_generator<Source,Target>::type generator;
Chris@16 121
Chris@16 122 add_cast(
Chris@16 123 python::type_id<Source>()
Chris@16 124 , python::type_id<Target>()
Chris@16 125 , &generator::execute
Chris@16 126 , is_downcast
Chris@16 127 );
Chris@16 128 }
Chris@16 129
Chris@16 130 }}} // namespace boost::python::object
Chris@16 131
Chris@16 132 #endif // INHERITANCE_DWA200216_HPP