diff --git a/include/boost/python/object/pointer_holder.hpp b/include/boost/python/object/pointer_holder.hpp new file mode 100644 index 00000000..8ae778b4 --- /dev/null +++ b/include/boost/python/object/pointer_holder.hpp @@ -0,0 +1,132 @@ +// Copyright David Abrahams 2001. Permission to copy, use, +// modify, sell and distribute this software is granted provided this +// copyright notice appears in all copies. This software is provided +// "as is" without express or implied warranty, and with no claim as +// to its suitability for any purpose. +#ifndef POINTER_HOLDER_DWA20011215_HPP +# define POINTER_HOLDER_DWA20011215_HPP + +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include + +namespace boost { namespace python { namespace objects { + +template +struct pointer_holder : instance_holder +{ + pointer_holder(Pointer); + + // Forward construction to the held object +# ifndef BOOST_PYTHON_GENERATE_CODE +# include +# endif + + +# define BOOST_PYTHON_CONSTRUCT_POINTER_HOLDER(nargs, ignored) \ + BOOST_PP_EXPR_IF(nargs, template <) \ + BOOST_PP_ENUM_PARAMS(nargs, class A) \ + BOOST_PP_EXPR_IF(nargs, >) \ + pointer_holder(PyObject* \ + BOOST_PP_COMMA_IF(nargs) \ + BOOST_PYTHON_ENUM_PARAMS2(nargs, (A,a))) \ + : m_p(new Value( \ + BOOST_PP_ENUM(nargs, BOOST_PYTHON_UNFORWARD, nil) \ + )) \ + {} + + BOOST_PYTHON_REPEAT_ARITY_2ND(BOOST_PYTHON_CONSTRUCT_POINTER_HOLDER,nil) + + private: // required holder implementation + void* holds(converter::undecorated_type_id_t); + + private: // data members + Pointer m_p; +}; + +template +struct pointer_holder_back_reference : instance_holder +{ + private: + typedef typename python::detail::pointee::type held_type; + public: + + pointer_holder_back_reference(Pointer); + + // Forward construction to the held object +# ifndef BOOST_PYTHON_GENERATE_CODE +# include +# endif + +# define BOOST_PYTHON_CONSTRUCT_POINTER_HOLDER_BACK_REFERENCE(nargs, ignored) \ + BOOST_PP_EXPR_IF(nargs, template <) \ + BOOST_PP_ENUM_PARAMS(nargs, class A) \ + BOOST_PP_EXPR_IF(nargs, >) \ + pointer_holder_back_reference(PyObject* p \ + BOOST_PP_COMMA_IF(nargs) \ + BOOST_PYTHON_ENUM_PARAMS2(nargs, (A,a))) \ + : m_p(new held_type( \ + p BOOST_PP_COMMA_IF(nargs) \ + BOOST_PP_ENUM(nargs, BOOST_PYTHON_UNFORWARD, nil) \ + )) \ + { \ + void const* x = &instance_finder::registration; (void)x; \ + } + + BOOST_PYTHON_REPEAT_ARITY_2ND(BOOST_PYTHON_CONSTRUCT_POINTER_HOLDER_BACK_REFERENCE,nil) + + private: // required holder implementation + void* holds(converter::undecorated_type_id_t); + + private: // data members + Pointer m_p; +}; + +template +pointer_holder::pointer_holder(Pointer p) + : m_p(p) +{ +} + +template +pointer_holder_back_reference::pointer_holder_back_reference(Pointer p) + : m_p(p) +{ +} + +template +void* pointer_holder::holds(converter::undecorated_type_id_t dst_t) +{ + if (dst_t == converter::undecorated_type_id()) + return &this->m_p; + + converter::type_id_t src_t = converter::undecorated_type_id(); + return src_t == dst_t ? &*this->m_p + : find_dynamic_type(&*this->m_p, src_t, dst_t); +} + +template +void* pointer_holder_back_reference::holds(converter::undecorated_type_id_t dst_t) +{ + if (dst_t == converter::undecorated_type_id()) + return &this->m_p; + + if (dst_t == converter::undecorated_type_id()) + return &*this->m_p; + + converter::type_id_t src_t = converter::undecorated_type_id(); + 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