]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Copyright David Abrahams 2002. |
2 | // Distributed under the Boost Software License, Version 1.0. (See | |
3 | // accompanying file LICENSE_1_0.txt or copy at | |
4 | // http://www.boost.org/LICENSE_1_0.txt) | |
5 | #ifndef AS_TO_PYTHON_FUNCTION_DWA2002121_HPP | |
6 | # define AS_TO_PYTHON_FUNCTION_DWA2002121_HPP | |
7 | # include <boost/python/converter/to_python_function_type.hpp> | |
8 | ||
9 | namespace boost { namespace python { namespace converter { | |
10 | ||
11 | // Given a typesafe to_python conversion function, produces a | |
12 | // to_python_function_t which can be registered in the usual way. | |
13 | template <class T, class ToPython> | |
14 | struct as_to_python_function | |
15 | { | |
16 | // Assertion functions used to prevent wrapping of converters | |
17 | // which take non-const reference parameters. The T* argument in | |
18 | // the first overload ensures it isn't used in case T is a | |
19 | // reference. | |
20 | template <class U> | |
21 | static void convert_function_must_take_value_or_const_reference(U(*)(T), int, T* = 0) {} | |
22 | template <class U> | |
23 | static void convert_function_must_take_value_or_const_reference(U(*)(T const&), long ...) {} | |
24 | ||
25 | static PyObject* convert(void const* x) | |
26 | { | |
27 | convert_function_must_take_value_or_const_reference(&ToPython::convert, 1L); | |
28 | ||
29 | // Yes, the const_cast below opens a hole in const-correctness, | |
30 | // but it's needed to convert auto_ptr<U> to python. | |
31 | // | |
32 | // How big a hole is it? It allows ToPython::convert() to be | |
33 | // a function which modifies its argument. The upshot is that | |
34 | // client converters applied to const objects may invoke | |
35 | // undefined behavior. The damage, however, is limited by the | |
36 | // use of the assertion function. Thus, the only way this can | |
37 | // modify its argument is if T is an auto_ptr-like type. There | |
38 | // is still a const-correctness hole w.r.t. auto_ptr<U> const, | |
39 | // but c'est la vie. | |
40 | return ToPython::convert(*const_cast<T*>(static_cast<T const*>(x))); | |
41 | } | |
42 | #ifndef BOOST_PYTHON_NO_PY_SIGNATURES | |
43 | static PyTypeObject const * get_pytype() { return ToPython::get_pytype(); } | |
44 | #endif | |
45 | }; | |
46 | ||
47 | }}} // namespace boost::python::converter | |
48 | ||
49 | #endif // AS_TO_PYTHON_FUNCTION_DWA2002121_HPP |