This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new e2878c85ec deploy: 0ded0ce1be928ac8a74ce8e791febda95e01c05e
e2878c85ec is described below

commit e2878c85ecd73b8e382c4af4e11e1881c11ab192
Author: alamb <al...@users.noreply.github.com>
AuthorDate: Tue Aug 8 20:38:56 2023 +0000

    deploy: 0ded0ce1be928ac8a74ce8e791febda95e01c05e
---
 arrow_row/interner/index.html         |   2 +-
 arrow_row/interner/struct.Bucket.html |   8 +-
 search-index.js                       |   2 +-
 src/arrow_row/interner.rs.html        | 186 ++++++++++++++++++++++++++++++++++
 4 files changed, 193 insertions(+), 5 deletions(-)

diff --git a/arrow_row/interner/index.html b/arrow_row/interner/index.html
index 79f713cd25..80f79717ff 100644
--- a/arrow_row/interner/index.html
+++ b/arrow_row/interner/index.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `interner` mod in crate 
`arrow_row`."><title>arrow_row::interner - Rust</title><link rel="preload" 
as="font" type="font/woff2" crossorigin 
href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link 
rel="preload" as="font" type="font/wof [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `interner` mod in crate 
`arrow_row`."><title>arrow_row::interner - Rust</title><link rel="preload" 
as="font" type="font/woff2" crossorigin 
href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link 
rel="preload" as="font" type="font/wof [...]
 to the interned values, e.g. <code>inter(a) &lt; intern(b) =&gt; a &lt; 
b</code></div></li><li><div class="item-name"><a class="struct" 
href="struct.Slot.html" title="struct arrow_row::interner::Slot">Slot</a><span 
title="Restricted Visibility">&nbsp;🔒</span> </div><div class="desc 
docblock-short">A slot corresponds to a single byte-value in the generated 
normalized key</div></li></ul></section></div></main></body></html>
\ No newline at end of file
diff --git a/arrow_row/interner/struct.Bucket.html 
b/arrow_row/interner/struct.Bucket.html
index 71f3681ad1..6729bcdb90 100644
--- a/arrow_row/interner/struct.Bucket.html
+++ b/arrow_row/interner/struct.Bucket.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Bucket is 
the root of the data-structure used to allocate normalized keys"><title>Bucket 
in arrow_row::interner - Rust</title><link rel="preload" as="font" 
type="font/woff2" crossorigin 
href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link 
rel="preload" as="font [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Bucket is 
the root of the data-structure used to allocate normalized keys"><title>Bucket 
in arrow_row::interner - Rust</title><link rel="preload" as="font" 
type="font/woff2" crossorigin 
href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link 
rel="preload" as="font [...]
     slots: <a class="struct" 
href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html"; 
title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" 
href="struct.Slot.html" title="struct arrow_row::interner::Slot">Slot</a>&gt;,
     next: <a class="enum" 
href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html"; 
title="enum core::option::Option">Option</a>&lt;<a class="struct" 
href="https://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html"; 
title="struct alloc::boxed::Box">Box</a>&lt;<a class="struct" 
href="struct.Bucket.html" title="struct 
arrow_row::interner::Bucket">Bucket</a>&gt;&gt;,
 }</code></pre><details class="toggle top-doc" open><summary 
class="hideme"><span>Expand description</span></summary><div 
class="docblock"><p>Bucket is the root of the data-structure used to allocate 
normalized keys</p>
@@ -30,7 +30,7 @@ with the final value incremented by 2, followed by a null 
terminator.</p>
 <span class="number">7</span>: <span class="kw-2">&amp;</span>[<span 
class="number">1</span>, <span class="number">3</span>, <span 
class="number">0</span>]</code></pre></div>
 <p>Note: this allocation strategy is optimised for interning values in sorted 
order</p>
 </div></details><h2 id="fields" class="fields small-section-header">Fields<a 
