116 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								// Copyright David Abrahams 2002.
							 | 
						||
| 
								 | 
							
								// Distributed under the Boost Software License, Version 1.0. (See
							 | 
						||
| 
								 | 
							
								// accompanying file LICENSE_1_0.txt or copy at
							 | 
						||
| 
								 | 
							
								// http://www.boost.org/LICENSE_1_0.txt)
							 | 
						||
| 
								 | 
							
								#ifndef TO_PYTHON_INDIRECT_DWA200221_HPP
							 | 
						||
| 
								 | 
							
								# define TO_PYTHON_INDIRECT_DWA200221_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/prefix.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/python/object/pointer_holder.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/object/make_ptr_instance.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/none.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_PYTHON_NO_PY_SIGNATURES
							 | 
						||
| 
								 | 
							
								# include <boost/python/converter/pytype_function.hpp>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/python/refcount.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/type_traits/is_pointer.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/type_traits/is_polymorphic.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/mpl/bool.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# if defined(__ICL) && __ICL < 600 
							 | 
						||
| 
								 | 
							
								#  include <boost/shared_ptr.hpp>
							 | 
						||
| 
								 | 
							
								# else 
							 | 
						||
| 
								 | 
							
								#  include <memory>
							 | 
						||
| 
								 | 
							
								# endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace python {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T, class MakeHolder>
							 | 
						||
| 
								 | 
							
								struct to_python_indirect
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    template <class U>
							 | 
						||
| 
								 | 
							
								    inline PyObject*
							 | 
						||
| 
								 | 
							
								    operator()(U const& ref) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return this->execute(const_cast<U&>(ref), is_pointer<U>());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_PYTHON_NO_PY_SIGNATURES
							 | 
						||
| 
								 | 
							
								    inline PyTypeObject const*
							 | 
						||
| 
								 | 
							
								    get_pytype()const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return converter::registered_pytype<T>::get_pytype();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								 private:
							 | 
						||
| 
								 | 
							
								    template <class U>
							 | 
						||
| 
								 | 
							
								    inline PyObject* execute(U* ptr, mpl::true_) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // No special NULL treatment for references
							 | 
						||
| 
								 | 
							
								        if (ptr == 0)
							 | 
						||
| 
								 | 
							
								            return python::detail::none();
							 | 
						||
| 
								 | 
							
								        else
							 | 
						||
| 
								 | 
							
								            return this->execute(*ptr, mpl::false_());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    template <class U>
							 | 
						||
| 
								 | 
							
								    inline PyObject* execute(U const& x, mpl::false_) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        U* const p = &const_cast<U&>(x);
							 | 
						||
| 
								 | 
							
								        if (is_polymorphic<U>::value)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (PyObject* o = detail::wrapper_base_::owner(p))
							 | 
						||
| 
								 | 
							
								                return incref(o);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return MakeHolder::execute(p);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// implementations
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								namespace detail
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  struct make_owning_holder
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								      template <class T>
							 | 
						||
| 
								 | 
							
								      static PyObject* execute(T* p)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								          // can't use auto_ptr with Intel 5 and VC6 Dinkum library
							 | 
						||
| 
								 | 
							
								          // for some reason. We get link errors against the auto_ptr
							 | 
						||
| 
								 | 
							
								          // copy constructor.
							 | 
						||
| 
								 | 
							
								# if defined(__ICL) && __ICL < 600 
							 | 
						||
| 
								 | 
							
								          typedef boost::shared_ptr<T> smart_pointer;
							 | 
						||
| 
								 | 
							
								# elif __cplusplus < 201103L
							 | 
						||
| 
								 | 
							
								          typedef std::auto_ptr<T> smart_pointer;
							 | 
						||
| 
								 | 
							
								# else
							 | 
						||
| 
								 | 
							
								          typedef std::unique_ptr<T> smart_pointer;
							 | 
						||
| 
								 | 
							
								# endif
							 | 
						||
| 
								 | 
							
								          typedef objects::pointer_holder<smart_pointer, T> holder_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          smart_pointer ptr(const_cast<T*>(p));
							 | 
						||
| 
								 | 
							
								          return objects::make_ptr_instance<T, holder_t>::execute(ptr);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  struct make_reference_holder
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								      template <class T>
							 | 
						||
| 
								 | 
							
								      static PyObject* execute(T* p)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								          typedef objects::pointer_holder<T*, T> holder_t;
							 | 
						||
| 
								 | 
							
								          T* q = const_cast<T*>(p);
							 | 
						||
| 
								 | 
							
								          return objects::make_ptr_instance<T, holder_t>::execute(q);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}} // namespace boost::python
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // TO_PYTHON_INDIRECT_DWA200221_HPP
							 |