[DEV] add v1.66.0

This commit is contained in:
2018-01-12 21:47:58 +01:00
parent 87059bb1af
commit a97e9ae7d4
49032 changed files with 7668950 additions and 0 deletions

View File

@@ -0,0 +1,363 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>boost/python/handle.hpp</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="Boost.Python Reference Manual">
<link rel="up" href="../utility_and_infrastructure.html" title="Chapter&#160;7.&#160;Utility and Infrastructure">
<link rel="prev" href="boost_python_pointee_hpp.html" title="boost/python/pointee.hpp">
<link rel="next" href="boost_python_type_id_hpp.html" title="boost/python/type_id.hpp">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../../images/boost.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_python_pointee_hpp.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_type_id_hpp.html"><img src="../../images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="utility_and_infrastructure.boost_python_handle_hpp"></a><a class="link" href="boost_python_handle_hpp.html" title="boost/python/handle.hpp">boost/python/handle.hpp</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.introduction">Introduction</a></span></dt>
<dt><span class="section"><a href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.class_template_handle">Class
template <code class="computeroutput"><span class="identifier">handle</span></code></a></span></dt>
<dt><span class="section"><a href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.function_borrowed">Function
<code class="computeroutput"><span class="identifier">borrowed</span></code></a></span></dt>
<dt><span class="section"><a href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.function_allow_null">Function
<code class="computeroutput"><span class="identifier">allow_null</span></code></a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_handle_hpp.introduction"></a><a class="link" href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.introduction" title="Introduction">Introduction</a>
</h3></div></div></div>
<p>
&lt;boost/python/handle.hpp&gt; provides class template <code class="computeroutput"><span class="identifier">handle</span></code>,
a smart pointer for managing reference-counted Python objects.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_handle_hpp.class_template_handle"></a><a class="link" href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.class_template_handle" title="Class template handle">Class
template <code class="computeroutput"><span class="identifier">handle</span></code></a>
</h3></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.class_template_handle.class_template_handle_constructo">Class
template <code class="computeroutput"><span class="identifier">handle</span></code> constructors
and destructor</a></span></dt>
<dt><span class="section"><a href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.class_template_handle.class_template_handle_modifiers">Class
template <code class="computeroutput"><span class="identifier">handle</span></code> modifiers</a></span></dt>
<dt><span class="section"><a href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.class_template_handle.class_template_handle_observers">Class
template <code class="computeroutput"><span class="identifier">handle</span></code> observers</a></span></dt>
</dl></div>
<p>
<code class="computeroutput"><span class="identifier">handle</span></code> is a smart pointer
to a Python object type; it holds a pointer of type <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span></code>, where <code class="computeroutput"><span class="identifier">T</span></code>
is its template parameter. T must be either a type derived from <code class="computeroutput"><span class="identifier">PyObject</span></code> or a <a class="link" href="../glossary.html#pod">POD</a>
type whose initial <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">)</span></code> bytes are layout-compatible with <code class="computeroutput"><span class="identifier">PyObject</span></code>. Use <code class="computeroutput"><span class="identifier">handle</span><span class="special">&lt;&gt;</span></code> at the boundary between the Python/'C'
API and high-level code; prefer object for a generalized interface to Python
objects.
</p>
<p>
In this document, the term "upcast" refers to an operation which
converts a pointer <code class="computeroutput"><span class="identifier">Y</span><span class="special">*</span></code>
to a base class <code class="computeroutput"><span class="identifier">pointer</span> <span class="identifier">T</span><span class="special">*</span></code> via
<code class="computeroutput"><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;</span></code>
if <code class="computeroutput"><span class="identifier">Y</span></code> is derived from <code class="computeroutput"><span class="identifier">T</span></code>, or via C-style cast (<code class="computeroutput"><span class="identifier">T</span><span class="special">*</span></code>) if
it is not. However, in the latter case the "upcast" is ill-formed
if the initial <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">)</span></code>
bytes of <code class="computeroutput"><span class="identifier">Y</span></code> are not layout-compatible
with <code class="computeroutput"><span class="identifier">PyObject</span></code>.
</p>
<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>
<span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">class</span> <span class="identifier">handle</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">member</span><span class="special">-</span><span class="identifier">function</span><span class="special">-</span><span class="identifier">pointer</span> <span class="identifier">bool_type</span><span class="special">;</span>
<span class="keyword">public</span><span class="special">:</span> <span class="comment">// types</span>
<span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">element_type</span><span class="special">;</span>
<span class="keyword">public</span><span class="special">:</span> <span class="comment">// member functions</span>
<span class="special">~</span><span class="identifier">handle</span><span class="special">();</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">borrowed</span><span class="special">&lt;</span><span class="identifier">null_ok</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;</span> <span class="special">&gt;*</span> <span class="identifier">p</span><span class="special">);</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">null_ok</span><span class="special">&lt;</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">borrowed</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;</span> <span class="special">&gt;*</span> <span class="identifier">p</span><span class="special">);</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">borrowed</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;*</span> <span class="identifier">p</span><span class="special">);</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">null_ok</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;*</span> <span class="identifier">p</span><span class="special">);</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">Y</span><span class="special">*</span> <span class="identifier">p</span><span class="special">);</span>
<span class="identifier">handle</span><span class="special">();</span>
<span class="identifier">handle</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">handle</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="identifier">handle</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">handle</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span> <span class="comment">// never throws</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="identifier">handle</span><span class="special">(</span><span class="identifier">handle</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
<span class="identifier">handle</span><span class="special">(</span><span class="identifier">handle</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
<span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;</span> <span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*</span> <span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
<span class="identifier">T</span><span class="special">*</span> <span class="identifier">release</span><span class="special">();</span>
<span class="keyword">operator</span> <span class="identifier">bool_type</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// never throws</span>
<span class="keyword">private</span><span class="special">:</span>
<span class="identifier">T</span><span class="special">*</span> <span class="identifier">m_p</span><span class="special">;</span>
<span class="special">};</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">null_ok</span><span class="special">;</span>
<span class="keyword">namespace</span> <span class="identifier">detail</span> <span class="special">{</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">borrowed</span><span class="special">;</span> <span class="special">}</span>
<span class="special">}}</span>
</pre>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="utility_and_infrastructure.boost_python_handle_hpp.class_template_handle.class_template_handle_constructo"></a><a class="link" href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.class_template_handle.class_template_handle_constructo" title="Class template handle constructors and destructor">Class
template <code class="computeroutput"><span class="identifier">handle</span></code> constructors
and destructor</a>
</h4></div></div></div>
<pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">handle</span><span class="special">();</span></pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">Py_XDECREF</span><span class="special">(</span><span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">PyObject</span><span class="special">*&gt;(</span><span class="identifier">m_p</span><span class="special">))</span></code>
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">borrowed</span><span class="special">&lt;</span><span class="identifier">null_ok</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;</span> <span class="special">&gt;*</span> <span class="identifier">p</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><pre class="programlisting"><span class="identifier">Py_XINCREF</span><span class="special">(</span><span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">PyObject</span><span class="special">*&gt;(</span><span class="identifier">p</span><span class="special">));</span>
<span class="identifier">m_p</span> <span class="special">=</span> <span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;(</span><span class="identifier">p</span><span class="special">);</span>
</pre></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">null_ok</span><span class="special">&lt;</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">borrowed</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;</span> <span class="special">&gt;*</span> <span class="identifier">p</span><span class="special">);</span></pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><pre class="programlisting"><span class="identifier">Py_XINCREF</span><span class="special">(</span><span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">PyObject</span><span class="special">*&gt;(</span><span class="identifier">p</span><span class="special">));</span>
<span class="identifier">m_p</span> <span class="special">=</span> <span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;(</span><span class="identifier">p</span><span class="special">);</span>
</pre></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">borrowed</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;*</span> <span class="identifier">p</span><span class="special">);</span></pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><pre class="programlisting"><span class="identifier">Py_XINCREF</span><span class="special">(</span><span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">PyObject</span><span class="special">*&gt;(</span><span class="identifier">p</span><span class="special">));</span>
<span class="identifier">m_p</span> <span class="special">=</span> <span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;(</span><span class="identifier">expect_non_null</span><span class="special">(</span><span class="identifier">p</span><span class="special">));</span>
</pre></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">null_ok</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;*</span> <span class="identifier">p</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">m_p</span> <span class="special">=</span>
<span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;(</span><span class="identifier">p</span><span class="special">);</span></code>
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="keyword">explicit</span> <span class="identifier">handle</span><span class="special">(</span><span class="identifier">Y</span><span class="special">*</span> <span class="identifier">p</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">m_p</span> <span class="special">=</span>
<span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;(</span><span class="identifier">expect_non_null</span><span class="special">(</span><span class="identifier">p</span><span class="special">));</span></code>
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="identifier">handle</span><span class="special">();</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">m_p</span> <span class="special">=</span>
<span class="number">0</span><span class="special">;</span></code>
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="identifier">handle</span><span class="special">(</span><span class="identifier">handle</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
<span class="identifier">handle</span><span class="special">(</span><span class="identifier">handle</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
m_p = r.m_p; Py_XINCREF(upcast&lt;PyObject*&gt;(m_p));
</p></dd>
</dl>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="utility_and_infrastructure.boost_python_handle_hpp.class_template_handle.class_template_handle_modifiers"></a><a class="link" href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.class_template_handle.class_template_handle_modifiers" title="Class template handle modifiers">Class
template <code class="computeroutput"><span class="identifier">handle</span></code> modifiers</a>
</h4></div></div></div>
<pre class="programlisting"><span class="identifier">handle</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">handle</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Y</span><span class="special">&gt;</span>
<span class="identifier">handle</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">handle</span><span class="special">&lt;</span><span class="identifier">Y</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span> <span class="comment">// never throws</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">Py_XINCREF</span><span class="special">(</span><span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">PyObject</span><span class="special">*&gt;(</span><span class="identifier">r</span><span class="special">.</span><span class="identifier">m_p</span><span class="special">));</span>
<span class="identifier">Py_XDECREF</span><span class="special">(</span>
<span class="identifier">upcast</span><span class="special">&lt;</span><span class="identifier">PyObject</span><span class="special">*&gt;(</span><span class="identifier">m_p</span><span class="special">));</span>
<span class="identifier">m_p</span> <span class="special">=</span>
<span class="identifier">r</span><span class="special">.</span><span class="identifier">m_p</span><span class="special">;</span></code>
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="identifier">T</span><span class="special">*</span> <span class="identifier">release</span><span class="special">();</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
<span class="identifier">x</span> <span class="special">=</span>
<span class="identifier">m_p</span><span class="special">;</span>
<span class="identifier">m_p</span> <span class="special">=</span>
<span class="number">0</span><span class="special">;</span>
<span class="keyword">return</span> <span class="identifier">x</span><span class="special">;</span></code>
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span>
<span class="special">=</span> <span class="identifier">handle</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;();</span></code>
</p></dd>
</dl>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="utility_and_infrastructure.boost_python_handle_hpp.class_template_handle.class_template_handle_observers"></a><a class="link" href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.class_template_handle.class_template_handle_observers" title="Class template handle observers">Class
template <code class="computeroutput"><span class="identifier">handle</span></code> observers</a>
</h4></div></div></div>
<pre class="programlisting"><span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;</span> <span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Returns</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">m_p</span><span class="special">;</span></code>
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*</span> <span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Returns</span></dt>
<dd><p>
<code class="computeroutput"><span class="special">*</span><span class="identifier">m_p</span><span class="special">;</span></code>
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">operator</span> <span class="identifier">bool_type</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// never throws</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Returns</span></dt>
<dd><p>
<code class="computeroutput"><span class="number">0</span></code> if <code class="computeroutput"><span class="identifier">m_p</span> <span class="special">==</span>
<span class="number">0</span></code>, a pointer convertible
to true otherwise.
</p></dd>
</dl>
</div>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_handle_hpp.function_borrowed"></a><a class="link" href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.function_borrowed" title="Function borrowed">Function
<code class="computeroutput"><span class="identifier">borrowed</span></code></a>
</h3></div></div></div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="identifier">detail</span><span class="special">::</span><span class="identifier">borrowed</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;*</span> <span class="identifier">borrowed</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">p</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">borrowed</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;*)</span><span class="identifier">p</span><span class="special">;</span>
<span class="special">}</span>
</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_handle_hpp.function_allow_null"></a><a class="link" href="boost_python_handle_hpp.html#utility_and_infrastructure.boost_python_handle_hpp.function_allow_null" title="Function allow_null">Function
<code class="computeroutput"><span class="identifier">allow_null</span></code></a>
</h3></div></div></div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="identifier">null_ok</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;*</span> <span class="identifier">allow_null</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">p</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="special">(</span><span class="identifier">null_ok</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;*)</span><span class="identifier">p</span><span class="special">;</span>
<span class="special">}</span>
</pre>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
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>
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_python_pointee_hpp.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_type_id_hpp.html"><img src="../../images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,212 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>boost/python/instance_holder.hpp</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="Boost.Python Reference Manual">
<link rel="up" href="../utility_and_infrastructure.html" title="Chapter&#160;7.&#160;Utility and Infrastructure">
<link rel="prev" href="../utility_and_infrastructure.html" title="Chapter&#160;7.&#160;Utility and Infrastructure">
<link rel="next" href="boost_python_pointee_hpp.html" title="boost/python/pointee.hpp">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../../images/boost.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<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>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<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>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<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>
<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
template <code class="computeroutput"><span class="identifier">instance_holder</span></code></a></span></dt>
<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>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<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>
</h3></div></div></div>
<p>
&lt;boost/python/instance_holder.hpp&gt; provides class <code class="computeroutput"><span class="identifier">instance_holder</span></code>,
the base class for types which hold C++ instances of wrapped classes.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<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
template <code class="computeroutput"><span class="identifier">instance_holder</span></code></a>
</h3></div></div></div>
<div class="toc"><dl class="toc">
<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
<code class="computeroutput"><span class="identifier">intance_holder</span></code> destructor</a></span></dt>
<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
<code class="computeroutput"><span class="identifier">intance_holder</span></code> modifiers</a></span></dt>
<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
<code class="computeroutput"><span class="identifier">intance_holder</span></code> observers</a></span></dt>
</dl></div>
<p>
<code class="computeroutput"><span class="identifier">instance_holder</span></code> is an abstract
base class whose concrete derived classes hold C++ class instances within
their Python object wrappers. To allow multiple inheritance in Python from
C++ class wrappers, each such Python object contains a chain of instance_holders.
When an <code class="computeroutput"><span class="identifier">__init__</span></code> function
for a wrapped C++ class is invoked, a new <code class="computeroutput"><span class="identifier">instance_holder</span></code>
instance is created and installed in the Python object using its <code class="computeroutput"><span class="identifier">install</span><span class="special">()</span></code>
function. Each concrete class derived from <code class="computeroutput"><span class="identifier">instance_holder</span></code>
must provide a <code class="computeroutput"><span class="identifier">holds</span><span class="special">()</span></code>
implementation which allows Boost.Python to query it for the type(s) it
is holding. In order to support the held type's wrapped constructor(s),
the class must also provide constructors that can accept an initial <code class="computeroutput"><span class="identifier">PyObject</span><span class="special">*</span></code>
argument referring to the owning Python object, and which forward the rest
of their arguments to the constructor of the held type. The initial argument
is needed to enable virtual function overriding in Python, and may be ignored,
depending on the specific <code class="computeroutput"><span class="identifier">instance_holder</span></code>
subclass.
</p>
<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>
<span class="special">{</span>
<span class="keyword">class</span> <span class="identifier">instance_holder</span> <span class="special">:</span> <span class="identifier">noncopyable</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="comment">// destructor</span>
<span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">instance_holder</span><span class="special">();</span>
<span class="comment">// instance_holder modifiers</span>
<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>
<span class="comment">// instance_holder observers</span>
<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>
<span class="special">};</span>
<span class="special">}}</span>
</pre>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<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
<code class="computeroutput"><span class="identifier">intance_holder</span></code> destructor</a>
</h4></div></div></div>
<pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">instance_holder</span><span class="special">();</span></pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
destroys the object
</p></dd>
</dl>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<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
<code class="computeroutput"><span class="identifier">intance_holder</span></code> modifiers</a>
</h4></div></div></div>
<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>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Requires</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">inst</span></code> is a Python
instance of a wrapped C++ class type, or is a type derived from
a wrapped C++ class type.
</p></dd>
<dt><span class="term">Effects</span></dt>
<dd><p>
installs the new instance at the head of the Python object's chain
of held instances.
</p></dd>
<dt><span class="term">Throws</span></dt>
<dd><p>
nothing
</p></dd>
</dl>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<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
<code class="computeroutput"><span class="identifier">intance_holder</span></code> observers</a>
</h4></div></div></div>
<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>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Returns</span></dt>
<dd><p>
A pointer to an object of the type described by <code class="computeroutput"><span class="identifier">x</span></code>
if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
contains such an object, 0 otherwise.
</p></dd>
</dl>
</div>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<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>
</h3></div></div></div>
<p>
The following is a simplified version of the instance holder template used
by Boost.Python to wrap classes held by smart pointers:
</p>
<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>
<span class="keyword">struct</span> <span class="identifier">pointer_holder</span> <span class="special">:</span> <span class="identifier">instance_holder</span>
<span class="special">{</span>
<span class="comment">// construct from the SmartPtr type</span>
<span class="identifier">pointer_holder</span><span class="special">(</span><span class="identifier">SmartPtr</span> <span class="identifier">p</span><span class="special">)</span>
<span class="special">:</span><span class="identifier">m_p</span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span>
<span class="comment">// Forwarding constructors for the held type</span>
<span class="identifier">pointer_holder</span><span class="special">(</span><span class="identifier">PyObject</span><span class="special">*)</span>
<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="special">{</span>
<span class="special">}</span>
<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>
<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="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="special">{</span>
<span class="special">}</span>
<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>
<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>
<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>
<span class="special">{</span>
<span class="special">}</span>
<span class="special">...</span>
<span class="keyword">private</span><span class="special">:</span> <span class="comment">// required holder implementation</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">dst_t</span><span class="special">)</span>
<span class="special">{</span>
<span class="comment">// holds an instance of the SmartPtr type...</span>
<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>
<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>
<span class="comment">// ...and an instance of the SmartPtr's element_type, if the</span>
<span class="comment">// pointer is non-null</span>
<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>
<span class="special">}</span>
<span class="keyword">private</span><span class="special">:</span> <span class="comment">// data members</span>
<span class="identifier">SmartPtr</span> <span class="identifier">m_p</span><span class="special">;</span>
<span class="special">};</span>
</pre>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
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>
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<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>
</div>
</body>
</html>

