Sophie

Sophie

distrib > Fedora > 14 > i386 > by-pkgid > 623999701586b0ea103ff2ccad7954a6 > files > 9518

boost-doc-1.44.0-1.fc14.noarch.rpm

<!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>