Sophie

Sophie

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

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 Cygwin (vers 1st February 2003), see www.w3.org">
    <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
    <link rel="stylesheet" type="text/css" href="../boost.css">
    <title>
      Boost.Python - &lt;boost/python/with_custodian_and_ward.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/with_custodian_and_ward.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="#with_custodian_and_ward-spec">Class Template
            <code>with_custodian_and_ward</code></a>
          </dt>
          <dd>
            <dl class="page-index">
              <dt>
                <a href="#with_custodian_and_ward-spec-synopsis">Class
                Template <code>with_custodian_and_ward</code> synopsis</a>
              </dt>
              <dt>
                <a href="#with_custodian_and_ward-spec-statics">Class
                <code>with_custodian_and_ward</code> static functions</a>
              </dt>
            </dl>
          </dd>
          <dt>
            <a href="#with_custodian_and_ward_postcall-spec">Class Template
            <code>with_custodian_and_ward_postcall</code></a>
          </dt>
          <dd>
            <dl class="page-index">
              <dt>
                <a href=
                "#with_custodian_and_ward_postcall-spec-synopsis">Class
                Template <code>with_custodian_and_ward_postcall</code>
                synopsis</a>
              </dt>
              <dt>
                <a href=
                "#with_custodian_and_ward_postcall-spec-statics">Class
                <code>with_custodian_and_ward_postcall</code> static
                functions</a>
              </dt>
            </dl>
          </dd>
        </dl>
      </dd>
      <dt>
        <a href="#examples">Example</a>
      </dt>
    </dl>
    <hr>
    <h2>
      <a name="introduction">Introduction</a>
    </h2>This header provides faciliites for establishing a lifetime
    dependency between two of a function's Python argument or result objects.
    The <i>ward</i> object will not be destroyed until after the custodian as
    long as the <i>custodian</i> object supports <a href=
    "http://www.python.org/doc/current/lib/module-weakref.html">weak
    references</a> (Boost.Python extension classes all support weak
    references). If the <i>custodian</i> object does not support weak
    references and is not <code>None</code>, an appropriate exception will be
    thrown. The two class templates <code>with_custodian_and_ward</code> and
    <code>with_custodian_and_ward_postcall</code> differ in the point at
    which they take effect. 
    <p>
      In order to reduce the chance of inadvertently creating dangling
      pointers, the default is to do lifetime binding <i>before</i> the
      underlying C++ object is invoked. However, before invocation the result
      object is not available, so
      <code>with_custodian_and_ward_postcall</code> is provided to bind
      lifetimes after invocation. Also, if a C++ exception is thrown after
      <code>with_custodian_and_ward&lt;&gt;::precall</code> but before the
      underlying C++ object actually stores a pointer, the lifetime of the
      custodian and ward objects will be artificially bound together, so one
      might choose <code>with_custodian_and_ward_postcall</code> instead,
      depending on the semantics of the function being wrapped.
    </p>
    <p>
      Please note that this is <i>not</i> the appropriate tool to use when
      wrapping functions which <b>transfer ownership</b> of a raw pointer
      across the function-call boundary. Please see the <a href=
      "faq.html#ownership">FAQ</a> if you want to do that.
    </p>
    <h2>
      <a name="classes"></a>Classes
    </h2>
    <h3>
      <a name="with_custodian_and_ward-spec"></a>Class template
      <code>with_custodian_and_ward</code>
    </h3>
    <table border="1" summary="with_custodian_and_ward template parameters">
      <caption>
        <b><code>with_custodian_and_ward</code> template parameters</b>
      </caption>
      <tr>
        <th>
          Parameter
        </th>
        <th>
          Requirements
        </th>
        <th>
          Description
        </th>
        <th>
          Default
        </th>
      </tr>
      <tr>
        <td>
          <code>custodian</code>
        </td>
        <td>
          A positive compile-time constant of type <code>std::size_t</code>.
        </td>
        <td>
          The 1-based index of the parameter which is the dependency in the
          lifetime relationship to be established. If used to wrap a member
          function, parameter 1 is the target object (<code>*this</code>).
          Note that if the target Python object type doesn't support weak
          references, a Python <code>TypeError</code> exception will be
          raised when the C++ object being wrapped is called.
        </td>
      </tr>
      <tr>
        <td>
          <code>ward</code>
        </td>
        <td>
          A positive compile-time constant of type <code>std::size_t</code>.
        </td>
        <td>
          The 1-based index of the parameter which is the dependent in the
          lifetime relationship to be established. If used to wrap a member
          function, parameter 1 is the target object (<code>*this</code>).
        </td>
      </tr>
      <tr>
        <td>
          <code>Base</code>
        </td>
        <td>
          A model of <a href="CallPolicies.html">CallPolicies</a>
        </td>
        <td>
          Used for <a href="CallPolicies.html#composition">policy
          composition</a>.
        </td>
        <td>
          <code><a href=
          "default_call_policies.html#default_call_policies-spec">default_call_policies</a></code>
        </td>
      </tr>
    </table>
    <h4>
      <a name="with_custodian_and_ward-spec-synopsis"></a>Class template
      <code>with_custodian_and_ward</code> synopsis
    </h4>
    <pre>
