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 TO_PYTHON_INDIRECT_DWA200221_HPP Chris@16: # define TO_PYTHON_INDIRECT_DWA200221_HPP Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: Chris@16: #ifndef BOOST_PYTHON_NO_PY_SIGNATURES Chris@16: # include Chris@16: #endif Chris@16: Chris@16: # include Chris@16: Chris@16: # include Chris@16: # include Chris@16: Chris@16: # include Chris@16: Chris@16: # if defined(__ICL) && __ICL < 600 Chris@16: # include Chris@16: # else Chris@16: # include Chris@16: # endif Chris@16: Chris@16: namespace boost { namespace python { Chris@16: Chris@16: template Chris@16: struct to_python_indirect Chris@16: { Chris@16: template Chris@16: inline PyObject* Chris@16: operator()(U const& ref) const Chris@16: { Chris@16: return this->execute(const_cast(ref), is_pointer()); Chris@16: } Chris@16: #ifndef BOOST_PYTHON_NO_PY_SIGNATURES Chris@16: inline PyTypeObject const* Chris@16: get_pytype()const Chris@16: { Chris@16: return converter::registered_pytype::get_pytype(); Chris@16: } Chris@16: #endif Chris@16: private: Chris@16: template Chris@16: inline PyObject* execute(U* ptr, mpl::true_) const Chris@16: { Chris@16: // No special NULL treatment for references Chris@16: if (ptr == 0) Chris@16: return python::detail::none(); Chris@16: else Chris@16: return this->execute(*ptr, mpl::false_()); Chris@16: } Chris@16: Chris@16: template Chris@16: inline PyObject* execute(U const& x, mpl::false_) const Chris@16: { Chris@16: U* const p = &const_cast(x); Chris@16: if (is_polymorphic::value) Chris@16: { Chris@16: if (PyObject* o = detail::wrapper_base_::owner(p)) Chris@16: return incref(o); Chris@16: } Chris@16: return MakeHolder::execute(p); Chris@16: } Chris@16: }; Chris@16: Chris@16: // Chris@16: // implementations Chris@16: // Chris@16: namespace detail Chris@16: { Chris@16: struct make_owning_holder Chris@16: { Chris@16: template Chris@16: static PyObject* execute(T* p) Chris@16: { Chris@16: // can't use auto_ptr with Intel 5 and VC6 Dinkum library Chris@16: // for some reason. We get link errors against the auto_ptr Chris@16: // copy constructor. Chris@16: # if defined(__ICL) && __ICL < 600 Chris@16: typedef boost::shared_ptr smart_pointer; Chris@16: # else Chris@16: typedef std::auto_ptr smart_pointer; Chris@16: # endif Chris@16: typedef objects::pointer_holder holder_t; Chris@16: Chris@16: smart_pointer ptr(const_cast(p)); Chris@16: return objects::make_ptr_instance::execute(ptr); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct make_reference_holder Chris@16: { Chris@16: template Chris@16: static PyObject* execute(T* p) Chris@16: { Chris@16: typedef objects::pointer_holder holder_t; Chris@16: T* q = const_cast(p); Chris@16: return objects::make_ptr_instance::execute(q); Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: }} // namespace boost::python Chris@16: Chris@16: #endif // TO_PYTHON_INDIRECT_DWA200221_HPP