122 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			3.8 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 OBJ_MGR_ARG_FROM_PYTHON_DWA2002628_HPP
							 | 
						||
| 
								 | 
							
								# define OBJ_MGR_ARG_FROM_PYTHON_DWA2002628_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/prefix.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/referent_storage.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/destroy.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/construct.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/converter/object_manager.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/raw_pyobject.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/tag.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// arg_from_python converters for Python type wrappers, to be used as
							 | 
						||
| 
								 | 
							
								// base classes for specializations.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								namespace boost { namespace python { namespace converter { 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								struct object_manager_value_arg_from_python
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    typedef T result_type;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    object_manager_value_arg_from_python(PyObject*);
							 | 
						||
| 
								 | 
							
								    bool convertible() const;
							 | 
						||
| 
								 | 
							
								    T operator()() const;
							 | 
						||
| 
								 | 
							
								 private:
							 | 
						||
| 
								 | 
							
								    PyObject* m_source;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Used for converting reference-to-object-manager arguments from
							 | 
						||
| 
								 | 
							
								// python. The process used here is a little bit odd. Upon
							 | 
						||
| 
								 | 
							
								// construction, we build the object manager object in the m_result
							 | 
						||
| 
								 | 
							
								// object, *forcing* it to accept the source Python object by casting
							 | 
						||
| 
								 | 
							
								// its pointer to detail::borrowed_reference. This is supposed to
							 | 
						||
| 
								 | 
							
								// bypass any type checking of the source object. The convertible
							 | 
						||
| 
								 | 
							
								// check then extracts the owned object and checks it. If the check
							 | 
						||
| 
								 | 
							
								// fails, nothing else in the program ever gets to touch this strange
							 | 
						||
| 
								 | 
							
								// "forced" object.
							 | 
						||
| 
								 | 
							
								template <class Ref>
							 | 
						||
| 
								 | 
							
								struct object_manager_ref_arg_from_python
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    typedef Ref result_type;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    object_manager_ref_arg_from_python(PyObject*);
							 | 
						||
| 
								 | 
							
								    bool convertible() const;
							 | 
						||
| 
								 | 
							
								    Ref operator()() const;
							 | 
						||
| 
								 | 
							
								    ~object_manager_ref_arg_from_python();
							 | 
						||
| 
								 | 
							
								 private:
							 | 
						||
| 
								 | 
							
								    typename python::detail::referent_storage<Ref>::type m_result;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// implementations
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline object_manager_value_arg_from_python<T>::object_manager_value_arg_from_python(PyObject* x)
							 | 
						||
| 
								 | 
							
								    : m_source(x)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline bool object_manager_value_arg_from_python<T>::convertible() const
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return object_manager_traits<T>::check(m_source);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								inline T object_manager_value_arg_from_python<T>::operator()() const
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return T(python::detail::borrowed_reference(m_source));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Ref>
							 | 
						||
| 
								 | 
							
								inline object_manager_ref_arg_from_python<Ref>::object_manager_ref_arg_from_python(PyObject* x)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								# if defined(__EDG_VERSION__) && __EDG_VERSION__ <= 243
							 | 
						||
| 
								 | 
							
								    // needed for warning suppression
							 | 
						||
| 
								 | 
							
								    python::detail::borrowed_reference x_ = python::detail::borrowed_reference(x);
							 | 
						||
| 
								 | 
							
								    python::detail::construct_referent<Ref>(&m_result.bytes, x_);
							 | 
						||
| 
								 | 
							
								# else 
							 | 
						||
| 
								 | 
							
								    python::detail::construct_referent<Ref>(&m_result.bytes, (python::detail::borrowed_reference)x);
							 | 
						||
| 
								 | 
							
								# endif 
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Ref>
							 | 
						||
| 
								 | 
							
								inline object_manager_ref_arg_from_python<Ref>::~object_manager_ref_arg_from_python()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    python::detail::destroy_referent<Ref>(this->m_result.bytes);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace detail
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  template <class T>
							 | 
						||
| 
								 | 
							
								  inline bool object_manager_ref_check(T const& x)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								      return object_manager_traits<T>::check(get_managed_object(x, tag));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Ref>
							 | 
						||
| 
								 | 
							
								inline bool object_manager_ref_arg_from_python<Ref>::convertible() const
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return detail::object_manager_ref_check(
							 | 
						||
| 
								 | 
							
								        python::detail::void_ptr_to_reference(this->m_result.bytes, (Ref(*)())0));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class Ref>
							 | 
						||
| 
								 | 
							
								inline Ref object_manager_ref_arg_from_python<Ref>::operator()() const
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return python::detail::void_ptr_to_reference(
							 | 
						||
| 
								 | 
							
								        this->m_result.bytes, (Ref(*)())0);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}}} // namespace boost::python::converter
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // OBJ_MGR_ARG_FROM_PYTHON_DWA2002628_HPP
							 |