namespace boost { namespace python
{
   template &lt;std::size_t custodian, std::size_t ward, class Base = default_call_policies&gt;
   struct with_custodian_and_ward : Base
   {
      static bool precall(PyObject* args);
   };
}}
</pre>
    <h4>
      <a name="with_custodian_and_ward-spec-statics"></a>Class
      <code>with_custodian_and_ward</code> static functions
    </h4>
    <pre>
bool precall(PyObject* args);
</pre>
    <dl class="function-semantics">
      <dt>
        <b>Requires:</b> <code><a href=
        "http://www.python.org/doc/2.2/api/tupleObjects.html#l2h-476">PyTuple_Check</a>(args)
        != 0</code>
      </dt>
      <dt>
        <b>Effects:</b> Makes the lifetime of the argument indicated by
        <code>ward</code> dependent on the lifetime of the argument indicated
        by <code>custodian</code>.
      </dt>
      <dt>
        <b>Returns:</b> <code>false</code> and <code><a href=
        "http://www.python.org/doc/2.2/api/exceptionHandling.html#l2h-71">PyErr_Occurred</a>()&nbsp;!=&nbsp;0</code>
        upon failure, <code>true</code> otherwise.
      </dt>
    </dl><!-- xxxxxx -->
    <h3>
      <a name="with_custodian_and_ward_postcall-spec"></a>Class template
      <code>with_custodian_and_ward_postcall</code>
    </h3>
    <table border="1" summary=
    "with_custodian_and_ward_postcall template parameters">
      <caption>
        <b><code>with_custodian_and_ward_postcall</code> template
        parameters</b>
      </caption>
      <tr>
        <th>
          Parameter
        </th>
        <th>
          Requirements
        </th>
        <th>
          Description
        </th>
        <th>
          Default
        </th>
      </tr>
      <tr>
        <td>
          <code>custodian</code>
        </td>
        <td>
          A compile-time constant of type <code>std::size_t</code>.
        </td>
        <td>
          The index of the parameter which is the dependency in the lifetime
          relationship to be established. Zero indicates the result object; 1
          indicates the first argument. If used to wrap a member function,
          parameter 1 is the target object (<code>*this</code>). Note that if
          the target Python object type doesn't support weak references, a
          Python <code>TypeError</code> exception will be raised when the C++
          object being wrapped is called.
        </td>
      </tr>
      <tr>
        <td>
          <code>ward</code>
        </td>
        <td>
          A compile-time constant of type <code>std::size_t</code>.
        </td>
        <td>
          The index of the parameter which is the dependent in the lifetime
          relationship to be established. Zero indicates the result object; 1
          indicates the first argument. If used to wrap a member function,
          parameter 1 is the target object (<code>*this</code>).
        </td>
      </tr>
      <tr>
        <td>
          <code>Base</code>
        </td>
        <td>
          A model of <a href="CallPolicies.html">CallPolicies</a>
        </td>
        <td>
          Used for <a href="CallPolicies.html#composition">policy
          composition</a>.
        </td>
        <td>
          <code><a href=
          "default_call_policies.html#default_call_policies-spec">default_call_policies</a></code>
        </td>
      </tr>
    </table>
    <h4>
      <a name="with_custodian_and_ward_postcall-spec-synopsis"></a>Class
      template <code>with_custodian_and_ward_postcall</code> synopsis
    </h4>
    <pre>
namespace boost { namespace python
{
   template &lt;std::size_t custodian, std::size_t ward, class Base = default_call_policies&gt;
   struct with_custodian_and_ward_postcall : Base
   {
      static PyObject* postcall(PyObject* args, PyObject* result);
   };
}}
</pre>
    <h4>
      <a name="with_custodian_and_ward_postcall-spec-statics"></a>Class
      <code>with_custodian_and_ward_postcall</code> static functions
    </h4>
    <pre>
PyObject* postcall(PyObject* args, PyObject* result);
</pre>
    <dl class="function-semantics">
      <dt>
        <b>Requires:</b> <code><a href=
        "http://www.python.org/doc/2.2/api/tupleObjects.html#l2h-476">PyTuple_Check</a>(args)
        != 0</code>, <code>result&nbsp;!=&nbsp;0</code>.
      </dt>
      <dt>
        <b>Effects:</b> Makes the lifetime of the object indicated by
        <code>ward</code> dependent on the lifetime of the object indicated
        by <code>custodian</code>.
      </dt>
      <dt>
        <b>Returns:</b> <code>0</code> and <code><a href=
        "http://www.python.org/doc/2.2/api/exceptionHandling.html#l2h-71">PyErr_Occurred</a>()&nbsp;!=&nbsp;0</code>
        upon failure, <code>true</code> otherwise.
      </dt>
    </dl>
    <h2>
      <a name="examples"></a>Example
    </h2>The following example shows how
    <code>with_custodian_and_ward_postcall</code> is used by the library to
    implement <code><a href=
    "return_internal_reference.html#return_internal_reference-spec">return_internal_reference</a></code>
    
    <pre>
template &lt;std::size_t owner_arg = 1, class Base = default_call_policies&gt;
struct return_internal_reference
    : with_custodian_and_ward_postcall&lt;0, owner_arg, Base&gt;
{
   typedef <a href=
"reference_existing_object.html#reference_existing_object-spec">reference_existing_object</a> result_converter;
};
</pre>
    <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>