View File

@@ -0,0 +1,106 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>boost/python/pointee.hpp</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="Boost.Python Reference Manual">
<link rel="up" href="../utility_and_infrastructure.html" title="Chapter&#160;7.&#160;Utility and Infrastructure">
<link rel="prev" href="boost_python_instance_holder_hpp.html" title="boost/python/instance_holder.hpp">
<link rel="next" href="boost_python_handle_hpp.html" title="boost/python/handle.hpp">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../../images/boost.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_python_instance_holder_hpp.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_handle_hpp.html"><img src="../../images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="utility_and_infrastructure.boost_python_pointee_hpp"></a><a class="link" href="boost_python_pointee_hpp.html" title="boost/python/pointee.hpp">boost/python/pointee.hpp</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="boost_python_pointee_hpp.html#utility_and_infrastructure.boost_python_pointee_hpp.introduction">Introduction</a></span></dt>
<dt><span class="section"><a href="boost_python_pointee_hpp.html#utility_and_infrastructure.boost_python_pointee_hpp.class_template_pointee">Class
template <code class="computeroutput"><span class="identifier">pointee</span></code></a></span></dt>
<dt><span class="section"><a href="boost_python_pointee_hpp.html#utility_and_infrastructure.boost_python_pointee_hpp.examples">Examples</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_pointee_hpp.introduction"></a><a class="link" href="boost_python_pointee_hpp.html#utility_and_infrastructure.boost_python_pointee_hpp.introduction" title="Introduction">Introduction</a>
</h3></div></div></div>
<p>
&lt;boost/python/pointee.hpp&gt; introduces a traits metafunction <code class="computeroutput"><span class="keyword">template</span> <span class="identifier">pointee</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> that can be used to extract the "pointed-to"
type from the type of a pointer or smart pointer.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_pointee_hpp.class_template_pointee"></a><a class="link" href="boost_python_pointee_hpp.html#utility_and_infrastructure.boost_python_pointee_hpp.class_template_pointee" title="Class template pointee">Class
template <code class="computeroutput"><span class="identifier">pointee</span></code></a>
</h3></div></div></div>
<p>
<code class="computeroutput"><span class="identifier">pointee</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
is used by the <a class="link" href="../high_level_components.html#high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel" title="Class template class_&lt;T, Bases, HeldType, NonCopyable&gt;"><code class="computeroutput"><span class="identifier">class_</span><span class="special">&lt;...&gt;</span></code></a>
template to deduce the type being held when a pointer or smart pointer
type is used as its HeldType argument.
</p>
<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>
<span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">pointee</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">element_type</span> <span class="identifier">type</span><span class="special">;</span>
<span class="special">};</span>
<span class="comment">// specialization for pointers</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">pointee</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">type</span><span class="special">;</span>
<span class="special">};</span>
<span class="special">}</span>
</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_pointee_hpp.examples"></a><a class="link" href="boost_python_pointee_hpp.html#utility_and_infrastructure.boost_python_pointee_hpp.examples" title="Examples">Examples</a>
</h3></div></div></div>
<p>
Given a 3rd-party smart pointer type <code class="computeroutput"><span class="identifier">smart_pointer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>, one might partially specialize <code class="computeroutput"><span class="identifier">pointee</span><span class="special">&lt;</span><span class="identifier">smart_pointer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span></code> so that it can be used as the HeldType
for a class wrapper:
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">python</span><span class="special">/</span><span class="identifier">pointee</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">python</span><span class="special">/</span><span class="keyword">class</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">third_party_lib</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">python</span>
<span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">pointee</span><span class="special">&lt;</span><span class="identifier">smart_pointer</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">type</span><span class="special">;</span>
<span class="special">};</span>
<span class="special">}}</span>
<span class="identifier">BOOST_PYTHON_MODULE</span><span class="special">(</span><span class="identifier">pointee_demo</span><span class="special">)</span>
<span class="special">{</span>
<span class="identifier">class_</span><span class="special">&lt;</span><span class="identifier">third_party_class</span><span class="special">,</span> <span class="identifier">smart_pointer</span><span class="special">&lt;</span><span class="identifier">third_party_class</span><span class="special">&gt;</span> <span class="special">&gt;(</span><span class="string">"third_party_class"</span><span class="special">)</span>
<span class="special">.</span><span class="identifier">def</span><span class="special">(...)</span>
<span class="special">...</span>
<span class="special">;</span>
<span class="special">}</span>
</pre>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
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>
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_python_instance_holder_hpp.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_handle_hpp.html"><img src="../../images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,90 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>boost/python/ssize_t.hpp</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="Boost.Python Reference Manual">
<link rel="up" href="../utility_and_infrastructure.html" title="Chapter&#160;7.&#160;Utility and Infrastructure">
<link rel="prev" href="boost_python_type_id_hpp.html" title="boost/python/type_id.hpp">
<link rel="next" href="../topics.html" title="Chapter&#160;8.&#160;Topics">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../../images/boost.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_python_type_id_hpp.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="../topics.html"><img src="../../images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="utility_and_infrastructure.boost_python_ssize_t_hpp"></a><a class="link" href="boost_python_ssize_t_hpp.html" title="boost/python/ssize_t.hpp">boost/python/ssize_t.hpp</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="boost_python_ssize_t_hpp.html#utility_and_infrastructure.boost_python_ssize_t_hpp.introduction">Introduction</a></span></dt>
<dt><span class="section"><a href="boost_python_ssize_t_hpp.html#utility_and_infrastructure.boost_python_ssize_t_hpp.typedefs">Typedefs</a></span></dt>
<dt><span class="section"><a href="boost_python_ssize_t_hpp.html#utility_and_infrastructure.boost_python_ssize_t_hpp.constants">Constants</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_ssize_t_hpp.introduction"></a><a class="link" href="boost_python_ssize_t_hpp.html#utility_and_infrastructure.boost_python_ssize_t_hpp.introduction" title="Introduction">Introduction</a>
</h3></div></div></div>
<p>
Python 2.5 introduces a new <code class="computeroutput"><span class="identifier">Py_ssize_t</span></code>
typedef and two related macros (<a href="http://www.python.org/dev/peps/pep-0353/" target="_top">PEP
353</a>). The &lt;boost/python/ssize_t.hpp&gt; header imports these
definitions into the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span></code>
namespace as <code class="computeroutput"><span class="identifier">ssize_t</span></code>,
<code class="computeroutput"><span class="identifier">ssize_t_max</span></code>, and <code class="computeroutput"><span class="identifier">ssize_t_min</span></code>. Appropriate definitions
are provided for backward compatibility with previous Python versions.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_ssize_t_hpp.typedefs"></a><a class="link" href="boost_python_ssize_t_hpp.html#utility_and_infrastructure.boost_python_ssize_t_hpp.typedefs" title="Typedefs">Typedefs</a>
</h3></div></div></div>
<p>
Imports <code class="computeroutput"><span class="identifier">Py_ssize_t</span></code> into
the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span></code> namespace if available, or provides
an appropriate typedef for backward compatibility:
</p>
<pre class="programlisting"><span class="preprocessor">#if</span> <span class="identifier">PY_VERSION_HEX</span> <span class="special">&gt;=</span> <span class="number">0x02050000</span>
<span class="keyword">typedef</span> <span class="identifier">Py_ssize_t</span> <span class="identifier">ssize_t</span><span class="special">;</span>
<span class="preprocessor">#else</span>
<span class="keyword">typedef</span> <span class="keyword">int</span> <span class="identifier">ssize_t</span><span class="special">;</span>
<span class="preprocessor">#endif</span>
</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_ssize_t_hpp.constants"></a><a class="link" href="boost_python_ssize_t_hpp.html#utility_and_infrastructure.boost_python_ssize_t_hpp.constants" title="Constants">Constants</a>
</h3></div></div></div>
<p>
Imports <code class="computeroutput"><span class="identifier">PY_SSIZE_T_MAX</span></code>
and <code class="computeroutput"><span class="identifier">PY_SSIZE_T_MIN</span></code> as constants
into the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span></code> namespace if available, or provides
appropriate constants for backward compatibility:
</p>
<pre class="programlisting"><span class="preprocessor">#if</span> <span class="identifier">PY_VERSION_HEX</span> <span class="special">&gt;=</span> <span class="number">0x02050000</span>
<span class="identifier">ssize_t</span> <span class="keyword">const</span> <span class="identifier">ssize_t_max</span> <span class="special">=</span> <span class="identifier">PY_SSIZE_T_MAX</span><span class="special">;</span>
<span class="identifier">ssize_t</span> <span class="keyword">const</span> <span class="identifier">ssize_t_min</span> <span class="special">=</span> <span class="identifier">PY_SSIZE_T_MIN</span><span class="special">;</span>
<span class="preprocessor">#else</span>
<span class="identifier">ssize_t</span> <span class="keyword">const</span> <span class="identifier">ssize_t_max</span> <span class="special">=</span> <span class="identifier">INT_MAX</span><span class="special">;</span>
<span class="identifier">ssize_t</span> <span class="keyword">const</span> <span class="identifier">ssize_t_min</span> <span class="special">=</span> <span class="identifier">INT_MIN</span><span class="special">;</span>
<span class="preprocessor">#endif</span>
</pre>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
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>
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_python_type_id_hpp.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="../topics.html"><img src="../../images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,234 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>boost/python/type_id.hpp</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="Boost.Python Reference Manual">
<link rel="up" href="../utility_and_infrastructure.html" title="Chapter&#160;7.&#160;Utility and Infrastructure">
<link rel="prev" href="boost_python_handle_hpp.html" title="boost/python/handle.hpp">
<link rel="next" href="boost_python_ssize_t_hpp.html" title="boost/python/ssize_t.hpp">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../../images/boost.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_python_handle_hpp.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_ssize_t_hpp.html"><img src="../../images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="utility_and_infrastructure.boost_python_type_id_hpp"></a><a class="link" href="boost_python_type_id_hpp.html" title="boost/python/type_id.hpp">boost/python/type_id.hpp</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.introduction">Introduction</a></span></dt>
<dt><span class="section"><a href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info">Class
template <code class="computeroutput"><span class="identifier">type_info</span></code></a></span></dt>
<dt><span class="section"><a href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.functions">Functions</a></span></dt>
<dt><span class="section"><a href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.example">Example</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_type_id_hpp.introduction"></a><a class="link" href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.introduction" title="Introduction">Introduction</a>
</h3></div></div></div>
<p>
&lt;boost/python/type_id.hpp&gt; provides types and functions for runtime
type identification like those of of <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">typeinfo</span><span class="special">&gt;</span></code>.
It exists mostly to work around certain compiler bugs and platform-dependent
interactions with shared libraries.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info"></a><a class="link" href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info" title="Class template type_info">Class
template <code class="computeroutput"><span class="identifier">type_info</span></code></a>
</h3></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info.class_template_type_info_constru">Class
template <code class="computeroutput"><span class="identifier">type_info</span></code> constructor</a></span></dt>
<dt><span class="section"><a href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info.class_template_type_info_compari">Class
template <code class="computeroutput"><span class="identifier">type_info</span></code> comparison</a></span></dt>
<dt><span class="section"><a href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info.class_template_type_info_observe">Class
template <code class="computeroutput"><span class="identifier">type_info</span></code> observers</a></span></dt>
</dl></div>
<p>
<code class="computeroutput"><span class="identifier">type_info</span></code> instances identify
a type. As <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">type_info</span></code> is specified to (but unlike
its implementation in some compilers), <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">type_info</span></code>
never represents top-level references or cv-qualification (see section
5.2.8 in the C++ standard). Unlike <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">type_info</span></code>,
<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">type_info</span></code> instances are copyable, and
comparisons always work reliably across shared library boundaries.
</p>
<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>
<span class="special">{</span>
<span class="keyword">class</span> <span class="identifier">type_info</span> <span class="special">:</span> <span class="identifier">totally_ordered</span><span class="special">&lt;</span><span class="identifier">type_info</span><span class="special">&gt;</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="comment">// constructor</span>
<span class="identifier">type_info</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">type_info</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">=</span> <span class="keyword">typeid</span><span class="special">(</span><span class="keyword">void</span><span class="special">));</span>
<span class="comment">// comparisons</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span><span class="identifier">type_info</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">type_info</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
<span class="comment">// observers</span>
<span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="special">};</span>
<span class="special">}}</span>
</pre>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info.class_template_type_info_constru"></a><a class="link" href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info.class_template_type_info_constru" title="Class template type_info constructor">Class
template <code class="computeroutput"><span class="identifier">type_info</span></code> constructor</a>
</h4></div></div></div>
<pre class="programlisting"><span class="identifier">type_info</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">type_info</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">=</span> <span class="keyword">typeid</span><span class="special">(</span><span class="keyword">void</span><span class="special">));</span></pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
constructs a <code class="computeroutput"><span class="identifier">type_info</span></code>
object which identifies the same type as its argument.
</p></dd>
<dt><span class="term">Rationale</span></dt>
<dd><p>
Since it is occasionally necessary to make an array of <code class="computeroutput"><span class="identifier">type_info</span></code> objects a benign default
argument is supplied. Note: this constructor does not correct for
non-conformance of compiler <code class="computeroutput"><span class="keyword">typeid</span><span class="special">()</span></code> implementations. See <code class="computeroutput"><span class="identifier">type_id</span></code>, below.
</p></dd>
</dl>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info.class_template_type_info_compari"></a><a class="link" href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info.class_template_type_info_compari" title="Class template type_info comparison">Class
template <code class="computeroutput"><span class="identifier">type_info</span></code> comparison</a>
</h4></div></div></div>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span><span class="identifier">type_info</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
yields a total order over <code class="computeroutput"><span class="identifier">type_info</span></code>
objects.
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">type_info</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Returns</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> iff the two values
describe the same type.
</p></dd>
<dt><span class="term">Note</span></dt>
<dd><p>
The use of <code class="computeroutput"><span class="identifier">totally_ordered</span><span class="special">&lt;</span><span class="identifier">type_info</span><span class="special">&gt;</span></code> as a private base class supplies
operators <code class="computeroutput"><span class="special">&lt;=</span></code>,
<code class="computeroutput"><span class="special">&gt;=</span></code>, <code class="computeroutput"><span class="special">&gt;</span></code>, and <code class="computeroutput"><span class="special">!=</span></code>
</p></dd>
</dl>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info.class_template_type_info_observe"></a><a class="link" href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.class_template_type_info.class_template_type_info_observe" title="Class template type_info observers">Class
template <code class="computeroutput"><span class="identifier">type_info</span></code> observers</a>
</h4></div></div></div>
<pre class="programlisting"><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">name</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Returns</span></dt>
<dd><p>
The result of calling <code class="computeroutput"><span class="identifier">name</span><span class="special">()</span></code> on the argument used to construct
the object.
</p></dd>
</dl>
</div>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_type_id_hpp.functions"></a><a class="link" href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.functions" title="Functions">Functions</a>
</h3></div></div></div>
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&amp;</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">type_info</span> <span class="keyword">const</span><span class="special">&amp;</span><span class="identifier">x</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Effects</span></dt>
<dd><p>
Writes a description of the type described by to <code class="computeroutput"><span class="identifier">x</span></code>
into s.
</p></dd>
<dt><span class="term">Rationale</span></dt>
<dd><p>
Not every C++ implementation provides a truly human-readable <code class="computeroutput"><span class="identifier">type_info</span><span class="special">::</span><span class="identifier">name</span><span class="special">()</span></code>
string, but for some we may be able to decode the string and produce
a reasonable representation.
</p></dd>
<dt><span class="term">Note</span></dt>
<dd><p>
On some non-conforming C++ implementations, the code is not actually
as simple as described above; the semantics are adjusted to work
as-if the C++ implementation were conforming.
</p></dd>
</dl>
</div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">type_info</span> <span class="identifier">type_id</span><span class="special">()</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl class="variablelist">
<dt><span class="term">Returns</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">type_info</span><span class="special">(</span><span class="keyword">typeid</span><span class="special">(</span><span class="identifier">T</span><span class="special">))</span></code>
</p></dd>
<dt><span class="term">Note</span></dt>
<dd><p>
On some non-conforming C++ implementations, the code is not actually
as simple as described above; the semantics are adjusted to work
as-if the C++ implementation were conforming.
</p></dd>
</dl>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="utility_and_infrastructure.boost_python_type_id_hpp.example"></a><a class="link" href="boost_python_type_id_hpp.html#utility_and_infrastructure.boost_python_type_id_hpp.example" title="Example">Example</a>
</h3></div></div></div>
<p>
The following example, though silly, illustrates how the type_id facility
might be used
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">python</span><span class="special">/</span><span class="identifier">type_id</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="comment">// Returns true iff the user passes an int argument</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">bool</span> <span class="identifier">is_int</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">x</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">type_id</span><span class="special">;</span>
<span class="keyword">return</span> <span class="identifier">type_id</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;()</span> <span class="special">==</span> <span class="identifier">type_id</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;();</span>
<span class="special">}</span>
</pre>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
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>
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_python_handle_hpp.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_ssize_t_hpp.html"><img src="../../images/next.png" alt="Next"></a>
</div>
</body>
</html>