• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright Gottfried Ganßauge 2003.
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 /*
6  * Generic Return value converter generator for opaque C++-pointers
7  */
8 # ifndef RETURN_OPAQUE_POINTER_HPP_
9 # define RETURN_OPAQUE_POINTER_HPP_
10 
11 # include <boost/python/detail/prefix.hpp>
12 # include <boost/python/opaque_pointer_converter.hpp>
13 # include <boost/python/detail/force_instantiate.hpp>
14 # include <boost/python/to_python_value.hpp>
15 # include <boost/python/detail/value_arg.hpp>
16 # include <boost/mpl/assert.hpp>
17 
18 namespace boost { namespace python {
19 
20 namespace detail
21 {
22   template <class Pointee>
opaque_pointee(Pointee const volatile *)23   static void opaque_pointee(Pointee const volatile*)
24   {
25       force_instantiate(opaque<Pointee>::instance);
26   }
27 }
28 
29 struct return_opaque_pointer
30 {
31     template <class R>
32     struct apply
33     {
34         BOOST_MPL_ASSERT_MSG( is_pointer<R>::value, RETURN_OPAQUE_POINTER_EXPECTS_A_POINTER_TYPE, (R));
35 
36         struct type :
37           boost::python::to_python_value<
38               typename detail::value_arg<R>::type
39           >
40         {
typeboost::python::return_opaque_pointer::apply::type41             type() { detail::opaque_pointee(R()); }
42         };
43     };
44 };
45 
46 }} // namespace boost::python
47 # endif // RETURN_OPAQUE_POINTER_HPP_
48