boost_python_instance_holder_hpp.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  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&#160;7.&#160;Utility and Infrastructure">
  9. <link rel="prev" href="../utility_and_infrastructure.html" title="Chapter&#160;7.&#160;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. <span class="comment">// instance_holder modifiers</span>
  77. <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>
  78. <span class="comment">// instance_holder observers</span>
  79. <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>
  80. <span class="special">};</span>
  81. <span class="special">}}</span>
  82. </pre>
  83. <div class="section">
  84. <div class="titlepage"><div><div><h4 class="title">
  85. <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
  86. <code class="computeroutput"><span class="identifier">intance_holder</span></code> destructor</a>
  87. </h4></div></div></div>
  88. <pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">instance_holder</span><span class="special">();</span></pre>
  89. <div class="variablelist">
  90. <p class="title"><b></b></p>
  91. <dl class="variablelist">
  92. <dt><span class="term">Effects</span></dt>
  93. <dd><p>
  94. destroys the object
  95. </p></dd>
  96. </dl>
  97. </div>
  98. </div>
  99. <div class="section">
  100. <div class="titlepage"><div><div><h4 class="title">
  101. <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
  102. <code class="computeroutput"><span class="identifier">intance_holder</span></code> modifiers</a>
  103. </h4></div></div></div>
  104. <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>
  105. <div class="variablelist">
  106. <p class="title"><b></b></p>
  107. <dl class="variablelist">
  108. <dt><span class="term">Requires</span></dt>
  109. <dd><p>
  110. <code class="computeroutput"><span class="identifier">inst</span></code> is a Python
  111. instance of a wrapped C++ class type, or is a type derived from
  112. a wrapped C++ class type.
  113. </p></dd>
  114. <dt><span class="term">Effects</span></dt>
  115. <dd><p>
  116. installs the new instance at the head of the Python object's chain
  117. of held instances.
  118. </p></dd>
  119. <dt><span class="term">Throws</span></dt>
  120. <dd><p>
  121. nothing
  122. </p></dd>
  123. </dl>
  124. </div>
  125. </div>
  126. <div class="section">
  127. <div class="titlepage"><div><div><h4 class="title">
  128. <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
  129. <code class="computeroutput"><span class="identifier">intance_holder</span></code> observers</a>
  130. </h4></div></div></div>
  131. <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>
  132. <div class="variablelist">
  133. <p class="title"><b></b></p>
  134. <dl class="variablelist">
  135. <dt><span class="term">Returns</span></dt>
  136. <dd><p>
  137. A pointer to an object of the type described by <code class="computeroutput"><span class="identifier">x</span></code>
  138. if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
  139. contains such an object, 0 otherwise.
  140. </p></dd>
  141. </dl>
  142. </div>
  143. </div>
  144. </div>
  145. <div class="section">
  146. <div class="titlepage"><div><div><h3 class="title">
  147. <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>
  148. </h3></div></div></div>
  149. <p>
  150. The following is a simplified version of the instance holder template used
  151. by Boost.Python to wrap classes held by smart pointers:
  152. </p>
  153. <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>
  154. <span class="keyword">struct</span> <span class="identifier">pointer_holder</span> <span class="special">:</span> <span class="identifier">instance_holder</span>
  155. <span class="special">{</span>
  156. <span class="comment">// construct from the SmartPtr type</span>
  157. <span class="identifier">pointer_holder</span><span class="special">(</span><span class="identifier">SmartPtr</span> <span class="identifier">p</span><span class="special">)</span>
  158. <span class="special">:</span><span class="identifier">m_p</span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span>
  159. <span class="comment">// Forwarding constructors for the held type</span>
  160. <span class="identifier">pointer_holder</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">*)</span>
  161. <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>
  162. <span class="special">{</span>
  163. <span class="special">}</span>
  164. <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>
  165. <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>
  166. <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>
  167. <span class="special">{</span>
  168. <span class="special">}</span>
  169. <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>
  170. <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>
  171. <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>
  172. <span class="special">{</span>
  173. <span class="special">}</span>
  174. <span class="special">...</span>
  175. <span class="keyword">private</span><span class="special">:</span> <span class="comment">// required holder implementation</span>
  176. <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>
  177. <span class="special">{</span>
  178. <span class="comment">// holds an instance of the SmartPtr type...</span>
  179. <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>
  180. <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>
  181. <span class="comment">// ...and an instance of the SmartPtr's element_type, if the</span>
  182. <span class="comment">// pointer is non-null</span>
  183. <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>
  184. <span class="special">}</span>
  185. <span class="keyword">private</span><span class="special">:</span> <span class="comment">// data members</span>
  186. <span class="identifier">SmartPtr</span> <span class="identifier">m_p</span><span class="special">;</span>
  187. <span class="special">};</span>
  188. </pre>
  189. </div>
  190. </div>
  191. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  192. <td align="left"></td>
  193. <td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
  194. Distributed under the Boost Software License, Version 1.0. (See accompanying
  195. 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>
  196. </p>
  197. </div></td>
  198. </tr></table>
  199. <hr>
  200. <div class="spirit-nav">
  201. <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>
  202. </div>
  203. </body>
  204. </html>