47 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			47 lines
		
	
	
		
			1.5 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 IMPLICIT_DWA2002326_HPP | ||
|  | # define IMPLICIT_DWA2002326_HPP | ||
|  | 
 | ||
|  | # include <boost/python/converter/rvalue_from_python_data.hpp> | ||
|  | # include <boost/python/converter/registrations.hpp> | ||
|  | # include <boost/python/converter/registered.hpp> | ||
|  | 
 | ||
|  | # include <boost/python/extract.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace python { namespace converter {  | ||
|  | 
 | ||
|  | template <class Source, class Target> | ||
|  | struct implicit | ||
|  | { | ||
|  |     static void* convertible(PyObject* obj) | ||
|  |     { | ||
|  |         // Find a converter which can produce a Source instance from | ||
|  |         // obj. The user has told us that Source can be converted to | ||
|  |         // Target, and instantiating construct() below, ensures that | ||
|  |         // at compile-time. | ||
|  |         return implicit_rvalue_convertible_from_python(obj, registered<Source>::converters) | ||
|  |             ? obj : 0; | ||
|  |     } | ||
|  |        | ||
|  |     static void construct(PyObject* obj, rvalue_from_python_stage1_data* data) | ||
|  |     { | ||
|  |         void* storage = ((rvalue_from_python_storage<Target>*)data)->storage.bytes; | ||
|  | 
 | ||
|  |         arg_from_python<Source> get_source(obj); | ||
|  |         bool convertible = get_source.convertible(); | ||
|  |         BOOST_VERIFY(convertible); | ||
|  |          | ||
|  |         new (storage) Target(get_source()); | ||
|  |          | ||
|  |         // record successful construction | ||
|  |         data->convertible = storage; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | }}} // namespace boost::python::converter | ||
|  | 
 | ||
|  | #endif // IMPLICIT_DWA2002326_HPP |