2
0
mirror of https://github.com/boostorg/python.git synced 2026-01-21 05:02:17 +00:00

Yet another bug reported by Peter Bienstman is now fixed.

[SVN r13370]
This commit is contained in:
Dave Abrahams
2002-04-04 21:18:00 +00:00
parent 8de3571aa8
commit b601ba55d0
8 changed files with 356 additions and 235 deletions

View File

@@ -10,28 +10,99 @@
# include <boost/type_traits/object_traits.hpp>
# include <boost/type_traits/composite_traits.hpp>
# include <boost/type_traits/transform_traits.hpp>
# include <boost/ref.hpp>
namespace boost { namespace python { namespace objects {
template <class T>
struct reference_to_value
{
typedef typename add_reference<typename add_const<T>::type>::type reference;
reference_to_value(reference x) : m_value(x) {}
operator reference() const { return m_value; }
private:
reference m_value;
};
// A little metaprogram which selects the type to pass through an
// intermediate forwarding function when the destination argument type
// is T.
template <class T>
struct forward
{
BOOST_STATIC_CONSTANT(
bool, by_value = (is_scalar<T>::value | is_reference<T>::value)
);
typedef typename mpl::select_type<
by_value
: mpl::select_type<
is_scalar<T>::value
, T
, reference_wrapper<
typename add_const<T>::type
>
>::type type;
, reference_to_value<T> >
{
};
# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
template<typename T>
class unforward
{
public:
typedef typename unwrap_reference<T>::type& type;
};
template<typename T>
class unforward<reference_to_value<T> >
{
public:
typedef T type;
};
# else // no partial specialization
namespace detail
{
typedef char (&yes_reference_to_value_t)[1];
typedef char (&no_reference_to_value_t)[2];
no_reference_to_value_t is_reference_to_value_test(...);
template<typename T>
yes_reference_to_value_t is_reference_to_value_test(type< reference_to_value<T> >);
template<bool wrapped>
struct unforwarder
{
template <class T>
struct apply
{
typedef typename unwrap_reference<T>::type& type;
};
};
template<>
struct unforwarder<true>
{
template <class T>
struct apply
{
typedef typename T::reference type;
};
};
template<typename T>
class is_reference_to_value
{
public:
BOOST_STATIC_CONSTANT(
bool, value = (
sizeof(is_reference_to_value_test(type<T>()))
== sizeof(yes_reference_to_value_t)));
};
}
template <typename T>
class unforward
: public detail::unforwarder<
detail::is_reference_to_value<T>::value
>::template apply<T>
{};
# endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
}}} // namespace boost::python::objects
#endif // FORWARD_DWA20011215_HPP

View File

@@ -10,7 +10,7 @@
# include <boost/python/converter/type_id.hpp>
# include <boost/python/object/inheritance.hpp>
# include <boost/python/object/find_instance.hpp>
# include <boost/ref.hpp>
# include <boost/python/object/forward.hpp>
# include <boost/type.hpp>
# include <boost/mpl/select_type.hpp>
# include <boost/mpl/apply.hpp>
@@ -31,113 +31,113 @@ struct pointer_holder : instance_holder
template <class A1>
pointer_holder(PyObject*, A1 a1)
: m_p(new Value(
(typename unwrap_reference<A1>::type&)(a1)
(typename unforward<A1>::type)(a1)
))
{}
template <class A1, class A2>
pointer_holder(PyObject*, A1 a1, A2 a2)
: m_p(new Value(
(typename unwrap_reference<A1>::type&)(a1)
, (typename unwrap_reference<A2>::type&)(a2)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
))
{}
template <class A1, class A2, class A3>
pointer_holder(PyObject*, A1 a1, A2 a2, A3 a3)
: m_p(new Value(
(typename unwrap_reference<A1>::type&)(a1)
, (typename unwrap_reference<A2>::type&)(a2)
, (typename unwrap_reference<A3>::type&)(a3)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
))
{}
template <class A1, class A2, class A3, class A4>
pointer_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4)
: m_p(new Value(
(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 unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
))
{}
template <class A1, class A2, class A3, class A4, class A5>
pointer_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
: m_p(new Value(
(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)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
)) {}
template <class A1, class A2, class A3, class A4, class A5, class A6>
pointer_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
: m_p(new Value(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
)) {}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7>
pointer_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
: m_p(new Value(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
))
{}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
pointer_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
: m_p(new Value(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
))
{}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
pointer_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
: m_p(new Value(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unwrap_reference<A9>::type&)(a9)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
, (typename unforward<A9>::type)(a9)
))
{}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
pointer_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
: m_p(new Value(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unwrap_reference<A9>::type&)(a9)
, (typename unwrap_reference<A10>::type&)(a10)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
, (typename unforward<A9>::type)(a9)
, (typename unforward<A10>::type)(a10)
))
{}
@@ -166,7 +166,7 @@ struct pointer_holder_back_reference : instance_holder
template <class A1>
pointer_holder_back_reference(PyObject* p, A1 a1)
: m_p(new held_type(p
, (typename unwrap_reference<A1>::type&)(a1)
, (typename unforward<A1>::type)(a1)
))
{
void const* x = &instance_finder<held_type>::registration; (void)x;
@@ -176,8 +176,8 @@ struct pointer_holder_back_reference : instance_holder
template <class A1, class A2>
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2)
: m_p(new held_type(p
, (typename unwrap_reference<A1>::type&)(a1)
, (typename unwrap_reference<A2>::type&)(a2)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
))
{
void const* x = &instance_finder<held_type>::registration; (void)x;
@@ -187,9 +187,9 @@ struct pointer_holder_back_reference : instance_holder
template <class A1, class A2, class A3>
pointer_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3)
: 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 unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
))
{
void const* x = &instance_finder<held_type>::registration; (void)x;
@@ -199,10 +199,10 @@ struct pointer_holder_back_reference : instance_holder
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 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 unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
))
{
void const* x = &instance_finder<held_type>::registration; (void)x;
@@ -212,11 +212,11 @@ struct pointer_holder_back_reference : instance_holder
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 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)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
)) {
void const* x = &instance_finder<held_type>::registration; (void)x;
}
@@ -225,12 +225,12 @@ struct pointer_holder_back_reference : instance_holder
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 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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
)) {
void const* x = &instance_finder<held_type>::registration; (void)x;
}
@@ -239,13 +239,13 @@ struct pointer_holder_back_reference : instance_holder
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 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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
))
{
void const* x = &instance_finder<held_type>::registration; (void)x;
@@ -255,14 +255,14 @@ struct pointer_holder_back_reference : instance_holder
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 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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
))
{
void const* x = &instance_finder<held_type>::registration; (void)x;
@@ -272,15 +272,15 @@ struct pointer_holder_back_reference : instance_holder
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 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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unwrap_reference<A9>::type&)(a9)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
, (typename unforward<A9>::type)(a9)
))
{
void const* x = &instance_finder<held_type>::registration; (void)x;
@@ -290,16 +290,16 @@ struct pointer_holder_back_reference : instance_holder
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 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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unwrap_reference<A9>::type&)(a9)
, (typename unwrap_reference<A10>::type&)(a10)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
, (typename unforward<A9>::type)(a9)
, (typename unforward<A10>::type)(a10)
))
{
void const* x = &instance_finder<held_type>::registration; (void)x;

View File

@@ -11,7 +11,7 @@
# include <boost/python/converter/type_id.hpp>
# include <boost/python/object/inheritance.hpp>
# include <boost/python/object/find_instance.hpp>
# include <boost/ref.hpp>
# include <boost/python/object/forward.hpp>
namespace boost { namespace python { namespace objects {
@@ -25,113 +25,113 @@ struct value_holder : instance_holder
template <class A1>
value_holder(PyObject*, A1 a1)
: m_held(
(typename unwrap_reference<A1>::type&)(a1)
(typename unforward<A1>::type)(a1)
)
{}
template <class A1, class A2>
value_holder(PyObject*, A1 a1, A2 a2)
: m_held(
(typename unwrap_reference<A1>::type&)(a1)
, (typename unwrap_reference<A2>::type&)(a2)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
)
{}
template <class A1, class A2, class A3>
value_holder(PyObject*, A1 a1, A2 a2, A3 a3)
: m_held(
(typename unwrap_reference<A1>::type&)(a1)
, (typename unwrap_reference<A2>::type&)(a2)
, (typename unwrap_reference<A3>::type&)(a3)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
)
{}
template <class A1, class A2, class A3, class A4>
value_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4)
: m_held(
(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 unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
)
{}
template <class A1, class A2, class A3, class A4, class A5>
value_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
: m_held(
(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)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
) {}
template <class A1, class A2, class A3, class A4, class A5, class A6>
value_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
: m_held(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
) {}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7>
value_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
: m_held(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
)
{}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
value_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
: m_held(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
)
{}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
value_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
: m_held(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unwrap_reference<A9>::type&)(a9)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
, (typename unforward<A9>::type)(a9)
)
{}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
value_holder(PyObject*, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
: m_held(
(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unwrap_reference<A9>::type&)(a9)
, (typename unwrap_reference<A10>::type&)(a10)
(typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
, (typename unforward<A9>::type)(a9)
, (typename unforward<A10>::type)(a10)
)
{}
@@ -155,7 +155,7 @@ struct value_holder_back_reference : instance_holder
template <class A1>
value_holder_back_reference(PyObject* p, A1 a1)
: m_held(p
, (typename unwrap_reference<A1>::type&)(a1)
, (typename unforward<A1>::type)(a1)
)
{
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;
@@ -165,8 +165,8 @@ struct value_holder_back_reference : instance_holder
template <class A1, class A2>
value_holder_back_reference(PyObject* p, A1 a1, A2 a2)
: m_held(p
, (typename unwrap_reference<A1>::type&)(a1)
, (typename unwrap_reference<A2>::type&)(a2)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
)
{
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;
@@ -176,9 +176,9 @@ struct value_holder_back_reference : instance_holder
template <class A1, class A2, class A3>
value_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3)
: m_held(p
, (typename unwrap_reference<A1>::type&)(a1)
, (typename unwrap_reference<A2>::type&)(a2)
, (typename unwrap_reference<A3>::type&)(a3)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
)
{
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;
@@ -188,10 +188,10 @@ struct value_holder_back_reference : instance_holder
template <class A1, class A2, class A3, class A4>
value_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4)
: m_held(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 unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
)
{
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;
@@ -201,11 +201,11 @@ struct value_holder_back_reference : instance_holder
template <class A1, class A2, class A3, class A4, class A5>
value_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
: m_held(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)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
) {
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;
}
@@ -214,12 +214,12 @@ struct value_holder_back_reference : instance_holder
template <class A1, class A2, class A3, class A4, class A5, class A6>
value_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
: m_held(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
) {
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;
}
@@ -228,13 +228,13 @@ struct value_holder_back_reference : instance_holder
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7>
value_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
: m_held(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
)
{
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;
@@ -244,14 +244,14 @@ struct value_holder_back_reference : instance_holder
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
value_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
: m_held(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
)
{
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;
@@ -261,15 +261,15 @@ struct value_holder_back_reference : instance_holder
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
value_holder_back_reference(PyObject* p, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
: m_held(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unwrap_reference<A9>::type&)(a9)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
, (typename unforward<A9>::type)(a9)
)
{
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;
@@ -279,16 +279,16 @@ struct value_holder_back_reference : instance_holder
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
value_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_held(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)
, (typename unwrap_reference<A6>::type&)(a6)
, (typename unwrap_reference<A7>::type&)(a7)
, (typename unwrap_reference<A8>::type&)(a8)
, (typename unwrap_reference<A9>::type&)(a9)
, (typename unwrap_reference<A10>::type&)(a10)
, (typename unforward<A1>::type)(a1)
, (typename unforward<A2>::type)(a2)
, (typename unforward<A3>::type)(a3)
, (typename unforward<A4>::type)(a4)
, (typename unforward<A5>::type)(a5)
, (typename unforward<A6>::type)(a6)
, (typename unforward<A7>::type)(a7)
, (typename unforward<A8>::type)(a8)
, (typename unforward<A9>::type)(a9)
, (typename unforward<A10>::type)(a10)
)
{
void const* x = &instance_finder<BackReferenceType>::registration; (void)x;

View File

@@ -53,6 +53,7 @@ rule bpl-test ( name ? : files * )
bpl-test bienstman1 ;
bpl-test bienstman2 ;
bpl-test bienstman3 ;
bpl-test try : newtest.py m1.cpp m2.cpp ;
bpl-test builtin_converters : test_builtin_converters.py test_builtin_converters.cpp ;
bpl-test test_pointer_adoption ;

View File

@@ -1,5 +1,6 @@
'''
>>> import bienstman1_ext
>>> from bienstman1_ext import *
>>> # from Numeric import *
'''
def run(args = None):
import sys

View File

@@ -1,5 +1,5 @@
'''
>>> import bienstman1_ext.py
>>> import bienstman2_ext
'''
def run(args = None):
import sys

33
test/bienstman3.cpp Normal file
View File

@@ -0,0 +1,33 @@
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/mpl/type_list.hpp>
struct V
{
virtual void f() = 0;
};
struct B
{
B(const V&) {}
};
BOOST_PYTHON_MODULE_INIT(bienstman3_ext)
{
using namespace boost::python;
using boost::mpl::type_list;
module m("bienstman3_ext");
m
.add(
class_<V, boost::noncopyable>("V")
)
.add(
class_<B>("B")
.def_init(type_list<const V&>())
)
;
}

15
test/bienstman3.py Normal file
View File

@@ -0,0 +1,15 @@
'''
>>> from bienstman3_ext import *
'''
def run(args = None):
import sys
import doctest
if args is not None:
sys.argv = args
return doctest.testmod(sys.modules.get(__name__))
if __name__ == '__main__':
print "running..."
import sys
sys.exit(run()[0])