href="#fields" class="anchor">§</a></h2><span id="structfield.slots" 
class="structfield small-section-header"><a href="#structfield.slots" 
class="anchor field">§</a><code>slots: <a class="struct" 
href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html"; 
title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" 
href="struct.Slot.html" title="struct 
arrow_row::interner::Slot">Slot</a>&gt;</code></span>< [...]
-</div><h2 id="implementations" class="small-section-header">Implementations<a 
href="#implementations" class="anchor">§</a></h2><div 
id="implementations-list"><details class="toggle implementors-toggle" 
open><summary><section id="impl-Bucket" class="impl"><a class="src rightside" 
href="../../src/arrow_row/interner.rs.html#293-348">source</a><a 
href="#impl-Bucket" class="anchor">§</a><h3 class="code-header">impl <a 
class="struct" href="struct.Bucket.html" title="struct arrow_row::interner: 
[...]
+</div><h2 id="implementations" class="small-section-header">Implementations<a 
href="#implementations" class="anchor">§</a></h2><div 
id="implementations-list"><details class="toggle implementors-toggle" 
open><summary><section id="impl-Bucket" class="impl"><a class="src rightside" 
href="../../src/arrow_row/interner.rs.html#293-359">source</a><a 
href="#impl-Bucket" class="anchor">§</a><h3 class="code-header">impl <a 
class="struct" href="struct.Bucket.html" title="struct arrow_row::interner: 
[...]
     &amp;mut self,
     values_buf: &amp;mut <a class="struct" href="struct.InternBuffer.html" 
title="struct arrow_row::interner::InternBuffer">InternBuffer</a>,
     data: &amp;[<a class="primitive" 
href="https://doc.rust-lang.org/nightly/std/primitive.u8.html";>u8</a>],
@@ -39,7 +39,9 @@ with the final value incremented by 2, followed by a null 
terminator.</p>
 normalized key to <code>out</code> as it is constructed</p>
 <h5 id="panics"><a href="#panics">Panics</a></h5>
 <p>Panics if the value already exists</p>
-</div></details><details class="toggle method-toggle" open><summary><section 
id="method.size" class="method"><a class="src rightside" 
href="../../src/arrow_row/interner.rs.html#343-347">source</a><h4 
class="code-header">fn <a href="#method.size" class="fn">size</a>(&amp;self) 
-&gt; <a class="primitive" 
href="https://doc.rust-lang.org/nightly/std/primitive.usize.html";>usize</a></h4></section></summary><div
 class="docblock"><p>Returns the size of this instance in bytes</p>
+</div></details><details class="toggle method-toggle" open><summary><section 
id="method.size" class="method"><a class="src rightside" 
href="../../src/arrow_row/interner.rs.html#343-349">source</a><h4 
class="code-header">fn <a href="#method.size" class="fn">size</a>(&amp;self) 
-&gt; <a class="primitive" 
href="https://doc.rust-lang.org/nightly/std/primitive.usize.html";>usize</a></h4></section></summary><div
 class="docblock"><p>Returns the size of this instance in bytes</p>
+</div></details><details class="toggle method-toggle" open><summary><section 
id="method.slot_child_bucket_size" class="method"><a class="src rightside" 
href="../../src/arrow_row/interner.rs.html#353-358">source</a><h4 
class="code-header">fn <a href="#method.slot_child_bucket_size" 
class="fn">slot_child_bucket_size</a>(&amp;self) -&gt; <a class="primitive" 
href="https://doc.rust-lang.org/nightly/std/primitive.usize.html";>usize</a></h4></section></summary><div
 class="docblock"><p>returns t [...]
+in self.slots. This does not include the size of the child Slot itself</p>
 </div></details></div></details></div><h2 id="trait-implementations" 
class="small-section-header">Trait Implementations<a 
href="#trait-implementations" class="anchor">§</a></h2><div 
id="trait-implementations-list"><details class="toggle implementors-toggle" 
open><summary><section id="impl-Clone-for-Bucket" class="impl"><a class="src 
rightside" href="../../src/arrow_row/interner.rs.html#277">source</a><a 
href="#impl-Clone-for-Bucket" class="anchor">§</a><h3 class="code-header">impl 
<a cla [...]
     T: 'static + ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait 
