111 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								// Copyright David Abrahams and Nikolay Mladenov 2003.
							 | 
						||
| 
								 | 
							
								// 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 RETURN_ARG_DWA2003719_HPP
							 | 
						||
| 
								 | 
							
								# define RETURN_ARG_DWA2003719_HPP
							 | 
						||
| 
								 | 
							
								# include <boost/python/default_call_policies.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/none.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/detail/value_arg.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_PYTHON_NO_PY_SIGNATURES
							 | 
						||
| 
								 | 
							
								# include <boost/python/converter/pytype_function.hpp>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/type_traits/add_reference.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/type_traits/add_const.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/mpl/int.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/mpl/at.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <boost/static_assert.hpp>
							 | 
						||
| 
								 | 
							
								# include <boost/python/refcount.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# include <cstddef>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace python { 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace detail
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  template <std::size_t>
							 | 
						||
| 
								 | 
							
								  struct return_arg_pos_argument_must_be_positive
							 | 
						||
| 
								 | 
							
								# if defined(__GNUC__) || defined(__EDG__)
							 | 
						||
| 
								 | 
							
								  {}
							 | 
						||
| 
								 | 
							
								# endif
							 | 
						||
| 
								 | 
							
								  ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  struct return_none
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								      template <class T> struct apply
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								          struct type
							 | 
						||
| 
								 | 
							
								          {
							 | 
						||
| 
								 | 
							
								              static bool convertible()
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                  return true;
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								              
							 | 
						||
| 
								 | 
							
								              PyObject *operator()( typename value_arg<T>::type ) const
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                  return none();
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_PYTHON_NO_PY_SIGNATURES
							 | 
						||
| 
								 | 
							
								              PyTypeObject const *get_pytype() const { return converter::expected_pytype_for_arg<T>::get_pytype() ; }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								          };
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    std::size_t arg_pos=1
							 | 
						||
| 
								 | 
							
								  , class Base = default_call_policies
							 | 
						||
| 
								 | 
							
								> 
							 | 
						||
| 
								 | 
							
								struct return_arg : Base
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								 private:
							 | 
						||
| 
								 | 
							
								    BOOST_STATIC_CONSTANT(bool, legal = arg_pos > 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 public:
							 | 
						||
| 
								 | 
							
								    typedef typename mpl::if_c<
							 | 
						||
| 
								 | 
							
								        legal
							 | 
						||
| 
								 | 
							
								        , detail::return_none
							 | 
						||
| 
								 | 
							
								        , detail::return_arg_pos_argument_must_be_positive<arg_pos>
							 | 
						||
| 
								 | 
							
								        // we could default to the base result_converter in case or
							 | 
						||
| 
								 | 
							
								        // arg_pos==0 since return arg 0 means return result, but I
							 | 
						||
| 
								 | 
							
								        // think it is better to issue an error instead, cause it can
							 | 
						||
| 
								 | 
							
								        // lead to confusions
							 | 
						||
| 
								 | 
							
								    >::type result_converter;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <class ArgumentPackage>
							 | 
						||
| 
								 | 
							
								    static PyObject* postcall(ArgumentPackage const& args, PyObject* result)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // In case of arg_pos == 0 we could simply return Base::postcall,
							 | 
						||
| 
								 | 
							
								        // but this is redundant
							 | 
						||
| 
								 | 
							
								        BOOST_STATIC_ASSERT(arg_pos > 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        result = Base::postcall(args,result);
							 | 
						||
| 
								 | 
							
								        if (!result)
							 | 
						||
| 
								 | 
							
								            return 0;
							 | 
						||
| 
								 | 
							
								        Py_DECREF(result);
							 | 
						||
| 
								 | 
							
								        return incref( detail::get(mpl::int_<arg_pos-1>(),args) );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <class Sig> 
							 | 
						||
| 
								 | 
							
								    struct extract_return_type : mpl::at_c<Sig, arg_pos>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								    class Base = default_call_policies
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								struct return_self 
							 | 
						||
| 
								 | 
							
								  : return_arg<1,Base>
							 | 
						||
| 
								 | 
							
								{};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}} // namespace boost::python
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // RETURN_ARG_DWA2003719_HPP
							 |