mirror of
https://github.com/boostorg/python.git
synced 2026-01-25 18:32:24 +00:00
Full virtual function and abstract base support; new class interface.
[SVN r13253]
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
# include <boost/type.hpp>
|
||||
# include <boost/mpl/select_type.hpp>
|
||||
# include <boost/mpl/apply.hpp>
|
||||
# include <boost/python/detail/pointee.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace objects {
|
||||
|
||||
@@ -147,81 +148,83 @@ struct pointer_holder : instance_holder
|
||||
Pointer m_p;
|
||||
};
|
||||
|
||||
template <class Pointer, class Value, class BackReferenceType>
|
||||
template <class Pointer, class Value>
|
||||
struct pointer_holder_back_reference : instance_holder
|
||||
{
|
||||
private:
|
||||
typedef typename python::detail::pointee<Pointer>::type held_type;
|
||||
public:
|
||||
|
||||
pointer_holder_back_reference(Pointer);
|
||||
|
||||
// Forward construction to the held object
|
||||
pointer_holder_back_reference(PyObject* p)
|
||||
: m_p(new BackReferenceType(p)) {
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
: m_p(new held_type(p)) {
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
|
||||
template <class A1>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
))
|
||||
{
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
template <class A1, class A2>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
, (typename unwrap_reference<A2>::type&)(a2)
|
||||
))
|
||||
{
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
template <class A1, class A2, class A3>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
, (typename unwrap_reference<A2>::type&)(a2)
|
||||
, (typename unwrap_reference<A3>::type&)(a3)
|
||||
))
|
||||
{
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
template <class A1, class A2, class A3, class A4>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
, (typename unwrap_reference<A2>::type&)(a2)
|
||||
, (typename unwrap_reference<A3>::type&)(a3)
|
||||
, (typename unwrap_reference<A4>::type&)(a4)
|
||||
))
|
||||
{
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
, (typename unwrap_reference<A2>::type&)(a2)
|
||||
, (typename unwrap_reference<A3>::type&)(a3)
|
||||
, (typename unwrap_reference<A4>::type&)(a4)
|
||||
, (typename unwrap_reference<A5>::type&)(a5)
|
||||
)) {
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5, class A6>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
, (typename unwrap_reference<A2>::type&)(a2)
|
||||
, (typename unwrap_reference<A3>::type&)(a3)
|
||||
@@ -229,13 +232,13 @@ struct pointer_holder_back_reference : instance_holder
|
||||
, (typename unwrap_reference<A5>::type&)(a5)
|
||||
, (typename unwrap_reference<A6>::type&)(a6)
|
||||
)) {
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
, (typename unwrap_reference<A2>::type&)(a2)
|
||||
, (typename unwrap_reference<A3>::type&)(a3)
|
||||
@@ -245,13 +248,13 @@ struct pointer_holder_back_reference : instance_holder
|
||||
, (typename unwrap_reference<A7>::type&)(a7)
|
||||
))
|
||||
{
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
, (typename unwrap_reference<A2>::type&)(a2)
|
||||
, (typename unwrap_reference<A3>::type&)(a3)
|
||||
@@ -262,13 +265,13 @@ struct pointer_holder_back_reference : instance_holder
|
||||
, (typename unwrap_reference<A8>::type&)(a8)
|
||||
))
|
||||
{
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
, (typename unwrap_reference<A2>::type&)(a2)
|
||||
, (typename unwrap_reference<A3>::type&)(a3)
|
||||
@@ -280,13 +283,13 @@ struct pointer_holder_back_reference : instance_holder
|
||||
, (typename unwrap_reference<A9>::type&)(a9)
|
||||
))
|
||||
{
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
|
||||
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
|
||||
: m_p(new BackReferenceType(p
|
||||
: m_p(new held_type(p
|
||||
, (typename unwrap_reference<A1>::type&)(a1)
|
||||
, (typename unwrap_reference<A2>::type&)(a2)
|
||||
, (typename unwrap_reference<A3>::type&)(a3)
|
||||
@@ -299,7 +302,7 @@ struct pointer_holder_back_reference : instance_holder
|
||||
, (typename unwrap_reference<A10>::type&)(a10)
|
||||
))
|
||||
{
|
||||
(void)instance_finder<BackReferenceType>::registration;
|
||||
(void)instance_finder<held_type>::registration;
|
||||
}
|
||||
|
||||
|
||||
@@ -310,81 +313,18 @@ struct pointer_holder_back_reference : instance_holder
|
||||
Pointer m_p;
|
||||
};
|
||||
|
||||
}}} // namespace boost::python::objects
|
||||
|
||||
// back to namespace boost for this forward declaration
|
||||
namespace boost
|
||||
{
|
||||
template <class T> class shared_ptr;
|
||||
}
|
||||
|
||||
namespace boost { namespace python { namespace objects {
|
||||
|
||||
struct shared_ptr_generator
|
||||
{
|
||||
template <class T>
|
||||
struct apply
|
||||
{
|
||||
typedef boost::shared_ptr<T> type;
|
||||
};
|
||||
};
|
||||
|
||||
struct no_back_reference;
|
||||
|
||||
// Workaround lack of partial specialization
|
||||
namespace detail
|
||||
{
|
||||
template <class BackReferenceType, class PointerGenerator>
|
||||
struct pointer_holder_back_reference_generator
|
||||
{
|
||||
template <class Held>
|
||||
struct apply
|
||||
{
|
||||
typedef typename mpl::apply1<
|
||||
PointerGenerator,BackReferenceType
|
||||
>::type pointer;
|
||||
|
||||
typedef pointer_holder_back_reference<pointer,Held,BackReferenceType> type;
|
||||
};
|
||||
};
|
||||
|
||||
template <class PointerGenerator>
|
||||
struct plain_pointer_holder_generator
|
||||
{
|
||||
template <class Held>
|
||||
struct apply
|
||||
{
|
||||
typedef typename mpl::apply1<
|
||||
PointerGenerator,Held
|
||||
>::type pointer;
|
||||
|
||||
typedef pointer_holder<pointer, Held> type;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
// A generator metafunction which can be passed to make_holder
|
||||
// PointerGenerator should be another generator metafunction which
|
||||
// makes the appropriate (smart) pointer type to hold the argument to
|
||||
// pointer_holder_generator.
|
||||
template <class PointerGenerator, class BackReferenceType = no_back_reference>
|
||||
struct pointer_holder_generator
|
||||
: mpl::select_type<
|
||||
is_same<BackReferenceType,no_back_reference>::value
|
||||
, detail::plain_pointer_holder_generator<
|
||||
PointerGenerator>
|
||||
, detail::pointer_holder_back_reference_generator<
|
||||
BackReferenceType,PointerGenerator>
|
||||
>::type
|
||||
{
|
||||
};
|
||||
|
||||
template <class Pointer, class Value>
|
||||
pointer_holder<Pointer,Value>::pointer_holder(Pointer p)
|
||||
: m_p(p)
|
||||
{
|
||||
}
|
||||
|
||||
template <class Pointer, class Value>
|
||||
pointer_holder_back_reference<Pointer,Value>::pointer_holder_back_reference(Pointer p)
|
||||
: m_p(p)
|
||||
{
|
||||
}
|
||||
|
||||
template <class Pointer, class Value>
|
||||
void* pointer_holder<Pointer, Value>::holds(converter::undecorated_type_id_t dst_t)
|
||||
{
|
||||
@@ -396,6 +336,20 @@ void* pointer_holder<Pointer, Value>::holds(converter::undecorated_type_id_t dst
|
||||
: find_dynamic_type(&*this->m_p, src_t, dst_t);
|
||||
}
|
||||
|
||||
template <class Pointer, class Value>
|
||||
void* pointer_holder_back_reference<Pointer, Value>::holds(converter::undecorated_type_id_t dst_t)
|
||||
{
|
||||
if (dst_t == converter::undecorated_type_id<Pointer>())
|
||||
return &this->m_p;
|
||||
|
||||
if (dst_t == converter::undecorated_type_id<held_type>())
|
||||
return &*this->m_p;
|
||||
|
||||
converter::type_id_t src_t = converter::undecorated_type_id<Value>();
|
||||
Value* p = &*this->m_p;
|
||||
return src_t == dst_t ? p : find_dynamic_type(p, src_t, dst_t);
|
||||
}
|
||||
|
||||
}}} // namespace boost::python::objects
|
||||
|
||||
#endif // POINTER_HOLDER_DWA20011215_HPP
|
||||
|
||||
Reference in New Issue
Block a user