core::marker::Sized">Sized</a>,</span></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.type_id" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#202";>source</a><a 
href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a hre 
[...]
     T: ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait 
core::marker::Sized">Sized</a>,</span></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.borrow" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#210";>source</a><a
 href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a 
href="https: [...]
diff --git a/search-index.js b/search-index.js
index d3a8920401..3a037d528d 100644
--- a/search-index.js
+++ b/search-index.js
@@ -14,7 +14,7 @@ var searchIndex = JSON.parse('{\
 "arrow_json":{"doc":"Transfer data between the Arrow memory format and JSON 
…","t":"CICCCCKOAAIDDDDMMALLLLLLLLLLLLMAKLMMLLLLLLLLLFFFLLLLMAFAMLLAAOLMMMALMMLAMAAAMALLLLLLLLLLLLDLLLLLLLLLLLDLLLLLLLLMMMLLLDLLLMLMLLLMLMLLLDLLLMLLLLMMLLLLMDLLLLLLLLLLLIDLLLMLLLLLKMOLLLNNENNDLLLLLLLLFFLLLLLLFFFFFFFFFFLLLMMLLLMMFLLLLLLLDDDDLLLLLLLLMLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLLLOLLLLLLLLLLLLLLLLMMMMLLLLLLLLLLLLLRDRLLLMLLLLLMLLLDLLLMLMLLLMLMFLLLDNENNNNNNENNNNNNNNNNDDENNNNLLLLLMLLLLLLLLLLLLLMLL
 [...]
 
"arrow_json_integration_test":{"doc":"","t":"DNNENMFLLLLLLFLLLLLLLLLLLLLLLLMLLLLMFFMLLLLLLLLLLFLMLL","n":["Args","ArrowToJson","JsonToArrow","Mode","Validate","arrow","arrow_to_json","augment_args","augment_args_for_update","borrow","borrow","borrow_mut","borrow_mut","canonicalize_schema","cast","cast","clone","clone_into","command","command_for_update","fmt","fmt","from","from","from_arg_matches","from_arg_matches_mut","from_cast","from_cast","from_ref","group_id","integration","into","
 [...]
 "arrow_ord":{"doc":"Arrow ordering 
kernels","t":"AAAAAFFFFFFFFFFFOOFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOFOOOOOOFFFGFFOFFFFFDLLLLLFLLLLLLFFLLLLLFFFFDGDDLLLLLLLLLFLLLLLLMLMLLLLLLLLLLLLLLLFFLMMLFFFFFFFFFFFFFFFFFFFLLLLLLLLLLLLM","n":["comparison","ord","partition","rank","sort","cmp_dict","cmp_dict_binary","cmp_dict_binary_array","cmp_dict_bool","cmp_dict_boolean_array","cmp_dict_primitive","cmp_dict_string_array","cmp_dict_utf8","cmp_primitive
 [...]
-"arrow_row":{"doc":"A comparable row-oriented representation of a collection 
…","t":"ENNNNENNDDDDDDDDNNNNLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLLLLMMMMMLLLMMMFOOALFLMLLLLLLLLLMMALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLALLLLLLLLLLLLLLALLLLLLLFLMMLLLLLLMLLLFMLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMAFFFFFFOFFFSQIIKFFFFFFKFOOFKFDDDDDLLLLLLLLLLLMLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLMLMMLMLLMLLLLLLLLLLLLLLLLLLLMMMFFFFFRRRRFFFFFFF","n":["Codec","Dictionary","Dictionary","DictionaryValues"
 [...]
+"arrow_row":{"doc":"A comparable row-oriented representation of a collection 
…","t":"ENNNNENNDDDDDDDDNNNNLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLLLLMMMMMLLLMMMFOOALFLMLLLLLLLLLMMALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLALLLLLLLLLLLLLLALLLLLLLFLMMLLLLLLMLLLFMLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMAFFFFFFOFFFSQIIKFFFFFFKFOOFKFDDDDDLLLLLLLLLLLMLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLMLMMLMLLLMLLLLLLLLLLLLLLLLLLLMMMFFFFFRRRRFFFFFFF","n":["Codec","Dictionary","Dictionary","DictionaryValues
 [...]
 "arrow_schema":{"doc":"Arrow logical 
types","t":"ENNNNNNRRRRRENNNNNNNNNNNDGDNNNNNNNNNNENNNNNNNNNNNNNNNNNNNDDNGNDNNNNENNNNNNDENNLLLLLMALMMMLLAAAAMMLLLLMMMLMMLALLLLNNRRRRRENNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNENNNNNNENNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLENNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLDDDLLLLLLMMLMMLLLALMLLMLLFLLLLMMMLMLMMFLLLLLLLLLLLLLLLLLSDSSLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLDGLLLLLLLLMLLMLMLLLLLLLLLLLMLMLLLLLLLLMLLLLLLLL
 [...]
 "arrow_select":{"doc":"Arrow selection 
kernels","t":"AAAAAAAFFFNRGDDDDNNENNDNLLLLLLLLLLLLLFLLLLLLLMMMLMMLLFLMMFFFFFFFFFLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLFMLMMMMLLLLLLLLLLLLLLLLLLDMLLLLLFFFFLLMMOLLLFDLLLMLLLLLLLFFFFFFFFFFFFFFFFLLLLFF","n":["concat","filter","interleave","nullif","take","window","zip","binary_capacity","concat","concat_batches","All","FILTER_SLICES_SELECTIVITY_THRESHOLD","Filter","FilterBuilder","FilterBytes","FilterPredicate","IndexIterator","IndexIterator","Indices","Ite
 [...]
 
"arrow_stream_to_file":{"doc":"","t":"F","n":["main"],"q":[[0,"arrow_stream_to_file"]],"d":[""],"i":[0],"f":[[[],1]],"c":[],"p":[[6,"Result"]]},\
diff --git a/src/arrow_row/interner.rs.html b/src/arrow_row/interner.rs.html
index b776fd01e5..2734f41bff 100644
--- a/src/arrow_row/interner.rs.html
+++ b/src/arrow_row/interner.rs.html
@@ -428,6 +428,99 @@
 <a href="#428" id="428">428</a>
 <a href="#429" id="429">429</a>
 <a href="#430" id="430">430</a>
+<a href="#431" id="431">431</a>
+<a href="#432" id="432">432</a>
+<a href="#433" id="433">433</a>
+<a href="#434" id="434">434</a>
+<a href="#435" id="435">435</a>
+<a href="#436" id="436">436</a>
+<a href="#437" id="437">437</a>
+<a href="#438" id="438">438</a>
+<a href="#439" id="439">439</a>
+<a href="#440" id="440">440</a>
+<a href="#441" id="441">441</a>
+<a href="#442" id="442">442</a>
+<a href="#443" id="443">443</a>
+<a href="#444" id="444">444</a>
+<a href="#445" id="445">445</a>
+<a href="#446" id="446">446</a>
+<a href="#447" id="447">447</a>
+<a href="#448" id="448">448</a>
+<a href="#449" id="449">449</a>
+<a href="#450" id="450">450</a>
+<a href="#451" id="451">451</a>
+<a href="#452" id="452">452</a>
+<a href="#453" id="453">453</a>
+<a href="#454" id="454">454</a>
+<a href="#455" id="455">455</a>
+<a href="#456" id="456">456</a>
+<a href="#457" id="457">457</a>
+<a href="#458" id="458">458</a>
+<a href="#459" id="459">459</a>
+<a href="#460" id="460">460</a>
+<a href="#461" id="461">461</a>
+<a href="#462" id="462">462</a>
+<a href="#463" id="463">463</a>
+<a href="#464" id="464">464</a>
+<a href="#465" id="465">465</a>
+<a href="#466" id="466">466</a>
+<a href="#467" id="467">467</a>
+<a href="#468" id="468">468</a>
+<a href="#469" id="469">469</a>
+<a href="#470" id="470">470</a>
+<a href="#471" id="471">471</a>
+<a href="#472" id="472">472</a>
+<a href="#473" id="473">473</a>
+<a href="#474" id="474">474</a>
+<a href="#475" id="475">475</a>
+<a href="#476" id="476">476</a>
+<a href="#477" id="477">477</a>
+<a href="#478" id="478">478</a>
+<a href="#479" id="479">479</a>
+<a href="#480" id="480">480</a>
+<a href="#481" id="481">481</a>
+<a href="#482" id="482">482</a>
+<a href="#483" id="483">483</a>
+<a href="#484" id="484">484</a>
+<a href="#485" id="485">485</a>
+<a href="#486" id="486">486</a>
+<a href="#487" id="487">487</a>
+<a href="#488" id="488">488</a>
+<a href="#489" id="489">489</a>
+<a href="#490" id="490">490</a>
+<a href="#491" id="491">491</a>
+<a href="#492" id="492">492</a>
+<a href="#493" id="493">493</a>
+<a href="#494" id="494">494</a>
+<a href="#495" id="495">495</a>
+<a href="#496" id="496">496</a>
+<a href="#497" id="497">497</a>
+<a href="#498" id="498">498</a>
+<a href="#499" id="499">499</a>
+<a href="#500" id="500">500</a>
+<a href="#501" id="501">501</a>
+<a href="#502" id="502">502</a>
+<a href="#503" id="503">503</a>
+<a href="#504" id="504">504</a>
+<a href="#505" id="505">505</a>
+<a href="#506" id="506">506</a>
+<a href="#507" id="507">507</a>
+<a href="#508" id="508">508</a>
+<a href="#509" id="509">509</a>
+<a href="#510" id="510">510</a>
+<a href="#511" id="511">511</a>
+<a href="#512" id="512">512</a>
+<a href="#513" id="513">513</a>
+<a href="#514" id="514">514</a>
+<a href="#515" id="515">515</a>
+<a href="#516" id="516">516</a>
+<a href="#517" id="517">517</a>
+<a href="#518" id="518">518</a>
+<a href="#519" id="519">519</a>
+<a href="#520" id="520">520</a>
+<a href="#521" id="521">521</a>
+<a href="#522" id="522">522</a>
+<a href="#523" id="523">523</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the 
Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -773,8 +866,19 @@
     </span><span class="kw">fn </span>size(<span 
class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
         std::mem::size_of::&lt;<span class="self">Self</span>&gt;()
             + <span class="self">self</span>.slots.capacity() * 
std::mem::size_of::&lt;Slot&gt;()
+        <span class="comment">// and account for the size of any embedded 
buckets in the slots
+            </span>+ <span class="self">self</span>.slot_child_bucket_size()
             + <span class="self">self</span>.next.as_ref().map(|x| 
x.size()).unwrap_or_default()
     }
+
+    <span class="doccomment">/// returns the total size of any recursively 
allocated `Bucket`s
+    /// in self.slots. This does not include the size of the child Slot itself
+    </span><span class="kw">fn </span>slot_child_bucket_size(<span 
class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
+        <span class="self">self</span>.slots
+            .iter()
+            .map(|slot| slot.child.as_ref().map(|x| 
x.size()).unwrap_or_default())
+            .sum()
+    }
 }
 
 <span class="attr">#[cfg(test)]
@@ -857,5 +961,87 @@
             interner.normalized_key(interned[<span class="number">3</span>]) 
&lt; interner.normalized_key(interned[<span class="number">2</span>])
         );
     }
+
+    <span class="attr">#[test]
+    </span><span class="kw">fn </span>test_intern_sizes() {
+        <span class="kw">let </span><span class="kw-2">mut </span>interner = 
OrderPreservingInterner::default();
+
+        <span class="comment">// Intern a 1K values each 8 bytes large
+        </span><span class="kw">let </span>num_items = <span 
class="number">1000</span>;
+        <span class="kw">let </span><span class="kw-2">mut </span>values: 
Vec&lt;usize&gt; = (<span class="number">0</span>..num_items).collect();
+        values.reverse();
+
+        <span class="comment">// intern these values 1 at a time (otherwise 
the interner
+        // will sort them first);
+        </span><span class="kw">for </span>v <span class="kw">in </span>values 
{
+            interner.intern([<span 
class="prelude-val">Some</span>(v.to_be_bytes())]);
+        }
+
+        <span class="kw">let </span>reported = interner.size();
+
+        <span class="comment">// Figure out the expected size (this is a second
+        // implementation of size()) as a double check
+        </span><span class="kw">let </span>min_expected = BucketWalker::new()
+            .visit_bucket(interner.bucket.as_ref())
+            .memory_estimate()
+            <span class="comment">// hash table  size
+            </span>+ interner.lookup.capacity() *  
std::mem::size_of::&lt;Interned&gt;()
+            <span class="comment">// key/value storage
+            </span>+ interner.keys.buffer_size()
+            + interner.values.buffer_size();
+
+        <span class="macro">assert!</span>(
+            reported &gt; min_expected,
+            <span class="string">&quot;reported size {reported} not larger 
than min expected size: {min_expected}&quot;
+        </span>)
+    }
+
+    <span class="comment">// Walks over the buckets / slots counting counting 
them all
+    </span><span class="kw">struct </span>BucketWalker {
+        num_buckets: usize,
+        num_slots: usize,
+    }
+
+    <span class="kw">impl </span>BucketWalker {
+        <span class="kw">fn </span>new() -&gt; <span class="self">Self </span>{
+            <span class="self">Self </span>{
+                num_buckets: <span class="number">0</span>,
+                num_slots: <span class="number">0</span>,
+            }
+        }
+
+        <span class="comment">// recursively visit the bucket and any 
slots/buckets contained
+        </span><span class="kw">fn </span>visit_bucket(<span class="kw-2">mut 
</span><span class="self">self</span>, bucket: <span 
class="kw-2">&amp;</span>Bucket) -&gt; <span class="self">Self </span>{
+            <span class="self">self</span>.num_buckets += <span 
class="number">1</span>;
+            <span class="kw">let </span>acc = bucket
+                .slots
+                .iter()
+                .fold(<span class="self">self</span>, |acc, slot| 
acc.visit_slot(slot));
+
+            <span class="kw">if let </span><span 
class="prelude-val">Some</span>(next) = bucket.next.as_ref() {
+                acc.visit_bucket(next.as_ref())
+            } <span class="kw">else </span>{
+                acc
+            }
+        }
+
+        <span class="comment">// recursively visit slot and any slots/buckets
+        </span><span class="kw">fn </span>visit_slot(<span class="kw-2">mut 
</span><span class="self">self</span>, slot: <span 
class="kw-2">&amp;</span>Slot) -&gt; <span class="self">Self </span>{
+            <span class="self">self</span>.num_slots += <span 
class="number">1</span>;
+            <span class="kw">if let </span><span 
class="prelude-val">Some</span>(child) = slot.child.as_ref() {
+                <span class="self">self</span>.visit_bucket(child.as_ref())
+            } <span class="kw">else </span>{
+                <span class="self">self
+            </span>}
+        }
+
+        <span class="comment">// estimate how much memory is used just for 
Buckets / Slots
+        // (an underestimate of the total memory used for the
+        // interner as it doesn&#39;t contain any actual values)
+        </span><span class="kw">fn </span>memory_estimate(<span 
class="self">self</span>) -&gt; usize {
+            <span class="self">self</span>.num_buckets * 
std::mem::size_of::&lt;Bucket&gt;()
+                + <span class="self">self</span>.num_slots * 
std::mem::size_of::&lt;Slot&gt;()
+        }
+    }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file

Reply via email to