summaryrefslogtreecommitdiff
path: root/libs/python/doc/v2/iterator.html
diff options
context:
space:
mode:
Diffstat (limited to 'libs/python/doc/v2/iterator.html')
-rw-r--r--libs/python/doc/v2/iterator.html398
1 files changed, 398 insertions, 0 deletions
diff --git a/libs/python/doc/v2/iterator.html b/libs/python/doc/v2/iterator.html
new file mode 100644
index 000000000..3557ffb9a
--- /dev/null
+++ b/libs/python/doc/v2/iterator.html
@@ -0,0 +1,398 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<!-- Copyright David Abrahams 2006. Distributed under the Boost -->
+<!-- Software License, Version 1.0. (See accompanying -->
+<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
+<html>
+ <head>
+ <meta name="generator" content=
+ "HTML Tidy for Windows (vers 1st August 2002), see www.w3.org">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <link rel="stylesheet" type="text/css" href="../boost.css">
+
+ <title>Boost.Python - &lt;boost/python/iterator.hpp&gt;</title>
+ </head>
+
+ <body>
+ <table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
+ "header">
+ <tr>
+ <td valign="top" width="300">
+ <h3><a href="../../../../index.htm"><img height="86" width="277"
+ alt="C++ Boost" src="../../../../boost.png" border="0"></a></h3>
+ </td>
+
+ <td valign="top">
+ <h1 align="center"><a href="../index.html">Boost.Python</a></h1>
+
+ <h2 align="center">Header &lt;boost/python/iterator.hpp&gt;</h2>
+ </td>
+ </tr>
+ </table>
+ <hr>
+
+ <h2>Contents</h2>
+
+ <dl class="page-index">
+ <dt><a href="#introduction">Introduction</a></dt>
+
+ <dt><a href="#classes">Classes</a></dt>
+
+ <dd>
+ <dl class="page-index">
+ <dt><a href="#iterator-spec">Class template
+ <code>iterator</code></a></dt>
+
+ <dd>
+ <dl class="page-index">
+ <dt><a href="#iterator-spec-synopsis">Class
+ <code>iterator</code> synopsis</a></dt>
+
+ <dt><a href="#iterator-spec-constructors">Class template
+ <code>iterator</code> constructor</a></dt>
+ </dl>
+ </dd>
+ </dl>
+
+ <dl class="page-index">
+ <dt><a href="#iterators-spec">Class template
+ <code>iterators</code></a></dt>
+
+ <dd>
+ <dl class="page-index">
+ <dt><a href="#iterators-spec-synopsis">Class
+ <code>iterators</code> synopsis</a></dt>
+
+ <dt><a href="#iterators-spec-types">Class template
+ <code>iterators</code> nested types</a></dt>
+
+ <dt><a href="#iterators-spec-statics">Class template
+ <code>iterators</code> static functions</a></dt>
+ </dl>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt><a href="#functions">Functions</a></dt>
+
+ <dd>
+ <dl class="page-index">
+ <dt><a href="#range-spec">range</a></dt>
+ </dl>
+ </dd>
+
+ <dt><a href="#examples">Examples</a></dt>
+ </dl>
+ <hr>
+
+ <h2><a name="introduction"></a>Introduction</h2>
+
+ <p><code>&lt;boost/python/iterator.hpp&gt;</code> provides types and
+ functions for creating <a href=
+ "http://www.python.org/doc/current/lib/typeiter.html">Python
+ iterators</a> from <a href=
+ "http://www.sgi.com/tech/stl/Container.html">C++ Containers</a> and <a
+ href="http://www.sgi.com/tech/stl/Iterators.html">Iterators</a>. Note
+ that if your <code>class_</code> supports random-access iterators,
+ implementing <code><a href=
+ "http://www.python.org/doc/current/ref/sequence-types.html#l2h-128">__getitem__</a></code>
+ (also known as the Sequence Protocol) may serve you better than using
+ this facility: Python will automatically create an iterator type for you
+ (see <a href=
+ "http://www.python.org/doc/current/lib/built-in-funcs.html#l2h-35">iter()</a>),
+ and each access can be range-checked, leaving no possiblity of accessing
+ through an invalidated C++ iterator.</p>
+
+ <h2><a name="classes"></a>Classes</h2>
+
+ <h3><a name="iterator-spec"></a>Class Template <code>iterator</code></h3>
+
+ <p>Instances of <code>iterator&lt;C,P&gt;</code> hold a reference to a
+ callable Python object which, when invoked from Python, expects a single
+ argument <code>c</code> convertible to <code>C</code> and creates a
+ Python iterator that traverses [<code>c.begin()</code>,
+ <code>c.end()</code>). The optional <a href=
+ "CallPolicies.html">CallPolicies</a> <code>P</code> can be used to
+ control how elements are returned during iteration.</p>
+
+ <p>In the table below, <code><b>c</b></code> is an instance of
+ <code>Container</code>.</p>
+
+ <table border="1" summary="iterator template parameters">
+ <tr>
+ <th>Template Parameter</th>
+
+ <th>Requirements</th>
+
+ <th>Semantics</th>
+
+ <th>Default</th>
+ </tr>
+
+ <tr>
+ <td><code>Container</code></td>
+
+ <td>[c.begin(),c.end()) is a valid <a href=
+ "http://www.sgi.com/tech/stl/Iterators.html">Iterator range</a>.</td>
+
+ <td>The result will convert its argument to <code>c</code> and call
+ <code>c.begin()</code> and <code>c.end()</code> to acquire iterators.
+ To invoke <code>Container</code>'s <code>const</code>
+ <code>begin()</code> and <code>end()</code> functions, make it
+ <code>const</code>.</td>
+ </tr>
+
+ <tr>
+ <td><code>NextPolicies</code></td>
+
+ <td>A default-constructible model of <a href=
+ "CallPolicies.html#CallPolicies-concept">CallPolicies</a>.</td>
+
+ <td>Applied to the resulting iterators' <code>next()</code>
+ method.</td>
+
+ <td>An unspecified model of <a href=
+ "CallPolicies.html#CallPolicies-concept">CallPolicies</a> which
+ always makes a copy of the result of deferencing the underlying C++
+ iterator</td>
+ </tr>
+ </table>
+
+ <h4><a name="iterator-spec-synopsis"></a>Class Template iterator
+ synopsis</h4>
+<pre>
+namespace boost { namespace python
+{
+ template &lt;class Container
+ , class NextPolicies = <i>unspecified</i>&gt;
+ struct iterator : <a href="object.html#object-spec">object</a>
+ {
+ iterator();
+ };
+}}
+</pre>
+
+ <h4><a name="iterator-spec-constructors"></a>Class Template iterator
+ constructor</h4>
+<pre>
+iterator()
+</pre>
+
+ <dl class="function-semantics">
+ <dt><b>Effects:</b></dt>
+
+ <dd>
+ Initializes its base class with the result of:
+<pre>
+range&lt;NextPolicies&gt;(&amp;iterators&lt;Container&gt;::begin, &amp;iterators&lt;Container&gt;::end)
+</pre>
+ </dd>
+
+ <dt><b>Postconditions:</b> <code>this-&gt;get()</code> points to a
+ Python callable object which creates a Python iterator as described
+ above.</dt>
+
+ <dt><b>Rationale:</b> Provides an easy way to create iterators for the
+ common case where a C++ class being wrapped provides
+ <code>begin()</code> and <code>end()</code>.</dt>
+ </dl>
+ <!-- -->
+
+ <h3><a name="iterators-spec"></a>Class Template
+ <code>iterators</code></h3>
+
+ <p>A utility class template which provides a way to reliably call its
+ argument's <code>begin()</code> and <code>end()</code> member functions.
+ Note that there is no portable way to take the address of a member
+ function of a C++ standard library container, so
+ <code>iterators&lt;&gt;</code> can be particularly helpful when wrapping
+ them.</p>
+
+ <p>In the table below, <code><b>x</b></code> is an instance of
+ <code>C</code>.</p>
+
+ <table border="1" summary="iterator template parameters">
+ <tr>
+ <th>Required Valid Expression</th>
+
+ <th>Type</th>
+ </tr>
+
+ <tr>
+ <td><code>x.begin()</code></td>
+
+ <td>Convertible to <code>C::const_iterator</code> if <code>C</code>
+ is a <code>const</code> type; convertible to <code>C::iterator</code>
+ otherwise.</td>
+ </tr>
+
+ <tr>
+ <td><code>x.end()</code></td>
+
+ <td>Convertible to <code>C::const_iterator</code> if <code>C</code>
+ is a <code>const</code> type; convertible to <code>C::iterator</code>
+ otherwise.</td>
+ </tr>
+ </table>
+
+ <h4><a name="iterators-spec-synopsis"></a>Class Template iterators
+ synopsis</h4>
+<pre>
+namespace boost { namespace python
+{
+ template &lt;class C&gt;
+ struct iterators
+ {
+ typedef typename C::[const_]iterator iterator;
+ static iterator begin(C&amp; x);
+ static iterator end(C&amp; x);
+ };
+}}
+
+</pre>
+
+ <h4><a name="iterators-spec-types"></a>Class Template iterators nested
+ types</h4>
+ If C is a <code>const</code> type,
+<pre>
+typedef typename C::const_iterator iterator;
+</pre>
+ Otherwise:
+<pre>
+typedef typename C::iterator iterator;
+</pre>
+
+ <h4><a name="iterators-spec-statics"></a>Class Template iterators static
+ functions</h4>
+<pre>
+static iterator begin(C&amp;);
+</pre>
+
+ <dl class="function-semantics">
+ <dt><b>Returns:</b> <code>x.begin()</code></dt>
+ </dl>
+<pre>
+static iterator end(C&amp;);
+</pre>
+
+ <dl class="function-semantics">
+ <dt><b>Returns:</b> <code>x.end()</code></dt>
+ </dl>
+ <!-- -->
+
+ <h2><a name="functions"></a>Functions</h2>
+<pre>
+<a name=
+"range-spec">template</a> &lt;class NextPolicies, class Target, class Accessor1, class Accessor2&gt;
+<a href=
+"object.html#object-spec">object</a> range(Accessor1 start, Accessor2 finish);
+
+template &lt;class NextPolicies, class Accessor1, class Accessor2&gt;
+<a href=
+"object.html#object-spec">object</a> range(Accessor1 start, Accessor2 finish);
+
+template &lt;class Accessor1, class Accessor2&gt;
+<a href=
+"object.html#object-spec">object</a> range(Accessor1 start, Accessor2 finish);
+</pre>
+
+ <dl class="range-semantics">
+ <dt><b>Requires:</b> <code>NextPolicies</code> is a
+ default-constructible model of <a href=
+ "CallPolicies.html#CallPolicies-concept">CallPolicies</a>.</dt>
+
+ <dt><b>Effects:</b></dt>
+
+ <dd>
+ <dl>
+ <dt>The first form creates a Python callable object which, when
+ invoked, converts its argument to a <code>Target</code> object
+ <code>x</code>, and creates a Python iterator which traverses
+ [<code><a href=
+ "../../../bind/bind.html">bind</a>(start,_1)(x)</code>,&nbsp;<code><a
+ href="../../../bind/bind.html">bind</a>(finish,_1)(x)</code>),
+ applying <code>NextPolicies</code> to the iterator's
+ <code>next()</code> function.</dt>
+
+ <dt>The second form is identical to the first, except that
+ <code>Target</code> is deduced from <code>Accessor1</code> as
+ follows:</dt>
+
+ <dd>
+ <ol>
+ <li>If <code>Accessor1</code> is a function type,
+ <code>Target</code> is the type of its first argument.</li>
+
+ <li>If <code>Accessor1</code> is a data member pointer of the
+ form <code>R&nbsp;(T::*)</code>, <code>Target</code> is
+ identical to <code>T</code>.</li>
+
+ <li>If <code>Accessor1</code> is a member function pointer of
+ the form
+ <code>R&nbsp;(T::*)(</code><i>arguments...</i><code>)</code>&nbsp;
+ <i>cv-opt</i>, where <i>cv-opt</i> is an optional
+ <code>cv-qualifier</code>, <code>Target</code> is identical to
+ <code>T</code>.</li>
+ </ol>
+ </dd>
+
+ <dt>The third form is identical to the second, except that
+ <code>NextPolicies</code> is an unspecified model of <a href=
+ "CallPolicies.html#CallPolicies-concept">CallPolicies</a> which
+ always makes a copy of the result of deferencing the underlying C++
+ iterator</dt>
+ </dl>
+ </dd>
+
+ <dt><b>Rationale:</b> The use of <code><a href=
+ "../../../bind/bind.html">boost::bind</a>()</code> allows C++ iterators
+ to be accessed through functions, member functions or data member
+ pointers. Customization of <code>NextPolicies</code> (e.g. using
+ <code><a href=
+ "return_internal_reference.html#return_internal_reference-spec">return_internal_reference</a></code>)
+ is useful when it is expensive to copy sequence elements of a wrapped
+ class type. Customization of <code>Target</code> is useful when
+ <code>Accessor1</code> is a function object, or when a base class of
+ the intended target type would otherwise be deduced.</dt>
+ </dl>
+
+ <h2><a name="examples"></a>Examples</h2>
+<pre>
+#include &lt;boost/python/module.hpp&gt;
+#include &lt;boost/python/class.hpp&gt;
+
+#include &lt;vector&gt;
+
+using namespace boost::python;
+BOOST_PYTHON_MODULE(demo)
+{
+ class_&lt;std::vector&lt;double&gt; &gt;("dvec")
+ .def("__iter__", iterator&lt;std::vector&lt;double&gt; &gt;())
+ ;
+}
+</pre>
+ A more comprehensive example can be found in:
+
+ <dl>
+ <dt><code><a href=
+ "../../test/iterator.cpp">libs/python/test/iterator.cpp</a></code></dt>
+
+ <dt><code><a href=
+ "../../test/input_iterator.cpp">libs/python/test/input_iterator.cpp</a></code></dt>
+
+ <dt><code><a href=
+ "../../test/iterator.py">libs/python/test/input_iterator.py</a></code></dt>
+
+ </dl>
+<hr>
+ <p>Revised
+ <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
+ 13 November, 2002
+ <!--webbot bot="Timestamp" endspan i-checksum="39359" -->
+ </p>
+
+ <p><i>&copy; Copyright <a href=
+ "http://www.boost.org/people/dave_abrahams.htm">Dave Abrahams</a> 2002.</i></p>
+ </body>
+</html>
+