Skip to content

Commit 6552a36

Browse files
committed
1 parent ffe9036 commit 6552a36

File tree

15 files changed

+11348
-95
lines changed

15 files changed

+11348
-95
lines changed

4.x/architecture/incomplete_types/index.html

Lines changed: 3718 additions & 0 deletions
Large diffs are not rendered by default.

4.x/architecture/overview/index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3627,6 +3627,8 @@ <h2 id="key-components">Key Components<a class="headerlink" href="#key-component
36273627
Implementing Ruby-style iteration for C++ containers.</p>
36283628
<p><a href="../procs_and_blocks/">Procs and Blocks</a>
36293629
Bridging Ruby procs/blocks and C++ function pointers.</p>
3630+
<p><a href="../incomplete_types/">Incomplete Types</a>
3631+
Support for forward-declared types (PIMPL idiom, opaque handles).</p>
36303632
<h2 id="thread-safety">Thread Safety<a class="headerlink" href="#thread-safety" title="Permanent link">&para;</a></h2>
36313633
<p>Rice itself is thread-safe for reading (method invocation). However:</p>
36323634
<ul>

4.x/architecture/registries/index.html

Lines changed: 107 additions & 59 deletions
Large diffs are not rendered by default.

4.x/bindings/classes/index.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3731,6 +3731,9 @@ <h3 id="inheriting-from-c-classes">Inheriting from C++ Classes<a class="headerli
37313731
<a id="__codelineno-5-25" name="__codelineno-5-25" href="#__codelineno-5-25"></a><span class="p">}</span>
37323732
</code></pre></div>
37333733
<p>The second template parameter tells Rice about the inheritance relationship, enabling proper type conversions and polymorphic behavior.</p>
3734+
<blockquote>
3735+
<p><strong>Note:</strong> Rice requires RTTI to be enabled for polymorphism to work correctly. When a C++ method returns a <code>Base*</code> that actually points to a <code>Derived</code> object, Rice uses RTTI to wrap it as the correct Ruby class. See <a href="../../packaging/build_settings/#rtti">RTTI</a> for details.</p>
3736+
</blockquote>
37343737
<p>If you want to create Ruby classes that inherit from wrapped C++ classes and override virtual methods, see the <a href="../directors/">Directors</a> section.</p>
37353738
<h2 id="method-chaining">Method Chaining<a class="headerlink" href="#method-chaining" title="Permanent link">&para;</a></h2>
37363739
<p>Most methods on <code>Class</code> and <code>Data_Type</code> return a reference to self, allowing you to chain method calls:</p>

4.x/bindings/iterators/index.html

Lines changed: 108 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,45 @@
13341334
</span>
13351335
</a>
13361336

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+
13371376
</li>
13381377

