]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/python/doc/reference/return_opaque_pointer.qbk
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / python / doc / reference / return_opaque_pointer.qbk
CommitLineData
7c673cae
FG
1[section boost/python/return_opaque_pointer.hpp]
2[section Class `return_opaqe_pointer`]
3return_opaque_pointer is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions returning pointers to undefined types such that the return value is copied into a new Python object.
4
5In addition to specifying the `return_opaque_pointer` policy the [link to_from_python_type_conversion.boost_python_opaque_pointer_conv.macro_boost_python_opaque_specia `BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID`] macro must be used to define specializations for the [link utility_and_infrastructure.boost_python_type_id_hpp.functions `type_id`] function on the type pointed to by returned pointer.
6``
7namespace boost { namespace python
8{
9 struct return_opaque_pointer
10 {
11 template <class R> struct apply;
12 };
13}}
14``
15[endsect]
16[section Class `return_opaque_pointer` metafunctions]
17``template <class T> struct apply``
18[variablelist
19[[Returns][`detail::opaque_conversion_holder<R> type;`]]
20]
21[endsect]
22[section Example]
23In C++:
24``
25# include <boost/python/return_opaque_pointer.hpp>
26# include <boost/python/def.hpp>
27# include <boost/python/module.hpp>
28# include <boost/python/return_value_policy.hpp>
29
30typedef struct opaque_ *opaque;
31
32opaque the_op = ((opaque) 0x47110815);
33
34opaque get () { return the_op; }
35void use (opaque op) {
36 if (op != the_op)
37 throw std::runtime_error (std::string ("failed"));
38}
39
40void failuse (opaque op) {
41 if (op == the_op)
42 throw std::runtime_error (std::string ("success"));
43}
44
45BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(opaque_)
46
47namespace bpl = boost::python;
48
49BOOST_PYTHON_MODULE(opaque_ext)
50{
51 bpl::def (
52 "get", &::get, bpl::return_value_policy<bpl::return_opaque_pointer>());
53 bpl::def ("use", &::use);
54 bpl::def ("failuse", &::failuse);
55}
56``
57Python code:
58``
59"""
60>>> from opaque_ext import *
61>>> #
62>>> # Check for correct conversion
63>>> use(get())
64>>> failuse(get())
65Traceback (most recent call last):
66 ...
67RuntimeError: success
68>>> #
69>>> # Check that there is no conversion from integers ...
70>>> use(0)
71Traceback (most recent call last):
72 ...
73TypeError: bad argument type for built-in operation
74>>> #
75>>> # ... and from strings to opaque objects
76>>> use("")
77Traceback (most recent call last):
78 ...
79TypeError: bad argument type for built-in operation
80"""
81def run(args = None):
82 import sys
83 import doctest
84
85 if args is not None:
86 sys.argv = args
87 return doctest.testmod(sys.modules.get(__name__))
88
89if __name__ == '__main__':
90 print "running..."
91 import sys
92 sys.exit(run()[0])
93``
94[endsect]
95[endsect]