• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>boost/python/slice.hpp</title>
5<link rel="stylesheet" href="../../boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../index.html" title="Boost.Python Reference Manual">
8<link rel="up" href="../object_wrappers.html" title="Chapter 3. Object Wrappers">
9<link rel="prev" href="boost_python_str_hpp.html" title="boost/python/str.hpp">
10<link rel="next" href="boost_python_tuple_hpp.html" title="boost/python/tuple.hpp">
11</head>
12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../../images/boost.png"></td></tr></table>
14<hr>
15<div class="spirit-nav">
16<a accesskey="p" href="boost_python_str_hpp.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../object_wrappers.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_tuple_hpp.html"><img src="../../images/next.png" alt="Next"></a>
17</div>
18<div class="section">
19<div class="titlepage"><div><div><h2 class="title" style="clear: both">
20<a name="object_wrappers.boost_python_slice_hpp"></a><a class="link" href="boost_python_slice_hpp.html" title="boost/python/slice.hpp">boost/python/slice.hpp</a>
21</h2></div></div></div>
22<div class="toc"><dl class="toc">
23<dt><span class="section"><a href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.introduction">Introduction</a></span></dt>
24<dt><span class="section"><a href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.class_slice">Class
25        <code class="computeroutput"><span class="identifier">slice</span></code></a></span></dt>
26<dt><span class="section"><a href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.class_slice_constructors">Class
27        <code class="computeroutput"><span class="identifier">slice</span></code> constructors</a></span></dt>
28<dt><span class="section"><a href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.class_slice_observer_functions">Class
29        <code class="computeroutput"><span class="identifier">slice</span></code> observer functions</a></span></dt>
30<dt><span class="section"><a href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.example">Example</a></span></dt>
31</dl></div>
32<div class="section">
33<div class="titlepage"><div><div><h3 class="title">
34<a name="object_wrappers.boost_python_slice_hpp.introduction"></a><a class="link" href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.introduction" title="Introduction">Introduction</a>
35</h3></div></div></div>
36<p>
37          Exposes a <a class="link" href="../concepts/objectwrapper.html#concepts.objectwrapper.typewrapper_concept_requirements" title="TypeWrapper Concept Requirements">TypeWrapper</a>
38          for the Python <a href="http://www.python.org/doc/2.3.3/api/slice-objects.html" target="_top"><code class="computeroutput"><span class="identifier">slice</span></code></a> type.
39        </p>
40</div>
41<div class="section">
42<div class="titlepage"><div><div><h3 class="title">
43<a name="object_wrappers.boost_python_slice_hpp.class_slice"></a><a class="link" href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.class_slice" title="Class slice">Class
44        <code class="computeroutput"><span class="identifier">slice</span></code></a>
45</h3></div></div></div>
46<p>
47          Exposes the extended slicing protocol by wrapping the built-in slice type.
48          The semantics of the constructors and member functions defined below can
49          be fully understood by reading the <a class="link" href="../concepts/objectwrapper.html#concepts.objectwrapper.typewrapper_concept_requirements" title="TypeWrapper Concept Requirements">TypeWrapper</a>
50          concept definition. Since <code class="computeroutput"><span class="identifier">slice</span></code>
51          is publicly derived from <a class="link" href="boost_python_object_hpp.html#object_wrappers.boost_python_object_hpp.class_object" title="Class object"><code class="computeroutput"><span class="identifier">object</span></code></a>, the public <code class="computeroutput"><span class="identifier">object</span></code> interface applies to <code class="computeroutput"><span class="identifier">slice</span></code> instances as well.
52        </p>
53<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>
54<span class="special">{</span>
55  <span class="keyword">class</span> <span class="identifier">slice</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">object</span>
56  <span class="special">{</span>
57   <span class="keyword">public</span><span class="special">:</span>
58      <span class="identifier">slice</span><span class="special">();</span> <span class="comment">// create an empty slice, equivalent to [::]</span>
59
60      <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Int1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Int2</span><span class="special">&gt;</span>
61      <span class="identifier">slice</span><span class="special">(</span><span class="identifier">Int1</span> <span class="identifier">start</span><span class="special">,</span> <span class="identifier">Int2</span> <span class="identifier">stop</span><span class="special">);</span>
62
63      <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Int1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Int2</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Int3</span><span class="special">&gt;</span>
64      <span class="identifier">slice</span><span class="special">(</span><span class="identifier">Int1</span> <span class="identifier">start</span><span class="special">,</span> <span class="identifier">Int2</span> <span class="identifier">stop</span><span class="special">,</span> <span class="identifier">Int3</span> <span class="identifier">step</span><span class="special">);</span>
65
66      <span class="comment">// Access the parameters this slice was created with.</span>
67      <span class="identifier">object</span> <span class="identifier">start</span><span class="special">();</span>
68      <span class="identifier">object</span> <span class="identifier">stop</span><span class="special">();</span>
69      <span class="identifier">object</span> <span class="identifier">step</span><span class="special">();</span>
70
71      <span class="comment">// The return type of slice::get_indices()</span>
72      <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">RandomAccessIterator</span><span class="special">&gt;</span>
73      <span class="keyword">struct</span> <span class="identifier">range</span>
74      <span class="special">{</span>
75          <span class="identifier">RandomAccessIterator</span> <span class="identifier">start</span><span class="special">;</span>
76          <span class="identifier">RandomAccessIterator</span> <span class="identifier">stop</span><span class="special">;</span>
77          <span class="keyword">int</span> <span class="identifier">step</span><span class="special">;</span>
78      <span class="special">};</span>
79
80      <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">RandomAccessIterator</span><span class="special">&gt;</span>
81      <span class="identifier">range</span><span class="special">&lt;</span><span class="identifier">RandomAccessIterator</span><span class="special">&gt;</span>
82      <span class="identifier">get_indices</span><span class="special">(</span>
83          <span class="identifier">RandomAccessIterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">begin</span><span class="special">,</span>
84          <span class="identifier">RandomAccessIterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">end</span><span class="special">);</span>
85  <span class="special">};</span>
86<span class="special">}}</span>
87</pre>
88</div>
89<div class="section">
90<div class="titlepage"><div><div><h3 class="title">
91<a name="object_wrappers.boost_python_slice_hpp.class_slice_constructors"></a><a class="link" href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.class_slice_constructors" title="Class slice constructors">Class
92        <code class="computeroutput"><span class="identifier">slice</span></code> constructors</a>
93</h3></div></div></div>
94<pre class="programlisting"><span class="identifier">slice</span><span class="special">();</span></pre>
95<div class="variablelist">
96<p class="title"><b></b></p>
97<dl class="variablelist">
98<dt><span class="term">Effects</span></dt>
99<dd><p>
100                constructs a slice with default stop, start, and step values. Equivalent
101                to the slice object created as part of the Python expression <code class="computeroutput"><span class="identifier">base</span><span class="special">[::]</span></code>.
102              </p></dd>
103<dt><span class="term">Throws</span></dt>
104<dd><p>
105                nothing
106              </p></dd>
107</dl>
108</div>
109<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Int1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Int2</span><span class="special">&gt;</span>
110<span class="identifier">slice</span><span class="special">(</span><span class="identifier">Int1</span> <span class="identifier">start</span><span class="special">,</span> <span class="identifier">Int2</span> <span class="identifier">stop</span><span class="special">);</span>
111</pre>
112<div class="variablelist">
113<p class="title"><b></b></p>
114<dl class="variablelist">
115<dt><span class="term">Requires</span></dt>
116<dd><p>
117                <code class="computeroutput"><span class="identifier">start</span></code>, <code class="computeroutput"><span class="identifier">stop</span></code>, and <code class="computeroutput"><span class="identifier">step</span></code>
118                are of type <code class="computeroutput"><span class="identifier">slice_nil</span></code>
119                or convertible to type <code class="computeroutput"><span class="identifier">object</span></code>.
120              </p></dd>
121<dt><span class="term">Effects</span></dt>
122<dd><p>
123                constructs a new slice with default step value and the provided start
124                and stop values. Equivalent to the slice object created by the built-in
125                Python function <code class="computeroutput"><span class="identifier">slice</span><span class="special">(</span><span class="identifier">start</span><span class="special">,</span><span class="identifier">stop</span><span class="special">)</span></code>, or as part of the Python expression
126                <code class="computeroutput"><span class="identifier">base</span><span class="special">[</span><span class="identifier">start</span><span class="special">:</span><span class="identifier">stop</span><span class="special">]</span></code>.
127              </p></dd>
128<dt><span class="term">Throws</span></dt>
129<dd><p>
130                <code class="computeroutput"><span class="identifier">error_already_set</span></code>
131                and sets a Python TypeError exception if no conversion is possible
132                from the arguments to type object.
133              </p></dd>
134</dl>
135</div>
136<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Int1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Int2</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Int3</span><span class="special">&gt;</span>
137<span class="identifier">slice</span><span class="special">(</span><span class="identifier">Int1</span> <span class="identifier">start</span><span class="special">,</span> <span class="identifier">Int2</span> <span class="identifier">stop</span><span class="special">,</span> <span class="identifier">Int3</span> <span class="identifier">step</span><span class="special">);</span>
138</pre>
139<div class="variablelist">
140<p class="title"><b></b></p>
141<dl class="variablelist">
142<dt><span class="term">Requires</span></dt>
143<dd><p>
144                <code class="computeroutput"><span class="identifier">start</span></code>, <code class="computeroutput"><span class="identifier">stop</span></code>, and <code class="computeroutput"><span class="identifier">step</span></code>
145                are <code class="computeroutput"><span class="identifier">slice_nil</span></code> or
146                convertible to type <code class="computeroutput"><span class="identifier">object</span></code>.
147              </p></dd>
148<dt><span class="term">Effects</span></dt>
149<dd><p>
150                constructs a new slice with start stop and step values. Equivalent
151                to the slice object created by the built-in Python function <code class="computeroutput"><span class="identifier">slice</span><span class="special">(</span><span class="identifier">start</span><span class="special">,</span><span class="identifier">stop</span><span class="special">,</span><span class="identifier">step</span><span class="special">)</span></code>,
152                or as part of the Python expression <code class="computeroutput"><span class="identifier">base</span><span class="special">[</span><span class="identifier">start</span><span class="special">:</span><span class="identifier">stop</span><span class="special">:</span><span class="identifier">step</span><span class="special">]</span></code>.
153              </p></dd>
154<dt><span class="term">Throws</span></dt>
155<dd><p>
156                <code class="computeroutput"><span class="identifier">error_already_set</span></code>
157                and sets a Python TypeError exception if no conversion is possible
158                from the arguments to type object.
159              </p></dd>
160</dl>
161</div>
162</div>
163<div class="section">
164<div class="titlepage"><div><div><h3 class="title">
165<a name="object_wrappers.boost_python_slice_hpp.class_slice_observer_functions"></a><a class="link" href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.class_slice_observer_functions" title="Class slice observer functions">Class
166        <code class="computeroutput"><span class="identifier">slice</span></code> observer functions</a>
167</h3></div></div></div>
168<pre class="programlisting"><span class="identifier">object</span> <span class="identifier">slice</span><span class="special">::</span><span class="identifier">start</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
169<span class="identifier">object</span> <span class="identifier">slice</span><span class="special">::</span><span class="identifier">stop</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
170<span class="identifier">object</span> <span class="identifier">slice</span><span class="special">::</span><span class="identifier">step</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
171</pre>
172<div class="variablelist">
173<p class="title"><b></b></p>
174<dl class="variablelist">
175<dt><span class="term">Effects</span></dt>
176<dd><p>
177                None
178              </p></dd>
179<dt><span class="term">Throws</span></dt>
180<dd><p>
181                nothing
182              </p></dd>
183<dt><span class="term">Returns</span></dt>
184<dd><p>
185                the parameter that the slice was created with. If the parameter was
186                omitted or <code class="computeroutput"><span class="identifier">slice_nil</span></code>
187                was used when the slice was created, than that parameter will be
188                a reference to <code class="computeroutput"><span class="identifier">PyNone</span></code>
189                and compare equal to a default-constructed object. In principal,
190                any object may be used when creating a slice object, but in practice
191                they are usually integers.
192              </p></dd>
193</dl>
194</div>
195<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">RandomAccessIterator</span><span class="special">&gt;</span>
196<span class="identifier">slice</span><span class="special">::</span><span class="identifier">range</span><span class="special">&lt;</span><span class="identifier">RandomAccessIterator</span><span class="special">&gt;</span>
197<span class="identifier">slice</span><span class="special">::</span><span class="identifier">get_indices</span><span class="special">(</span>
198    <span class="identifier">RandomAccessIterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">begin</span><span class="special">,</span>
199    <span class="identifier">RandomAccessIterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">end</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
200</pre>
201<div class="variablelist">
202<p class="title"><b></b></p>
203<dl class="variablelist">
204<dt><span class="term">Arguments</span></dt>
205<dd><p>
206                A pair of STL-conforming Random Access Iterators that form a half-open
207                range.
208              </p></dd>
209<dt><span class="term">Effects</span></dt>
210<dd><p>
211                Create a RandomAccessIterator pair that defines a fully-closed range
212                within the <code class="computeroutput"><span class="special">[</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> range of its arguments. This function
213                translates this slice's indices while accounting for the effects
214                of any PyNone or negative indices, and non-singular step sizes.
215              </p></dd>
216<dt><span class="term">Returns</span></dt>
217<dd><p>
218                a <code class="computeroutput"><span class="identifier">slice</span><span class="special">::</span><span class="identifier">range</span></code> that has been initialized
219                with a non-zero value of step and a pair of RandomAccessIterators
220                that point within the range of this functions arguments and define
221                a closed interval.
222              </p></dd>
223<dt><span class="term">Throws</span></dt>
224<dd><p>
225                Raises a Python TypeError exception if any of this slice's arguments
226                are neither references to PyNone nor convertible to int. Throws
227                <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">invalid_argument</span></code> if the resulting
228                range would be empty. You should always wrap calls to <code class="computeroutput"><span class="identifier">slice</span><span class="special">::</span><span class="identifier">get_indices</span><span class="special">()</span></code>
229                within <code class="computeroutput"><span class="keyword">try</span> <span class="special">{</span>
230                <span class="special">...;</span> <span class="special">}</span>
231                <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">invalid_argument</span><span class="special">)</span>
232                <span class="special">{}</span></code> to handle this case and
233                take appropriate action.
234              </p></dd>
235<dt><span class="term">Rationale</span></dt>
236<dd><p>
237                closed-interval: If an open interval were used, then for step size
238                other than 1, the required state for the end iterator would point
239                beyond the one-past-the-end position or before the beginning of the
240                specified range. exceptions on empty slice: It is impossible to define
241                a closed interval over an empty range, so some other form of error
242                checking would have to be used to prevent undefined behavior. In
243                the case where the exception is not caught, it will simply be translated
244                to Python by the default exception handling mechanisms.
245              </p></dd>
246</dl>
247</div>
248</div>
249<div class="section">
250<div class="titlepage"><div><div><h3 class="title">
251<a name="object_wrappers.boost_python_slice_hpp.example"></a><a class="link" href="boost_python_slice_hpp.html#object_wrappers.boost_python_slice_hpp.example" title="Example">Example</a>
252</h3></div></div></div>
253<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">;</span>
254
255<span class="comment">// Perform an extended slice of a Python list.</span>
256<span class="comment">// Warning: extended slicing was not supported for built-in types prior </span>
257<span class="comment">// to Python 2.3</span>
258<span class="identifier">list</span> <span class="identifier">odd_elements</span><span class="special">(</span><span class="identifier">list</span> <span class="identifier">l</span><span class="special">)</span>
259<span class="special">{</span>
260    <span class="keyword">return</span> <span class="identifier">l</span><span class="special">[</span><span class="identifier">slice</span><span class="special">(</span><span class="identifier">_</span><span class="special">,</span><span class="identifier">_</span><span class="special">,</span><span class="number">2</span><span class="special">)];</span>
261<span class="special">}</span>
262
263<span class="comment">// Perform a summation over a slice of a std::vector.</span>
264<span class="keyword">double</span> <span class="identifier">partial_sum</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">Foo</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">slice</span> <span class="identifier">index</span><span class="special">)</span>
265<span class="special">{</span>
266    <span class="identifier">slice</span><span class="special">::</span><span class="identifier">range</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span><span class="special">&gt;</span> <span class="identifier">bounds</span><span class="special">;</span>
267    <span class="keyword">try</span> <span class="special">{</span>
268        <span class="identifier">bounds</span> <span class="special">=</span> <span class="identifier">index</span><span class="special">.</span><span class="identifier">get_indices</span><span class="special">&lt;&gt;(</span><span class="identifier">Foo</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">Foo</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
269    <span class="special">}</span>
270    <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">invalid_argument</span><span class="special">)</span> <span class="special">{</span>
271        <span class="keyword">return</span> <span class="number">0.0</span><span class="special">;</span>
272    <span class="special">}</span>
273    <span class="keyword">double</span> <span class="identifier">sum</span> <span class="special">=</span> <span class="number">0.0</span><span class="special">;</span>
274    <span class="keyword">while</span> <span class="special">(</span><span class="identifier">bounds</span><span class="special">.</span><span class="identifier">start</span> <span class="special">!=</span> <span class="identifier">bounds</span><span class="special">.</span><span class="identifier">stop</span><span class="special">)</span> <span class="special">{</span>
275        <span class="identifier">sum</span> <span class="special">+=</span> <span class="special">*</span><span class="identifier">bounds</span><span class="special">.</span><span class="identifier">start</span><span class="special">;</span>
276        <span class="identifier">std</span><span class="special">::</span><span class="identifier">advance</span><span class="special">(</span> <span class="identifier">bounds</span><span class="special">.</span><span class="identifier">start</span><span class="special">,</span> <span class="identifier">bounds</span><span class="special">.</span><span class="identifier">step</span><span class="special">);</span>
277    <span class="special">}</span>
278    <span class="identifier">sum</span> <span class="special">+=</span> <span class="special">*</span><span class="identifier">bounds</span><span class="special">.</span><span class="identifier">start</span><span class="special">;</span>
279    <span class="keyword">return</span> <span class="identifier">sum</span><span class="special">;</span>
280<span class="special">}</span>
281</pre>
282</div>
283</div>
284<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
285<td align="left"></td>
286<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
287        Distributed under the Boost Software License, Version 1.0. (See accompanying
288        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>
289      </p>
290</div></td>
291</tr></table>
292<hr>
293<div class="spirit-nav">
294<a accesskey="p" href="boost_python_str_hpp.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../object_wrappers.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_tuple_hpp.html"><img src="../../images/next.png" alt="Next"></a>
295</div>
296</body>
297</html>
298