13391378
<li class="md-nav__item">
@@ -3598,21 +3637,78 @@ <h2 id="enumerable-support-internal-iterators">Enumerable Support (Internal Iter
35983637
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="k">end</span>
35993638
</code></pre></div>
36003639
<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">&para;</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">&para;</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: &#39;value_type&#39;: is not a member of &#39;std::iterator_traits&lt;MyIterator&gt;&#39;
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">&lt;iterator&gt;</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">&lt;&gt;</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">&lt;</span><span class="n">MyNamespace</span><span class="o">::</span><span class="n">MyIterator</span><span class="o">&gt;</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">&amp;</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">&para;</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>&lt;</code>)</td>
3694+
</tr>
3695+
</tbody>
3696+
</table>
36013697
<h2 id="enumerator-support-external-iterators">Enumerator Support (External Iterators)<a class="headerlink" href="#enumerator-support-external-iterators" title="Permanent link">&para;</a></h2>
36023698
<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>
36033699
<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>
36163712
</code></pre></div>
36173713

36183714

4.x/changelog/index.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3914,7 +3914,9 @@ <h2 id="492-unreleased">4.9.2 (unreleased)<a class="headerlink" href="#492-unrel
39143914
<p>Enhancements:
39153915
* Add support for incomplete types (PIMPL/opaque handle patterns). Rice now uses <code>typeid(T*)</code> for forward-declared types that are never fully defined.
39163916
* Add support for <code>noexcept</code> functions, static members, and static member functions
3917-
* Add support for <code>Buffer&lt;void*&gt;</code> and <code>Pointer&lt;void*&gt;</code></p>
3917+
* Add support for <code>Buffer&lt;void*&gt;</code> and <code>Pointer&lt;void*&gt;</code>
3918+
* Add support for <code>std::function</code>. Ruby procs, lambdas, and blocks can be wrapped in <code>std::function</code> objects and passed to C++ methods. C++ functions returning <code>std::function</code> are automatically wrapped.
3919+
* Add support for <code>std::ostream</code>, <code>std::ostringstream</code>, and <code>std::ofstream</code>. Ruby can write to C++ streams and pass them to C++ functions. Standard streams are exposed as <code>Std::COUT</code> and <code>Std::CERR</code>.</p>
39183920
<p>Internal:
39193921
* Refactor type handling by merging <code>TypeMapper</code> into <code>TypeDetail</code> and simplifying class hierarchy</p>
39203922
<h2 id="491-2026-01-04">4.9.1 (2026-01-04)<a class="headerlink" href="#491-2026-01-04" title="Permanent link">&para;</a></h2>

4.x/installation/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3575,7 +3575,7 @@ <h2 id="option-2-copy-header-files">Option 2: Copy Header Files<a class="headerl
35753575
</ul>
35763576
<p>When copying headers, use a specific release tag rather than the master branch to ensure stability.</p>
35773577
<h2 id="compiler-requirements">Compiler Requirements<a class="headerlink" href="#compiler-requirements" title="Permanent link">&para;</a></h2>
3578-
<p>Rice requires a C++17 compliant compiler. See <a href="../packaging/build_settings/#compiler-settings">Compiler Settings</a> for the specific flags needed for each compiler.</p>
3578+
<p>Rice requires a C++17 compliant compiler and RTTI to be enabled. See <a href="../packaging/build_settings/#compiler-settings">Compiler Settings</a> for the specific flags needed for each compiler.</p>
35793579

35803580

35813581

4.x/packaging/build_settings/index.html

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3188,6 +3188,17 @@
31883188
</span>
31893189
</a>
31903190

3191+
</li>
3192+
3193+
<li class="md-nav__item">
3194+
<a href="#rtti" class="md-nav__link">
3195+
<span class="md-ellipsis">
3196+
3197+
RTTI
3198+
3199+
</span>
3200+
</a>
3201+
31913202
</li>
31923203

31933204
</ul>
@@ -3719,6 +3730,13 @@ <h3 id="exception-handling-model">Exception Handling Model<a class="headerlink"
37193730
<p>For Visual C++, the default exception <a href="https://learn.microsoft.com/en-us/cpp/build/reference/eh-exception-handling-model?view=msvc-170">model</a> setting of <code>/EHsc</code> crashes Ruby when calling longjmp with optimizations enabled (/O2). Therefore you must <code>/EHs</code> instead.</p>
37203731
<h3 id="template-backtrace">Template Backtrace<a class="headerlink" href="#template-backtrace" title="Permanent link">&para;</a></h3>
37213732
<p>For g++, you must set <code>-ftemplate-backtrace-limit=0</code> to avoid compilation errors.</p>
3733+
<h3 id="rtti">RTTI<a class="headerlink" href="#rtti" title="Permanent link">&para;</a></h3>
3734+
<p>Rice requires RTTI (Run-Time Type Information) to be enabled. RTTI is enabled by default on all major compilers, but if you have explicitly disabled it, you must re-enable it:</p>
3735+
<ul>
3736+
<li><strong>GCC/Clang</strong>: <code>-frtti</code> (default is enabled; do not use <code>-fno-rtti</code>)</li>
3737+
<li><strong>MSVC</strong>: <code>/GR</code> (default is enabled; do not use <code>/GR-</code>)</li>
3738+
</ul>
3739+
<p>RTTI is essential for Rice's polymorphism support. When a C++ method returns a base class pointer that actually points to a derived class, Rice uses <code>typeid</code> to determine the correct Ruby class to wrap it as. Without RTTI, all objects would be wrapped as their static (declared) type rather than their actual runtime type.</p>
37223740
<h2 id="linker-settings">Linker Settings<a class="headerlink" href="#linker-settings" title="Permanent link">&para;</a></h2>
37233741
<p>Ruby extensions are shared libraries that the Ruby interpreter loads at runtime using <code>dlopen</code>. These extensions reference symbols from the Ruby C API (such as <code>rb_define_class</code>, <code>rb_funcall</code>, etc.) that are provided by the Ruby interpreter itself. Since these symbols are not available at link time, the linker must be told to allow unresolved symbols.</p>
37243742
<h3 id="macos">macOS<a class="headerlink" href="#macos" title="Permanent link">&para;</a></h3>

4.x/search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

4.x/sitemap.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
<loc>https://ruby-rice.github.io/rice/architecture/enumerators/</loc>
4545
<lastmod>2026-01-13</lastmod>
4646
</url>
47+
<url>
48+
<loc>https://ruby-rice.github.io/rice/architecture/incomplete_types/</loc>
49+
<lastmod>2026-01-13</lastmod>
50+
</url>
4751
<url>
4852
<loc>https://ruby-rice.github.io/rice/architecture/method_binding/</loc>
4953
<lastmod>2026-01-13</lastmod>
@@ -268,6 +272,10 @@
268272
<loc>https://ruby-rice.github.io/rice/stl/exception_ptr/</loc>
269273
<lastmod>2026-01-13</lastmod>
270274
</url>
275+
<url>
276+
<loc>https://ruby-rice.github.io/rice/stl/function/</loc>
277+
<lastmod>2026-01-13</lastmod>
278+
</url>
271279
<url>
272280
<loc>https://ruby-rice.github.io/rice/stl/map/</loc>
273281
<lastmod>2026-01-13</lastmod>
@@ -280,6 +288,10 @@
280288
<loc>https://ruby-rice.github.io/rice/stl/optional/</loc>
281289
<lastmod>2026-01-13</lastmod>
282290
</url>
291+
<url>
292+
<loc>https://ruby-rice.github.io/rice/stl/ostream/</loc>
293+
<lastmod>2026-01-13</lastmod>
294+
</url>
283295
<url>
284296
<loc>https://ruby-rice.github.io/rice/stl/pair/</loc>
285297
<lastmod>2026-01-13</lastmod>

0 commit comments

Comments
 (0)