You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
46 lines
1.5 KiB
46 lines
1.5 KiB
// 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
|
|
|