|
1334 | 1334 | </span> |
1335 | 1335 | </a> |
1336 | 1336 |
|
| 1337 | +</li> |
| 1338 | + |
| 1339 | + <li class="md-nav__item"> |
| 1340 | + <a href="#iterator-requirements" class="md-nav__link"> |
| 1341 | + <span class="md-ellipsis"> |
| 1342 | + |
| 1343 | + Iterator Requirements |
| 1344 | + |
| 1345 | + </span> |
| 1346 | + </a> |
| 1347 | + |
| 1348 | + <nav class="md-nav" aria-label="Iterator Requirements"> |
| 1349 | + <ul class="md-nav__list"> |
| 1350 | + |
| 1351 | + <li class="md-nav__item"> |
| 1352 | + <a href="#missing-iterator-traits" class="md-nav__link"> |
| 1353 | + <span class="md-ellipsis"> |
| 1354 | + |
| 1355 | + Missing Iterator Traits |
| 1356 | + |
| 1357 | + </span> |
| 1358 | + </a> |
| 1359 | + |
| 1360 | +</li> |
| 1361 | + |
| 1362 | + <li class="md-nav__item"> |
| 1363 | + <a href="#common-iterator-categories" class="md-nav__link"> |
| 1364 | + <span class="md-ellipsis"> |
| 1365 | + |
| 1366 | + Common Iterator Categories |
| 1367 | + |
| 1368 | + </span> |
| 1369 | + </a> |
| 1370 | + |
| 1371 | +</li> |
| 1372 | + |
| 1373 | + </ul> |
| 1374 | + </nav> |
| 1375 | + |
1337 | 1376 | </li> |
1338 | 1377 |
|
1339 | 1378 | <li class="md-nav__item"> |
@@ -3598,21 +3637,78 @@ <h2 id="enumerable-support-internal-iterators">Enumerable Support (Internal Iter |
3598 | 3637 | <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="k">end</span> |
3599 | 3638 | </code></pre></div> |
3600 | 3639 | <p>Where the result will be <code>[6, 4, 2]</code>.</p> |
| 3640 | +<h2 id="iterator-requirements">Iterator Requirements<a class="headerlink" href="#iterator-requirements" title="Permanent link">¶</a></h2> |
| 3641 | +<p>Rice uses <code>std::iterator_traits</code> to determine the value type, reference type, and other properties of iterators. This means your iterator must either:</p> |
| 3642 | +<ol> |
| 3643 | +<li>Define the standard iterator typedefs (<code>value_type</code>, <code>reference</code>, <code>pointer</code>, <code>difference_type</code>, <code>iterator_category</code>), or</li> |
| 3644 | +<li>Have a specialization of <code>std::iterator_traits</code> defined for it</li> |
| 3645 | +</ol> |
| 3646 | +<p>Most STL iterators and well-designed C++ iterators already satisfy these requirements. However, some libraries define iterators that lack these typedefs.</p> |
| 3647 | +<h3 id="missing-iterator-traits">Missing Iterator Traits<a class="headerlink" href="#missing-iterator-traits" title="Permanent link">¶</a></h3> |
| 3648 | +<p>If you encounter a compiler error like:</p> |
| 3649 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>error C2039: 'value_type': is not a member of 'std::iterator_traits<MyIterator>' |
| 3650 | +</code></pre></div> |
| 3651 | +<p>You need to provide a <code>std::iterator_traits</code> specialization for that iterator. For example:</p> |
| 3652 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="cp">#include</span><span class="w"> </span><span class="cpf"><iterator></span> |
| 3653 | +<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a> |
| 3654 | +<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="c1">// Specialization for an iterator that lacks proper traits</span> |
| 3655 | +<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="k">namespace</span><span class="w"> </span><span class="nn">std</span> |
| 3656 | +<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="p">{</span> |
| 3657 | +<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a><span class="w"> </span><span class="k">template</span><span class="o"><></span> |
| 3658 | +<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">iterator_traits</span><span class="o"><</span><span class="n">MyNamespace</span><span class="o">::</span><span class="n">MyIterator</span><span class="o">></span> |
| 3659 | +<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="w"> </span><span class="p">{</span> |
| 3660 | +<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">iterator_category</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">forward_iterator_tag</span><span class="p">;</span> |
| 3661 | +<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">value_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MyValueType</span><span class="p">;</span> |
| 3662 | +<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">difference_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">ptrdiff_t</span><span class="p">;</span> |
| 3663 | +<a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">pointer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MyValueType</span><span class="o">*</span><span class="p">;</span> |
| 3664 | +<a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">reference</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MyValueType</span><span class="o">&</span><span class="p">;</span> |
| 3665 | +<a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a><span class="w"> </span><span class="p">};</span> |
| 3666 | +<a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a><span class="p">}</span> |
| 3667 | +</code></pre></div> |
| 3668 | +<p>Place this specialization before your Rice bindings code, typically right after the includes.</p> |
| 3669 | +<h3 id="common-iterator-categories">Common Iterator Categories<a class="headerlink" href="#common-iterator-categories" title="Permanent link">¶</a></h3> |
| 3670 | +<p>Choose the appropriate <code>iterator_category</code> based on your iterator's capabilities:</p> |
| 3671 | +<table> |
| 3672 | +<thead> |
| 3673 | +<tr> |
| 3674 | +<th>Category</th> |
| 3675 | +<th>Operations Supported</th> |
| 3676 | +</tr> |
| 3677 | +</thead> |
| 3678 | +<tbody> |
| 3679 | +<tr> |
| 3680 | +<td><code>input_iterator_tag</code></td> |
| 3681 | +<td>Read-only, single-pass (<code>++</code>, <code>*</code>, <code>==</code>)</td> |
| 3682 | +</tr> |
| 3683 | +<tr> |
| 3684 | +<td><code>forward_iterator_tag</code></td> |
| 3685 | +<td>Read/write, multi-pass (<code>++</code>, <code>*</code>, <code>==</code>)</td> |
| 3686 | +</tr> |
| 3687 | +<tr> |
| 3688 | +<td><code>bidirectional_iterator_tag</code></td> |
| 3689 | +<td>Forward + backward (<code>++</code>, <code>--</code>, <code>*</code>, <code>==</code>)</td> |
| 3690 | +</tr> |
| 3691 | +<tr> |
| 3692 | +<td><code>random_access_iterator_tag</code></td> |
| 3693 | +<td>Bidirectional + random access (<code>+</code>, <code>-</code>, <code>[]</code>, <code><</code>)</td> |
| 3694 | +</tr> |
| 3695 | +</tbody> |
| 3696 | +</table> |
3601 | 3697 | <h2 id="enumerator-support-external-iterators">Enumerator Support (External Iterators)<a class="headerlink" href="#enumerator-support-external-iterators" title="Permanent link">¶</a></h2> |
3602 | 3698 | <p>Ruby supports external iterators via the <a href="https://ruby-doc.org/3.2.2/Enumerator.html">Enumerator</a> class. The <code>define_iterator</code> method automatically adds support for Enumerators.</p> |
3603 | 3699 | <p>Enumerators can be created by calling an iterator method without a block, in the same way you can call <code>Array#each</code> or other methods without a block. For example:</p> |
3604 | | -<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="n">intVector</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">IntVector</span><span class="o">.</span><span class="n">new</span> |
3605 | | -<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="n">intVector</span><span class="o">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> |
3606 | | -<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="n">intVector</span><span class="o">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> |
3607 | | -<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="n">intVector</span><span class="o">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> |
3608 | | -<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a> |
3609 | | -<a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="c1"># Get an enumerator</span> |
3610 | | -<a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="n">enumerator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">intVector</span><span class="o">.</span><span class="n">each</span> |
3611 | | -<a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a> |
3612 | | -<a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="c1"># Now use it</span> |
3613 | | -<a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="n">enumerator</span><span class="o">.</span><span class="n">map</span><span class="w"> </span><span class="o">|</span><span class="n">i</span><span class="o">|</span> |
3614 | | -<a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span> |
3615 | | -<a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a><span class="k">end</span> |
| 3700 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="n">intVector</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">IntVector</span><span class="o">.</span><span class="n">new</span> |
| 3701 | +<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="n">intVector</span><span class="o">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> |
| 3702 | +<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="n">intVector</span><span class="o">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> |
| 3703 | +<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="n">intVector</span><span class="o">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> |
| 3704 | +<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a> |
| 3705 | +<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="c1"># Get an enumerator</span> |
| 3706 | +<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="n">enumerator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">intVector</span><span class="o">.</span><span class="n">each</span> |
| 3707 | +<a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a> |
| 3708 | +<a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="c1"># Now use it</span> |
| 3709 | +<a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a><span class="n">enumerator</span><span class="o">.</span><span class="n">map</span><span class="w"> </span><span class="o">|</span><span class="n">i</span><span class="o">|</span> |
| 3710 | +<a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span> |
| 3711 | +<a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a><span class="k">end</span> |
3616 | 3712 | </code></pre></div> |
3617 | 3713 |
|
3618 | 3714 |
|
|
0 commit comments