• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>boost/python/instance_holder.hpp</title>
5<link rel="stylesheet" href="../../boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../index.html" title="Boost.Python Reference Manual">
8<link rel="up" href="../utility_and_infrastructure.html" title="Chapter 7. Utility and Infrastructure">
9<link rel="prev" href="../utility_and_infrastructure.html" title="Chapter 7. Utility and Infrastructure">
10<link rel="next" href="boost_python_pointee_hpp.html" title="boost/python/pointee.hpp">
11</head>
12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../../images/boost.png"></td></tr></table>
14<hr>
15<div class="spirit-nav">
16<a accesskey="p" href="../utility_and_infrastructure.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../utility_and_infrastructure.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="boost_python_pointee_hpp.html"><img src="../../images/next.png" alt="Next"></a>
17</div>
18<div class="section">
19<div class="titlepage"><div><div><h2 class="title" style="clear: both">
20<a name="utility_and_infrastructure.boost_python_instance_holder_hpp"></a><a class="link" href="boost_python_instance_holder_hpp.html" title="boost/python/instance_holder.hpp">boost/python/instance_holder.hpp</a>
21</h2></div></div></div>
22<div class="toc"><dl class="toc">
23<dt><span class="section"><a href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.introduction">Introduction</a></span></dt>
24<dt><span class="section"><a href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder">Class
25        template <code class="computeroutput"><span class="identifier">instance_holder</span></code></a></span></dt>
26<dt><span class="section"><a href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.examples">Examples</a></span></dt>
27</dl></div>
28<div class="section">
29<div class="titlepage"><div><div><h3 class="title">
30<a name="utility_and_infrastructure.boost_python_instance_holder_hpp.introduction"></a><a class="link" href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.introduction" title="Introduction">Introduction</a>
31</h3></div></div></div>
32<p>
33          &lt;boost/python/instance_holder.hpp&gt; provides class <code class="computeroutput"><span class="identifier">instance_holder</span></code>,
34          the base class for types which hold C++ instances of wrapped classes.
35        </p>
36</div>
37<div class="section">
38<div class="titlepage"><div><div><h3 class="title">
39<a name="utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder"></a><a class="link" href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder" title="Class template instance_holder">Class
40        template <code class="computeroutput"><span class="identifier">instance_holder</span></code></a>
41</h3></div></div></div>
42<div class="toc"><dl class="toc">
43<dt><span class="section"><a href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder.class_intance_holder_destructor">Class
44          <code class="computeroutput"><span class="identifier">intance_holder</span></code> destructor</a></span></dt>
45<dt><span class="section"><a href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder.class_intance_holder_modifiers">Class
46          <code class="computeroutput"><span class="identifier">intance_holder</span></code> modifiers</a></span></dt>
47<dt><span class="section"><a href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder.class_intance_holder_observers">Class
48          <code class="computeroutput"><span class="identifier">intance_holder</span></code> observers</a></span></dt>
49</dl></div>
50<p>
51          <code class="computeroutput"><span class="identifier">instance_holder</span></code> is an abstract
52          base class whose concrete derived classes hold C++ class instances within
53          their Python object wrappers. To allow multiple inheritance in Python from
54          C++ class wrappers, each such Python object contains a chain of instance_holders.
55          When an <code class="computeroutput"><span class="identifier">__init__</span></code> function
56          for a wrapped C++ class is invoked, a new <code class="computeroutput"><span class="identifier">instance_holder</span></code>
57          instance is created and installed in the Python object using its <code class="computeroutput"><span class="identifier">install</span><span class="special">()</span></code>
58          function. Each concrete class derived from <code class="computeroutput"><span class="identifier">instance_holder</span></code>
59          must provide a <code class="computeroutput"><span class="identifier">holds</span><span class="special">()</span></code>
60          implementation which allows Boost.Python to query it for the type(s) it
61          is holding. In order to support the held type's wrapped constructor(s),
62          the class must also provide constructors that can accept an initial <code class="computeroutput"><span class="identifier">PyObject</span><span class="special">*</span></code>
63          argument referring to the owning Python object, and which forward the rest
64          of their arguments to the constructor of the held type. The initial argument
65          is needed to enable virtual function overriding in Python, and may be ignored,
66          depending on the specific <code class="computeroutput"><span class="identifier">instance_holder</span></code>
67          subclass.
68        </p>
69<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">python</span>
70<span class="special">{</span>
71  <span class="keyword">class</span> <span class="identifier">instance_holder</span> <span class="special">:</span> <span class="identifier">noncopyable</span>
72  <span class="special">{</span>
73   <span class="keyword">public</span><span class="special">:</span>
74      <span class="comment">// destructor</span>
75      <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">instance_holder</span><span class="special">();</span>
76
77      <span class="comment">// instance_holder modifiers</span>
78      <span class="keyword">void</span> <span class="identifier">install</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">*</span> <span class="identifier">inst</span><span class="special">)</span> <span class="keyword">throw</span><span class="special">();</span>
79
80      <span class="comment">// instance_holder observers</span>
81      <span class="keyword">virtual</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">holds</span><span class="special">(</span><span class="identifier">type_info</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
82  <span class="special">};</span>
83<span class="special">}}</span>
84</pre>
85<div class="section">
86<div class="titlepage"><div><div><h4 class="title">
87<a name="utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder.class_intance_holder_destructor"></a><a class="link" href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder.class_intance_holder_destructor" title="Class intance_holder destructor">Class
88          <code class="computeroutput"><span class="identifier">intance_holder</span></code> destructor</a>
89</h4></div></div></div>
90<pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">instance_holder</span><span class="special">();</span></pre>
91<div class="variablelist">
92<p class="title"><b></b></p>
93<dl class="variablelist">
94<dt><span class="term">Effects</span></dt>
95<dd><p>
96                  destroys the object
97                </p></dd>
98</dl>
99</div>
100</div>
101<div class="section">
102<div class="titlepage"><div><div><h4 class="title">
103<a name="utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder.class_intance_holder_modifiers"></a><a class="link" href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder.class_intance_holder_modifiers" title="Class intance_holder modifiers">Class
104          <code class="computeroutput"><span class="identifier">intance_holder</span></code> modifiers</a>
105</h4></div></div></div>
106<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">install</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">*</span> <span class="identifier">inst</span><span class="special">)</span> <span class="keyword">throw</span><span class="special">();</span></pre>
107<div class="variablelist">
108<p class="title"><b></b></p>
109<dl class="variablelist">
110<dt><span class="term">Requires</span></dt>
111<dd><p>
112                  <code class="computeroutput"><span class="identifier">inst</span></code> is a Python
113                  instance of a wrapped C++ class type, or is a type derived from
114                  a wrapped C++ class type.
115                </p></dd>
116<dt><span class="term">Effects</span></dt>
117<dd><p>
118                  installs the new instance at the head of the Python object's chain
119                  of held instances.
120                </p></dd>
121<dt><span class="term">Throws</span></dt>
122<dd><p>
123                  nothing
124                </p></dd>
125</dl>
126</div>
127</div>
128<div class="section">
129<div class="titlepage"><div><div><h4 class="title">
130<a name="utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder.class_intance_holder_observers"></a><a class="link" href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.class_template_instance_holder.class_intance_holder_observers" title="Class intance_holder observers">Class
131          <code class="computeroutput"><span class="identifier">intance_holder</span></code> observers</a>
132</h4></div></div></div>
133<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">*</span><span class="identifier">holds</span><span class="special">(</span><span class="identifier">type_info</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span></pre>
134<div class="variablelist">
135<p class="title"><b></b></p>
136<dl class="variablelist">
137<dt><span class="term">Returns</span></dt>
138<dd><p>
139                  A pointer to an object of the type described by <code class="computeroutput"><span class="identifier">x</span></code>
140                  if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
141                  contains such an object, 0 otherwise.
142                </p></dd>
143</dl>
144</div>
145</div>
146</div>
147<div class="section">
148<div class="titlepage"><div><div><h3 class="title">
149<a name="utility_and_infrastructure.boost_python_instance_holder_hpp.examples"></a><a class="link" href="boost_python_instance_holder_hpp.html#utility_and_infrastructure.boost_python_instance_holder_hpp.examples" title="Examples">Examples</a>
150</h3></div></div></div>
151<p>
152          The following is a simplified version of the instance holder template used
153          by Boost.Python to wrap classes held by smart pointers:
154        </p>
155<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">SmartPtr</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Value</span><span class="special">&gt;</span>
156<span class="keyword">struct</span> <span class="identifier">pointer_holder</span> <span class="special">:</span> <span class="identifier">instance_holder</span>
157<span class="special">{</span>
158   <span class="comment">// construct from the SmartPtr type</span>
159   <span class="identifier">pointer_holder</span><span class="special">(</span><span class="identifier">SmartPtr</span> <span class="identifier">p</span><span class="special">)</span>
160       <span class="special">:</span><span class="identifier">m_p</span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span>
161
162   <span class="comment">// Forwarding constructors for the held type</span>
163   <span class="identifier">pointer_holder</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">*)</span>
164       <span class="special">:</span><span class="identifier">m_p</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">Value</span><span class="special">())</span>
165   <span class="special">{</span>
166   <span class="special">}</span>
167
168   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">A0</span><span class="special">&gt;</span>
169   <span class="identifier">pointer_holder</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">*,</span><span class="identifier">A0</span> <span class="identifier">a0</span><span class="special">)</span>
170       <span class="special">:</span><span class="identifier">m_p</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">Value</span><span class="special">(</span><span class="identifier">a0</span><span class="special">))</span>
171   <span class="special">{</span>
172   <span class="special">}</span>
173
174   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">A0</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">A1</span><span class="special">&gt;</span>
175   <span class="identifier">pointer_holder</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">*,</span><span class="identifier">A0</span> <span class="identifier">a0</span><span class="special">,</span><span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">)</span>
176       <span class="special">:</span><span class="identifier">m_p</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">Value</span><span class="special">(</span><span class="identifier">a0</span><span class="special">,</span><span class="identifier">a1</span><span class="special">))</span>
177   <span class="special">{</span>
178   <span class="special">}</span>
179   <span class="special">...</span>
180
181 <span class="keyword">private</span><span class="special">:</span> <span class="comment">// required holder implementation</span>
182   <span class="keyword">void</span><span class="special">*</span> <span class="identifier">holds</span><span class="special">(</span><span class="identifier">type_info</span> <span class="identifier">dst_t</span><span class="special">)</span>
183   <span class="special">{</span>
184       <span class="comment">// holds an instance of the SmartPtr type...</span>
185       <span class="keyword">if</span> <span class="special">(</span><span class="identifier">dst_t</span> <span class="special">==</span> <span class="identifier">python</span><span class="special">::</span><span class="identifier">type_id</span><span class="special">&lt;</span><span class="identifier">SmartPtr</span><span class="special">&gt;())</span>
186           <span class="keyword">return</span> <span class="special">&amp;</span><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">m_p</span><span class="special">;</span>
187
188       <span class="comment">// ...and an instance of the SmartPtr's element_type, if the</span>
189       <span class="comment">// pointer is non-null</span>
190       <span class="keyword">return</span> <span class="identifier">python</span><span class="special">::</span><span class="identifier">type_id</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;()</span> <span class="special">==</span> <span class="identifier">dst_t</span> <span class="special">?</span> <span class="special">&amp;*</span><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">m_p</span> <span class="special">:</span> <span class="number">0</span><span class="special">;</span>
191   <span class="special">}</span>
192
193 <span class="keyword">private</span><span class="special">:</span> <span class="comment">// data members</span>
194   <span class="identifier">SmartPtr</span> <span class="identifier">m_p</span><span class="special">;</span>
195<span class="special">};</span>
196</pre>
197</div>
198</div>
199<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
200<td align="left"></td>
201<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
202        Distributed under the Boost Software License, Version 1.0. (See accompanying
203        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>
204      </p>
205</div></td>
206</tr></table>
207<hr>
208<div class="spirit-nav">
209<a accesskey="p" href="../utility_and_infrastructure.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../utility_and_infrastructure.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="boost_python_pointee_hpp.html"><img src="../../images/next.png" alt="Next"></a>
210</div>
211</body>
212</html>
213