added the heapless crate and added new docs

This commit is contained in:
Zenn 2023-08-19 19:14:32 +02:00
parent a33a57bd49
commit ba5662a17e
230 changed files with 48215 additions and 40 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,867 @@
<!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="Source of the Rust file `/home/zenn/.cargo/registry/src/index.crates.io-6f17d22bba15001f/heapless-0.7.16/src/histbuf.rs`."><title>histbuf.rs - source</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/woff2" crossorigin href="../../static.files/FiraSans-Regular-018c141bf0843ffd.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/FiraSans-Medium-8f9a781e4970d388.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2"><link rel="stylesheet" href="../../static.files/normalize-76eba96aa4d2e634.css"><link rel="stylesheet" href="../../static.files/rustdoc-cb6f1f67f1bcd037.css" id="mainThemeStyle"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="heapless" data-themes="" data-resource-suffix="" data-rustdoc-version="1.73.0-nightly (500647fd8 2023-07-27)" data-channel="nightly" data-search-js="search-6dfdfced5eff6596.js" data-settings-js="settings-de11bff964e9d4e5.js" data-settings-css="settings-8c76f75bfb6bd192.css" data-theme-light-css="light-6d2c9675f3d09c26.css" data-theme-dark-css="dark-45ceb8f2e522f4d1.css" data-theme-ayu-css="ayu-fd19013d6ce078bf.css" ><script src="../../static.files/storage-db41da1a38ea3cb8.js"></script><script defer src="../../static.files/src-script-3280b574d94e47b4.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-0795b7d26be81095.js"></script><noscript><link rel="stylesheet" media="(prefers-color-scheme:light)" href="../../static.files/light-6d2c9675f3d09c26.css"><link rel="stylesheet" media="(prefers-color-scheme:dark)" href="../../static.files/dark-45ceb8f2e522f4d1.css"><link rel="stylesheet" href="../../static.files/noscript-cffde32267a19fd6.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-16x16-8b506e7a72182f1c.png"><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-422f7d1d52889060.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-2c020d218678b618.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"></nav><main><nav class="sub"><a class="sub-logo-container" href="../../heapless/index.html"><img class="rust-logo" src="../../static.files/rust-logo-151179464ae7ed46.svg" alt="logo"></a><form class="search-form"><span></span><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><a href="../../help.html">?</a></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../static.files/wheel-7b819b6101059cd0.svg"></a></div></form></nav><section id="main-content" class="content"><div class="example-wrap"><div data-nosnippet><pre class="src-line-numbers"><a href="#1" id="1">1</a>
<a href="#2" id="2">2</a>
<a href="#3" id="3">3</a>
<a href="#4" id="4">4</a>
<a href="#5" id="5">5</a>
<a href="#6" id="6">6</a>
<a href="#7" id="7">7</a>
<a href="#8" id="8">8</a>
<a href="#9" id="9">9</a>
<a href="#10" id="10">10</a>
<a href="#11" id="11">11</a>
<a href="#12" id="12">12</a>
<a href="#13" id="13">13</a>
<a href="#14" id="14">14</a>
<a href="#15" id="15">15</a>
<a href="#16" id="16">16</a>
<a href="#17" id="17">17</a>
<a href="#18" id="18">18</a>
<a href="#19" id="19">19</a>
<a href="#20" id="20">20</a>
<a href="#21" id="21">21</a>
<a href="#22" id="22">22</a>
<a href="#23" id="23">23</a>
<a href="#24" id="24">24</a>
<a href="#25" id="25">25</a>
<a href="#26" id="26">26</a>
<a href="#27" id="27">27</a>
<a href="#28" id="28">28</a>
<a href="#29" id="29">29</a>
<a href="#30" id="30">30</a>
<a href="#31" id="31">31</a>
<a href="#32" id="32">32</a>
<a href="#33" id="33">33</a>
<a href="#34" id="34">34</a>
<a href="#35" id="35">35</a>
<a href="#36" id="36">36</a>
<a href="#37" id="37">37</a>
<a href="#38" id="38">38</a>
<a href="#39" id="39">39</a>
<a href="#40" id="40">40</a>
<a href="#41" id="41">41</a>
<a href="#42" id="42">42</a>
<a href="#43" id="43">43</a>
<a href="#44" id="44">44</a>
<a href="#45" id="45">45</a>
<a href="#46" id="46">46</a>
<a href="#47" id="47">47</a>
<a href="#48" id="48">48</a>
<a href="#49" id="49">49</a>
<a href="#50" id="50">50</a>
<a href="#51" id="51">51</a>
<a href="#52" id="52">52</a>
<a href="#53" id="53">53</a>
<a href="#54" id="54">54</a>
<a href="#55" id="55">55</a>
<a href="#56" id="56">56</a>
<a href="#57" id="57">57</a>
<a href="#58" id="58">58</a>
<a href="#59" id="59">59</a>
<a href="#60" id="60">60</a>
<a href="#61" id="61">61</a>
<a href="#62" id="62">62</a>
<a href="#63" id="63">63</a>
<a href="#64" id="64">64</a>
<a href="#65" id="65">65</a>
<a href="#66" id="66">66</a>
<a href="#67" id="67">67</a>
<a href="#68" id="68">68</a>
<a href="#69" id="69">69</a>
<a href="#70" id="70">70</a>
<a href="#71" id="71">71</a>
<a href="#72" id="72">72</a>
<a href="#73" id="73">73</a>
<a href="#74" id="74">74</a>
<a href="#75" id="75">75</a>
<a href="#76" id="76">76</a>
<a href="#77" id="77">77</a>
<a href="#78" id="78">78</a>
<a href="#79" id="79">79</a>
<a href="#80" id="80">80</a>
<a href="#81" id="81">81</a>
<a href="#82" id="82">82</a>
<a href="#83" id="83">83</a>
<a href="#84" id="84">84</a>
<a href="#85" id="85">85</a>
<a href="#86" id="86">86</a>
<a href="#87" id="87">87</a>
<a href="#88" id="88">88</a>
<a href="#89" id="89">89</a>
<a href="#90" id="90">90</a>
<a href="#91" id="91">91</a>
<a href="#92" id="92">92</a>
<a href="#93" id="93">93</a>
<a href="#94" id="94">94</a>
<a href="#95" id="95">95</a>
<a href="#96" id="96">96</a>
<a href="#97" id="97">97</a>
<a href="#98" id="98">98</a>
<a href="#99" id="99">99</a>
<a href="#100" id="100">100</a>
<a href="#101" id="101">101</a>
<a href="#102" id="102">102</a>
<a href="#103" id="103">103</a>
<a href="#104" id="104">104</a>
<a href="#105" id="105">105</a>
<a href="#106" id="106">106</a>
<a href="#107" id="107">107</a>
<a href="#108" id="108">108</a>
<a href="#109" id="109">109</a>
<a href="#110" id="110">110</a>
<a href="#111" id="111">111</a>
<a href="#112" id="112">112</a>
<a href="#113" id="113">113</a>
<a href="#114" id="114">114</a>
<a href="#115" id="115">115</a>
<a href="#116" id="116">116</a>
<a href="#117" id="117">117</a>
<a href="#118" id="118">118</a>
<a href="#119" id="119">119</a>
<a href="#120" id="120">120</a>
<a href="#121" id="121">121</a>
<a href="#122" id="122">122</a>
<a href="#123" id="123">123</a>
<a href="#124" id="124">124</a>
<a href="#125" id="125">125</a>
<a href="#126" id="126">126</a>
<a href="#127" id="127">127</a>
<a href="#128" id="128">128</a>
<a href="#129" id="129">129</a>
<a href="#130" id="130">130</a>
<a href="#131" id="131">131</a>
<a href="#132" id="132">132</a>
<a href="#133" id="133">133</a>
<a href="#134" id="134">134</a>
<a href="#135" id="135">135</a>
<a href="#136" id="136">136</a>
<a href="#137" id="137">137</a>
<a href="#138" id="138">138</a>
<a href="#139" id="139">139</a>
<a href="#140" id="140">140</a>
<a href="#141" id="141">141</a>
<a href="#142" id="142">142</a>
<a href="#143" id="143">143</a>
<a href="#144" id="144">144</a>
<a href="#145" id="145">145</a>
<a href="#146" id="146">146</a>
<a href="#147" id="147">147</a>
<a href="#148" id="148">148</a>
<a href="#149" id="149">149</a>
<a href="#150" id="150">150</a>
<a href="#151" id="151">151</a>
<a href="#152" id="152">152</a>
<a href="#153" id="153">153</a>
<a href="#154" id="154">154</a>
<a href="#155" id="155">155</a>
<a href="#156" id="156">156</a>
<a href="#157" id="157">157</a>
<a href="#158" id="158">158</a>
<a href="#159" id="159">159</a>
<a href="#160" id="160">160</a>
<a href="#161" id="161">161</a>
<a href="#162" id="162">162</a>
<a href="#163" id="163">163</a>
<a href="#164" id="164">164</a>
<a href="#165" id="165">165</a>
<a href="#166" id="166">166</a>
<a href="#167" id="167">167</a>
<a href="#168" id="168">168</a>
<a href="#169" id="169">169</a>
<a href="#170" id="170">170</a>
<a href="#171" id="171">171</a>
<a href="#172" id="172">172</a>
<a href="#173" id="173">173</a>
<a href="#174" id="174">174</a>
<a href="#175" id="175">175</a>
<a href="#176" id="176">176</a>
<a href="#177" id="177">177</a>
<a href="#178" id="178">178</a>
<a href="#179" id="179">179</a>
<a href="#180" id="180">180</a>
<a href="#181" id="181">181</a>
<a href="#182" id="182">182</a>
<a href="#183" id="183">183</a>
<a href="#184" id="184">184</a>
<a href="#185" id="185">185</a>
<a href="#186" id="186">186</a>
<a href="#187" id="187">187</a>
<a href="#188" id="188">188</a>
<a href="#189" id="189">189</a>
<a href="#190" id="190">190</a>
<a href="#191" id="191">191</a>
<a href="#192" id="192">192</a>
<a href="#193" id="193">193</a>
<a href="#194" id="194">194</a>
<a href="#195" id="195">195</a>
<a href="#196" id="196">196</a>
<a href="#197" id="197">197</a>
<a href="#198" id="198">198</a>
<a href="#199" id="199">199</a>
<a href="#200" id="200">200</a>
<a href="#201" id="201">201</a>
<a href="#202" id="202">202</a>
<a href="#203" id="203">203</a>
<a href="#204" id="204">204</a>
<a href="#205" id="205">205</a>
<a href="#206" id="206">206</a>
<a href="#207" id="207">207</a>
<a href="#208" id="208">208</a>
<a href="#209" id="209">209</a>
<a href="#210" id="210">210</a>
<a href="#211" id="211">211</a>
<a href="#212" id="212">212</a>
<a href="#213" id="213">213</a>
<a href="#214" id="214">214</a>
<a href="#215" id="215">215</a>
<a href="#216" id="216">216</a>
<a href="#217" id="217">217</a>
<a href="#218" id="218">218</a>
<a href="#219" id="219">219</a>
<a href="#220" id="220">220</a>
<a href="#221" id="221">221</a>
<a href="#222" id="222">222</a>
<a href="#223" id="223">223</a>
<a href="#224" id="224">224</a>
<a href="#225" id="225">225</a>
<a href="#226" id="226">226</a>
<a href="#227" id="227">227</a>
<a href="#228" id="228">228</a>
<a href="#229" id="229">229</a>
<a href="#230" id="230">230</a>
<a href="#231" id="231">231</a>
<a href="#232" id="232">232</a>
<a href="#233" id="233">233</a>
<a href="#234" id="234">234</a>
<a href="#235" id="235">235</a>
<a href="#236" id="236">236</a>
<a href="#237" id="237">237</a>
<a href="#238" id="238">238</a>
<a href="#239" id="239">239</a>
<a href="#240" id="240">240</a>
<a href="#241" id="241">241</a>
<a href="#242" id="242">242</a>
<a href="#243" id="243">243</a>
<a href="#244" id="244">244</a>
<a href="#245" id="245">245</a>
<a href="#246" id="246">246</a>
<a href="#247" id="247">247</a>
<a href="#248" id="248">248</a>
<a href="#249" id="249">249</a>
<a href="#250" id="250">250</a>
<a href="#251" id="251">251</a>
<a href="#252" id="252">252</a>
<a href="#253" id="253">253</a>
<a href="#254" id="254">254</a>
<a href="#255" id="255">255</a>
<a href="#256" id="256">256</a>
<a href="#257" id="257">257</a>
<a href="#258" id="258">258</a>
<a href="#259" id="259">259</a>
<a href="#260" id="260">260</a>
<a href="#261" id="261">261</a>
<a href="#262" id="262">262</a>
<a href="#263" id="263">263</a>
<a href="#264" id="264">264</a>
<a href="#265" id="265">265</a>
<a href="#266" id="266">266</a>
<a href="#267" id="267">267</a>
<a href="#268" id="268">268</a>
<a href="#269" id="269">269</a>
<a href="#270" id="270">270</a>
<a href="#271" id="271">271</a>
<a href="#272" id="272">272</a>
<a href="#273" id="273">273</a>
<a href="#274" id="274">274</a>
<a href="#275" id="275">275</a>
<a href="#276" id="276">276</a>
<a href="#277" id="277">277</a>
<a href="#278" id="278">278</a>
<a href="#279" id="279">279</a>
<a href="#280" id="280">280</a>
<a href="#281" id="281">281</a>
<a href="#282" id="282">282</a>
<a href="#283" id="283">283</a>
<a href="#284" id="284">284</a>
<a href="#285" id="285">285</a>
<a href="#286" id="286">286</a>
<a href="#287" id="287">287</a>
<a href="#288" id="288">288</a>
<a href="#289" id="289">289</a>
<a href="#290" id="290">290</a>
<a href="#291" id="291">291</a>
<a href="#292" id="292">292</a>
<a href="#293" id="293">293</a>
<a href="#294" id="294">294</a>
<a href="#295" id="295">295</a>
<a href="#296" id="296">296</a>
<a href="#297" id="297">297</a>
<a href="#298" id="298">298</a>
<a href="#299" id="299">299</a>
<a href="#300" id="300">300</a>
<a href="#301" id="301">301</a>
<a href="#302" id="302">302</a>
<a href="#303" id="303">303</a>
<a href="#304" id="304">304</a>
<a href="#305" id="305">305</a>
<a href="#306" id="306">306</a>
<a href="#307" id="307">307</a>
<a href="#308" id="308">308</a>
<a href="#309" id="309">309</a>
<a href="#310" id="310">310</a>
<a href="#311" id="311">311</a>
<a href="#312" id="312">312</a>
<a href="#313" id="313">313</a>
<a href="#314" id="314">314</a>
<a href="#315" id="315">315</a>
<a href="#316" id="316">316</a>
<a href="#317" id="317">317</a>
<a href="#318" id="318">318</a>
<a href="#319" id="319">319</a>
<a href="#320" id="320">320</a>
<a href="#321" id="321">321</a>
<a href="#322" id="322">322</a>
<a href="#323" id="323">323</a>
<a href="#324" id="324">324</a>
<a href="#325" id="325">325</a>
<a href="#326" id="326">326</a>
<a href="#327" id="327">327</a>
<a href="#328" id="328">328</a>
<a href="#329" id="329">329</a>
<a href="#330" id="330">330</a>
<a href="#331" id="331">331</a>
<a href="#332" id="332">332</a>
<a href="#333" id="333">333</a>
<a href="#334" id="334">334</a>
<a href="#335" id="335">335</a>
<a href="#336" id="336">336</a>
<a href="#337" id="337">337</a>
<a href="#338" id="338">338</a>
<a href="#339" id="339">339</a>
<a href="#340" id="340">340</a>
<a href="#341" id="341">341</a>
<a href="#342" id="342">342</a>
<a href="#343" id="343">343</a>
<a href="#344" id="344">344</a>
<a href="#345" id="345">345</a>
<a href="#346" id="346">346</a>
<a href="#347" id="347">347</a>
<a href="#348" id="348">348</a>
<a href="#349" id="349">349</a>
<a href="#350" id="350">350</a>
<a href="#351" id="351">351</a>
<a href="#352" id="352">352</a>
<a href="#353" id="353">353</a>
<a href="#354" id="354">354</a>
<a href="#355" id="355">355</a>
<a href="#356" id="356">356</a>
<a href="#357" id="357">357</a>
<a href="#358" id="358">358</a>
<a href="#359" id="359">359</a>
<a href="#360" id="360">360</a>
<a href="#361" id="361">361</a>
<a href="#362" id="362">362</a>
<a href="#363" id="363">363</a>
<a href="#364" id="364">364</a>
<a href="#365" id="365">365</a>
<a href="#366" id="366">366</a>
<a href="#367" id="367">367</a>
<a href="#368" id="368">368</a>
<a href="#369" id="369">369</a>
<a href="#370" id="370">370</a>
<a href="#371" id="371">371</a>
<a href="#372" id="372">372</a>
<a href="#373" id="373">373</a>
<a href="#374" id="374">374</a>
<a href="#375" id="375">375</a>
<a href="#376" id="376">376</a>
<a href="#377" id="377">377</a>
<a href="#378" id="378">378</a>
<a href="#379" id="379">379</a>
<a href="#380" id="380">380</a>
<a href="#381" id="381">381</a>
<a href="#382" id="382">382</a>
<a href="#383" id="383">383</a>
<a href="#384" id="384">384</a>
<a href="#385" id="385">385</a>
<a href="#386" id="386">386</a>
<a href="#387" id="387">387</a>
<a href="#388" id="388">388</a>
<a href="#389" id="389">389</a>
<a href="#390" id="390">390</a>
<a href="#391" id="391">391</a>
<a href="#392" id="392">392</a>
<a href="#393" id="393">393</a>
<a href="#394" id="394">394</a>
<a href="#395" id="395">395</a>
<a href="#396" id="396">396</a>
<a href="#397" id="397">397</a>
<a href="#398" id="398">398</a>
<a href="#399" id="399">399</a>
<a href="#400" id="400">400</a>
<a href="#401" id="401">401</a>
<a href="#402" id="402">402</a>
<a href="#403" id="403">403</a>
<a href="#404" id="404">404</a>
<a href="#405" id="405">405</a>
<a href="#406" id="406">406</a>
<a href="#407" id="407">407</a>
<a href="#408" id="408">408</a>
<a href="#409" id="409">409</a>
<a href="#410" id="410">410</a>
<a href="#411" id="411">411</a>
<a href="#412" id="412">412</a>
<a href="#413" id="413">413</a>
<a href="#414" id="414">414</a>
<a href="#415" id="415">415</a>
<a href="#416" id="416">416</a>
<a href="#417" id="417">417</a>
<a href="#418" id="418">418</a>
<a href="#419" id="419">419</a>
<a href="#420" id="420">420</a>
<a href="#421" id="421">421</a>
<a href="#422" id="422">422</a>
<a href="#423" id="423">423</a>
<a href="#424" id="424">424</a>
<a href="#425" id="425">425</a>
<a href="#426" id="426">426</a>
<a href="#427" id="427">427</a>
<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>
</pre></div><pre class="rust"><code><span class="kw">use </span>core::fmt;
<span class="kw">use </span>core::mem::MaybeUninit;
<span class="kw">use </span>core::ops::Deref;
<span class="kw">use </span>core::ptr;
<span class="kw">use </span>core::slice;
<span class="doccomment">/// A &quot;history buffer&quot;, similar to a write-only ring buffer of fixed length.
///
/// This buffer keeps a fixed number of elements. On write, the oldest element
/// is overwritten. Thus, the buffer is useful to keep a history of values with
/// some desired depth, and for example calculate a rolling average.
///
/// # Examples
/// ```
/// use heapless::HistoryBuffer;
///
/// // Initialize a new buffer with 8 elements.
/// let mut buf = HistoryBuffer::&lt;_, 8&gt;::new();
///
/// // Starts with no data
/// assert_eq!(buf.recent(), None);
///
/// buf.write(3);
/// buf.write(5);
/// buf.extend(&amp;[4, 4]);
///
/// // The most recent written element is a four.
/// assert_eq!(buf.recent(), Some(&amp;4));
///
/// // To access all elements in an unspecified order, use `as_slice()`.
/// for el in buf.as_slice() { println!(&quot;{:?}&quot;, el); }
///
/// // Now we can prepare an average of all values, which comes out to 4.
/// let avg = buf.as_slice().iter().sum::&lt;usize&gt;() / buf.len();
/// assert_eq!(avg, 4);
/// ```
</span><span class="kw">pub struct </span>HistoryBuffer&lt;T, <span class="kw">const </span>N: usize&gt; {
data: [MaybeUninit&lt;T&gt;; N],
write_at: usize,
filled: bool,
}
<span class="kw">impl</span>&lt;T, <span class="kw">const </span>N: usize&gt; HistoryBuffer&lt;T, N&gt; {
<span class="kw">const </span>INIT: MaybeUninit&lt;T&gt; = MaybeUninit::uninit();
<span class="doccomment">/// Constructs a new history buffer.
///
/// The construction of a `HistoryBuffer` works in `const` contexts.
///
/// # Examples
///
/// ```
/// use heapless::HistoryBuffer;
///
/// // Allocate a 16-element buffer on the stack
/// let x: HistoryBuffer&lt;u8, 16&gt; = HistoryBuffer::new();
/// assert_eq!(x.len(), 0);
/// ```
</span><span class="attr">#[inline]
</span><span class="kw">pub const fn </span>new() -&gt; <span class="self">Self </span>{
<span class="comment">// Const assert
</span><span class="kw">crate</span>::sealed::greater_than_0::&lt;N&gt;();
<span class="self">Self </span>{
data: [<span class="self">Self</span>::INIT; N],
write_at: <span class="number">0</span>,
filled: <span class="bool-val">false</span>,
}
}
<span class="doccomment">/// Clears the buffer, replacing every element with the default value of
/// type `T`.
</span><span class="kw">pub fn </span>clear(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<span class="kw-2">*</span><span class="self">self </span>= <span class="self">Self</span>::new();
}
}
<span class="kw">impl</span>&lt;T, <span class="kw">const </span>N: usize&gt; HistoryBuffer&lt;T, N&gt;
<span class="kw">where
</span>T: Copy + Clone,
{
<span class="doccomment">/// Constructs a new history buffer, where every element is the given value.
///
/// # Examples
///
/// ```
/// use heapless::HistoryBuffer;
///
/// // Allocate a 16-element buffer on the stack
/// let mut x: HistoryBuffer&lt;u8, 16&gt; = HistoryBuffer::new_with(4);
/// // All elements are four
/// assert_eq!(x.as_slice(), [4; 16]);
/// ```
</span><span class="attr">#[inline]
</span><span class="kw">pub fn </span>new_with(t: T) -&gt; <span class="self">Self </span>{
<span class="self">Self </span>{
data: [MaybeUninit::new(t); N],
write_at: <span class="number">0</span>,
filled: <span class="bool-val">true</span>,
}
}
<span class="doccomment">/// Clears the buffer, replacing every element with the given value.
</span><span class="kw">pub fn </span>clear_with(<span class="kw-2">&amp;mut </span><span class="self">self</span>, t: T) {
<span class="kw-2">*</span><span class="self">self </span>= <span class="self">Self</span>::new_with(t);
}
}
<span class="kw">impl</span>&lt;T, <span class="kw">const </span>N: usize&gt; HistoryBuffer&lt;T, N&gt; {
<span class="doccomment">/// Returns the current fill level of the buffer.
</span><span class="attr">#[inline]
</span><span class="kw">pub fn </span>len(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<span class="kw">if </span><span class="self">self</span>.filled {
N
} <span class="kw">else </span>{
<span class="self">self</span>.write_at
}
}
<span class="doccomment">/// Returns the capacity of the buffer, which is the length of the
/// underlying backing array.
</span><span class="attr">#[inline]
</span><span class="kw">pub fn </span>capacity(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
N
}
<span class="doccomment">/// Writes an element to the buffer, overwriting the oldest value.
</span><span class="kw">pub fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, t: T) {
<span class="kw">if </span><span class="self">self</span>.filled {
<span class="comment">// Drop the old before we overwrite it.
</span><span class="kw">unsafe </span>{ ptr::drop_in_place(<span class="self">self</span>.data[<span class="self">self</span>.write_at].as_mut_ptr()) }
}
<span class="self">self</span>.data[<span class="self">self</span>.write_at] = MaybeUninit::new(t);
<span class="self">self</span>.write_at += <span class="number">1</span>;
<span class="kw">if </span><span class="self">self</span>.write_at == <span class="self">self</span>.capacity() {
<span class="self">self</span>.write_at = <span class="number">0</span>;
<span class="self">self</span>.filled = <span class="bool-val">true</span>;
}
}
<span class="doccomment">/// Clones and writes all elements in a slice to the buffer.
///
/// If the slice is longer than the buffer, only the last `self.len()`
/// elements will actually be stored.
</span><span class="kw">pub fn </span>extend_from_slice(<span class="kw-2">&amp;mut </span><span class="self">self</span>, other: <span class="kw-2">&amp;</span>[T])
<span class="kw">where
</span>T: Clone,
{
<span class="kw">for </span>item <span class="kw">in </span>other {
<span class="self">self</span>.write(item.clone());
}
}
<span class="doccomment">/// Returns a reference to the most recently written value.
///
/// # Examples
///
/// ```
/// use heapless::HistoryBuffer;
///
/// let mut x: HistoryBuffer&lt;u8, 16&gt; = HistoryBuffer::new();
/// x.write(4);
/// x.write(10);
/// assert_eq!(x.recent(), Some(&amp;10));
/// ```
</span><span class="kw">pub fn </span>recent(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>T&gt; {
<span class="kw">if </span><span class="self">self</span>.write_at == <span class="number">0 </span>{
<span class="kw">if </span><span class="self">self</span>.filled {
<span class="prelude-val">Some</span>(<span class="kw">unsafe </span>{ <span class="kw-2">&amp;*</span><span class="self">self</span>.data[<span class="self">self</span>.capacity() - <span class="number">1</span>].as_ptr() })
} <span class="kw">else </span>{
<span class="prelude-val">None
</span>}
} <span class="kw">else </span>{
<span class="prelude-val">Some</span>(<span class="kw">unsafe </span>{ <span class="kw-2">&amp;*</span><span class="self">self</span>.data[<span class="self">self</span>.write_at - <span class="number">1</span>].as_ptr() })
}
}
<span class="doccomment">/// Returns the array slice backing the buffer, without keeping track
/// of the write position. Therefore, the element order is unspecified.
</span><span class="kw">pub fn </span>as_slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[T] {
<span class="kw">unsafe </span>{ slice::from_raw_parts(<span class="self">self</span>.data.as_ptr() <span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_</span>, <span class="self">self</span>.len()) }
}
<span class="doccomment">/// Returns an iterator for iterating over the buffer from oldest to newest.
///
/// # Examples
///
/// ```
/// use heapless::HistoryBuffer;
///
/// let mut buffer: HistoryBuffer&lt;u8, 6&gt; = HistoryBuffer::new();
/// buffer.extend([0, 0, 0, 1, 2, 3, 4, 5, 6]);
/// let expected = [1, 2, 3, 4, 5, 6];
/// for (x, y) in buffer.oldest_ordered().zip(expected.iter()) {
/// assert_eq!(x, y)
/// }
///
/// ```
</span><span class="kw">pub fn </span>oldest_ordered&lt;<span class="lifetime">&#39;a</span>&gt;(<span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span><span class="self">self</span>) -&gt; OldestOrdered&lt;<span class="lifetime">&#39;a</span>, T, N&gt; {
<span class="kw">if </span><span class="self">self</span>.filled {
OldestOrdered {
buf: <span class="self">self</span>,
cur: <span class="self">self</span>.write_at,
wrapped: <span class="bool-val">false</span>,
}
} <span class="kw">else </span>{
<span class="comment">// special case: act like we wrapped already to handle empty buffer.
</span>OldestOrdered {
buf: <span class="self">self</span>,
cur: <span class="number">0</span>,
wrapped: <span class="bool-val">true</span>,
}
}
}
}
<span class="kw">impl</span>&lt;T, <span class="kw">const </span>N: usize&gt; Extend&lt;T&gt; <span class="kw">for </span>HistoryBuffer&lt;T, N&gt; {
<span class="kw">fn </span>extend&lt;I&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, iter: I)
<span class="kw">where
</span>I: IntoIterator&lt;Item = T&gt;,
{
<span class="kw">for </span>item <span class="kw">in </span>iter.into_iter() {
<span class="self">self</span>.write(item);
}
}
}
<span class="kw">impl</span>&lt;<span class="lifetime">&#39;a</span>, T, <span class="kw">const </span>N: usize&gt; Extend&lt;<span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span>T&gt; <span class="kw">for </span>HistoryBuffer&lt;T, N&gt;
<span class="kw">where
</span>T: <span class="lifetime">&#39;a </span>+ Clone,
{
<span class="kw">fn </span>extend&lt;I&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, iter: I)
<span class="kw">where
</span>I: IntoIterator&lt;Item = <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span>T&gt;,
{
<span class="self">self</span>.extend(iter.into_iter().cloned())
}
}
<span class="kw">impl</span>&lt;T, <span class="kw">const </span>N: usize&gt; Drop <span class="kw">for </span>HistoryBuffer&lt;T, N&gt; {
<span class="kw">fn </span>drop(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<span class="kw">unsafe </span>{
ptr::drop_in_place(ptr::slice_from_raw_parts_mut(
<span class="self">self</span>.data.as_mut_ptr() <span class="kw">as </span><span class="kw-2">*mut </span>T,
<span class="self">self</span>.len(),
))
}
}
}
<span class="kw">impl</span>&lt;T, <span class="kw">const </span>N: usize&gt; Deref <span class="kw">for </span>HistoryBuffer&lt;T, N&gt; {
<span class="kw">type </span>Target = [T];
<span class="kw">fn </span>deref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[T] {
<span class="self">self</span>.as_slice()
}
}
<span class="kw">impl</span>&lt;T, <span class="kw">const </span>N: usize&gt; AsRef&lt;[T]&gt; <span class="kw">for </span>HistoryBuffer&lt;T, N&gt; {
<span class="attr">#[inline]
</span><span class="kw">fn </span>as_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[T] {
<span class="self">self
</span>}
}
<span class="kw">impl</span>&lt;T, <span class="kw">const </span>N: usize&gt; fmt::Debug <span class="kw">for </span>HistoryBuffer&lt;T, N&gt;
<span class="kw">where
</span>T: fmt::Debug,
{
<span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; fmt::Result {
&lt;[T] <span class="kw">as </span>fmt::Debug&gt;::fmt(<span class="self">self</span>, f)
}
}
<span class="kw">impl</span>&lt;T, <span class="kw">const </span>N: usize&gt; Default <span class="kw">for </span>HistoryBuffer&lt;T, N&gt; {
<span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<span class="self">Self</span>::new()
}
}
<span class="doccomment">/// An iterator on the underlying buffer ordered from oldest data to newest
</span><span class="attr">#[derive(Clone)]
</span><span class="kw">pub struct </span>OldestOrdered&lt;<span class="lifetime">&#39;a</span>, T, <span class="kw">const </span>N: usize&gt; {
buf: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span>HistoryBuffer&lt;T, N&gt;,
cur: usize,
wrapped: bool,
}
<span class="kw">impl</span>&lt;<span class="lifetime">&#39;a</span>, T, <span class="kw">const </span>N: usize&gt; Iterator <span class="kw">for </span>OldestOrdered&lt;<span class="lifetime">&#39;a</span>, T, N&gt; {
<span class="kw">type </span>Item = <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span>T;
<span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span>T&gt; {
<span class="kw">if </span><span class="self">self</span>.cur == <span class="self">self</span>.buf.len() &amp;&amp; <span class="self">self</span>.buf.filled {
<span class="comment">// roll-over
</span><span class="self">self</span>.cur = <span class="number">0</span>;
<span class="self">self</span>.wrapped = <span class="bool-val">true</span>;
}
<span class="kw">if </span><span class="self">self</span>.cur == <span class="self">self</span>.buf.write_at &amp;&amp; <span class="self">self</span>.wrapped {
<span class="kw">return </span><span class="prelude-val">None</span>;
}
<span class="kw">let </span>item = <span class="kw-2">&amp;</span><span class="self">self</span>.buf[<span class="self">self</span>.cur];
<span class="self">self</span>.cur += <span class="number">1</span>;
<span class="prelude-val">Some</span>(item)
}
}
<span class="attr">#[cfg(test)]
</span><span class="kw">mod </span>tests {
<span class="kw">use </span><span class="kw">crate</span>::HistoryBuffer;
<span class="kw">use </span>core::fmt::Debug;
<span class="attr">#[test]
</span><span class="kw">fn </span>new() {
<span class="kw">let </span>x: HistoryBuffer&lt;u8, <span class="number">4</span>&gt; = HistoryBuffer::new_with(<span class="number">1</span>);
<span class="macro">assert_eq!</span>(x.len(), <span class="number">4</span>);
<span class="macro">assert_eq!</span>(x.as_slice(), [<span class="number">1</span>; <span class="number">4</span>]);
<span class="macro">assert_eq!</span>(<span class="kw-2">*</span>x, [<span class="number">1</span>; <span class="number">4</span>]);
<span class="kw">let </span>x: HistoryBuffer&lt;u8, <span class="number">4</span>&gt; = HistoryBuffer::new();
<span class="macro">assert_eq!</span>(x.as_slice(), []);
}
<span class="attr">#[test]
</span><span class="kw">fn </span>write() {
<span class="kw">let </span><span class="kw-2">mut </span>x: HistoryBuffer&lt;u8, <span class="number">4</span>&gt; = HistoryBuffer::new();
x.write(<span class="number">1</span>);
x.write(<span class="number">4</span>);
<span class="macro">assert_eq!</span>(x.as_slice(), [<span class="number">1</span>, <span class="number">4</span>]);
x.write(<span class="number">5</span>);
x.write(<span class="number">6</span>);
x.write(<span class="number">10</span>);
<span class="macro">assert_eq!</span>(x.as_slice(), [<span class="number">10</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>]);
x.extend([<span class="number">11</span>, <span class="number">12</span>].iter());
<span class="macro">assert_eq!</span>(x.as_slice(), [<span class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">6</span>]);
}
<span class="attr">#[test]
</span><span class="kw">fn </span>clear() {
<span class="kw">let </span><span class="kw-2">mut </span>x: HistoryBuffer&lt;u8, <span class="number">4</span>&gt; = HistoryBuffer::new_with(<span class="number">1</span>);
x.clear();
<span class="macro">assert_eq!</span>(x.as_slice(), []);
<span class="kw">let </span><span class="kw-2">mut </span>x: HistoryBuffer&lt;u8, <span class="number">4</span>&gt; = HistoryBuffer::new();
x.clear_with(<span class="number">1</span>);
<span class="macro">assert_eq!</span>(x.as_slice(), [<span class="number">1</span>; <span class="number">4</span>]);
}
<span class="attr">#[test]
</span><span class="kw">fn </span>recent() {
<span class="kw">let </span><span class="kw-2">mut </span>x: HistoryBuffer&lt;u8, <span class="number">4</span>&gt; = HistoryBuffer::new();
<span class="macro">assert_eq!</span>(x.recent(), <span class="prelude-val">None</span>);
x.write(<span class="number">1</span>);
x.write(<span class="number">4</span>);
<span class="macro">assert_eq!</span>(x.recent(), <span class="prelude-val">Some</span>(<span class="kw-2">&amp;</span><span class="number">4</span>));
x.write(<span class="number">5</span>);
x.write(<span class="number">6</span>);
x.write(<span class="number">10</span>);
<span class="macro">assert_eq!</span>(x.recent(), <span class="prelude-val">Some</span>(<span class="kw-2">&amp;</span><span class="number">10</span>));
}
<span class="attr">#[test]
</span><span class="kw">fn </span>as_slice() {
<span class="kw">let </span><span class="kw-2">mut </span>x: HistoryBuffer&lt;u8, <span class="number">4</span>&gt; = HistoryBuffer::new();
<span class="macro">assert_eq!</span>(x.as_slice(), []);
x.extend([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>].iter());
<span class="macro">assert_eq!</span>(x.as_slice(), [<span class="number">5</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]);
}
<span class="attr">#[test]
</span><span class="kw">fn </span>ordered() {
<span class="comment">// test on an empty buffer
</span><span class="kw">let </span>buffer: HistoryBuffer&lt;u8, <span class="number">6</span>&gt; = HistoryBuffer::new();
<span class="kw">let </span><span class="kw-2">mut </span>iter = buffer.oldest_ordered();
<span class="macro">assert_eq!</span>(iter.next(), <span class="prelude-val">None</span>);
<span class="macro">assert_eq!</span>(iter.next(), <span class="prelude-val">None</span>);
<span class="comment">// test on a un-filled buffer
</span><span class="kw">let </span><span class="kw-2">mut </span>buffer: HistoryBuffer&lt;u8, <span class="number">6</span>&gt; = HistoryBuffer::new();
buffer.extend([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]);
<span class="macro">assert_eq!</span>(buffer.len(), <span class="number">3</span>);
assert_eq_iter(buffer.oldest_ordered(), <span class="kw-2">&amp;</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]);
<span class="comment">// test on a filled buffer
</span><span class="kw">let </span><span class="kw-2">mut </span>buffer: HistoryBuffer&lt;u8, <span class="number">6</span>&gt; = HistoryBuffer::new();
buffer.extend([<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>]);
<span class="macro">assert_eq!</span>(buffer.len(), <span class="number">6</span>);
assert_eq_iter(buffer.oldest_ordered(), <span class="kw-2">&amp;</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>]);
<span class="comment">// comprehensive test all cases
</span><span class="kw">for </span>n <span class="kw">in </span><span class="number">0</span>..<span class="number">50 </span>{
<span class="kw">const </span>N: usize = <span class="number">7</span>;
<span class="kw">let </span><span class="kw-2">mut </span>buffer: HistoryBuffer&lt;u8, N&gt; = HistoryBuffer::new();
buffer.extend(<span class="number">0</span>..n);
assert_eq_iter(
buffer.oldest_ordered().copied(),
n.saturating_sub(N <span class="kw">as </span>u8)..n,
);
}
}
<span class="doccomment">/// Compares two iterators item by item, making sure they stop at the same time.
</span><span class="kw">fn </span>assert_eq_iter&lt;I: Eq + Debug&gt;(
a: <span class="kw">impl </span>IntoIterator&lt;Item = I&gt;,
b: <span class="kw">impl </span>IntoIterator&lt;Item = I&gt;,
) {
<span class="kw">let </span><span class="kw-2">mut </span>a = a.into_iter();
<span class="kw">let </span><span class="kw-2">mut </span>b = b.into_iter();
<span class="kw">let </span><span class="kw-2">mut </span>i = <span class="number">0</span>;
<span class="kw">loop </span>{
<span class="kw">let </span>a_item = a.next();
<span class="kw">let </span>b_item = b.next();
<span class="macro">assert_eq!</span>(a_item, b_item, <span class="string">&quot;{}&quot;</span>, i);
i += <span class="number">1</span>;
<span class="kw">if </span>b_item.is_none() {
<span class="kw">break</span>;
}
}
}
}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,239 @@
<!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="Source of the Rust file `/home/zenn/.cargo/registry/src/index.crates.io-6f17d22bba15001f/heapless-0.7.16/src/lib.rs`."><title>lib.rs - source</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/woff2" crossorigin href="../../static.files/FiraSans-Regular-018c141bf0843ffd.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/FiraSans-Medium-8f9a781e4970d388.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2"><link rel="stylesheet" href="../../static.files/normalize-76eba96aa4d2e634.css"><link rel="stylesheet" href="../../static.files/rustdoc-cb6f1f67f1bcd037.css" id="mainThemeStyle"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="heapless" data-themes="" data-resource-suffix="" data-rustdoc-version="1.73.0-nightly (500647fd8 2023-07-27)" data-channel="nightly" data-search-js="search-6dfdfced5eff6596.js" data-settings-js="settings-de11bff964e9d4e5.js" data-settings-css="settings-8c76f75bfb6bd192.css" data-theme-light-css="light-6d2c9675f3d09c26.css" data-theme-dark-css="dark-45ceb8f2e522f4d1.css" data-theme-ayu-css="ayu-fd19013d6ce078bf.css" ><script src="../../static.files/storage-db41da1a38ea3cb8.js"></script><script defer src="../../static.files/src-script-3280b574d94e47b4.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-0795b7d26be81095.js"></script><noscript><link rel="stylesheet" media="(prefers-color-scheme:light)" href="../../static.files/light-6d2c9675f3d09c26.css"><link rel="stylesheet" media="(prefers-color-scheme:dark)" href="../../static.files/dark-45ceb8f2e522f4d1.css"><link rel="stylesheet" href="../../static.files/noscript-cffde32267a19fd6.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-16x16-8b506e7a72182f1c.png"><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-422f7d1d52889060.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-2c020d218678b618.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"></nav><main><nav class="sub"><a class="sub-logo-container" href="../../heapless/index.html"><img class="rust-logo" src="../../static.files/rust-logo-151179464ae7ed46.svg" alt="logo"></a><form class="search-form"><span></span><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><a href="../../help.html">?</a></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../static.files/wheel-7b819b6101059cd0.svg"></a></div></form></nav><section id="main-content" class="content"><div class="example-wrap"><div data-nosnippet><pre class="src-line-numbers"><a href="#1" id="1">1</a>
<a href="#2" id="2">2</a>
<a href="#3" id="3">3</a>
<a href="#4" id="4">4</a>
<a href="#5" id="5">5</a>
<a href="#6" id="6">6</a>
<a href="#7" id="7">7</a>
<a href="#8" id="8">8</a>
<a href="#9" id="9">9</a>
<a href="#10" id="10">10</a>
<a href="#11" id="11">11</a>
<a href="#12" id="12">12</a>
<a href="#13" id="13">13</a>
<a href="#14" id="14">14</a>
<a href="#15" id="15">15</a>
<a href="#16" id="16">16</a>
<a href="#17" id="17">17</a>
<a href="#18" id="18">18</a>
<a href="#19" id="19">19</a>
<a href="#20" id="20">20</a>
<a href="#21" id="21">21</a>
<a href="#22" id="22">22</a>
<a href="#23" id="23">23</a>
<a href="#24" id="24">24</a>
<a href="#25" id="25">25</a>
<a href="#26" id="26">26</a>
<a href="#27" id="27">27</a>
<a href="#28" id="28">28</a>
<a href="#29" id="29">29</a>
<a href="#30" id="30">30</a>
<a href="#31" id="31">31</a>
<a href="#32" id="32">32</a>
<a href="#33" id="33">33</a>
<a href="#34" id="34">34</a>
<a href="#35" id="35">35</a>
<a href="#36" id="36">36</a>
<a href="#37" id="37">37</a>
<a href="#38" id="38">38</a>
<a href="#39" id="39">39</a>
<a href="#40" id="40">40</a>
<a href="#41" id="41">41</a>
<a href="#42" id="42">42</a>
<a href="#43" id="43">43</a>
<a href="#44" id="44">44</a>
<a href="#45" id="45">45</a>
<a href="#46" id="46">46</a>
<a href="#47" id="47">47</a>
<a href="#48" id="48">48</a>
<a href="#49" id="49">49</a>
<a href="#50" id="50">50</a>
<a href="#51" id="51">51</a>
<a href="#52" id="52">52</a>
<a href="#53" id="53">53</a>
<a href="#54" id="54">54</a>
<a href="#55" id="55">55</a>
<a href="#56" id="56">56</a>
<a href="#57" id="57">57</a>
<a href="#58" id="58">58</a>
<a href="#59" id="59">59</a>
<a href="#60" id="60">60</a>
<a href="#61" id="61">61</a>
<a href="#62" id="62">62</a>
<a href="#63" id="63">63</a>
<a href="#64" id="64">64</a>
<a href="#65" id="65">65</a>
<a href="#66" id="66">66</a>
<a href="#67" id="67">67</a>
<a href="#68" id="68">68</a>
<a href="#69" id="69">69</a>
<a href="#70" id="70">70</a>
<a href="#71" id="71">71</a>
<a href="#72" id="72">72</a>
<a href="#73" id="73">73</a>
<a href="#74" id="74">74</a>
<a href="#75" id="75">75</a>
<a href="#76" id="76">76</a>
<a href="#77" id="77">77</a>
<a href="#78" id="78">78</a>
<a href="#79" id="79">79</a>
<a href="#80" id="80">80</a>
<a href="#81" id="81">81</a>
<a href="#82" id="82">82</a>
<a href="#83" id="83">83</a>
<a href="#84" id="84">84</a>
<a href="#85" id="85">85</a>
<a href="#86" id="86">86</a>
<a href="#87" id="87">87</a>
<a href="#88" id="88">88</a>
<a href="#89" id="89">89</a>
<a href="#90" id="90">90</a>
<a href="#91" id="91">91</a>
<a href="#92" id="92">92</a>
<a href="#93" id="93">93</a>
<a href="#94" id="94">94</a>
<a href="#95" id="95">95</a>
<a href="#96" id="96">96</a>
<a href="#97" id="97">97</a>
<a href="#98" id="98">98</a>
<a href="#99" id="99">99</a>
<a href="#100" id="100">100</a>
<a href="#101" id="101">101</a>
<a href="#102" id="102">102</a>
<a href="#103" id="103">103</a>
<a href="#104" id="104">104</a>
<a href="#105" id="105">105</a>
<a href="#106" id="106">106</a>
<a href="#107" id="107">107</a>
<a href="#108" id="108">108</a>
<a href="#109" id="109">109</a>
<a href="#110" id="110">110</a>
<a href="#111" id="111">111</a>
<a href="#112" id="112">112</a>
<a href="#113" id="113">113</a>
<a href="#114" id="114">114</a>
<a href="#115" id="115">115</a>
<a href="#116" id="116">116</a>
<a href="#117" id="117">117</a>
<a href="#118" id="118">118</a>
<a href="#119" id="119">119</a>
</pre></div><pre class="rust"><code><span class="doccomment">//! `static` friendly data structures that don&#39;t require dynamic memory allocation
//!
//! The core principle behind `heapless` is that its data structures are backed by a *static* memory
//! allocation. For example, you can think of `heapless::Vec` as an alternative version of
//! `std::Vec` with fixed capacity and that can&#39;t be re-allocated on the fly (e.g. via `push`).
//!
//! All `heapless` data structures store their memory allocation *inline* and specify their capacity
//! via their type parameter `N`. This means that you can instantiate a `heapless` data structure on
//! the stack, in a `static` variable, or even in the heap.
//!
//! ```
//! use heapless::Vec; // fixed capacity `std::Vec`
//!
//! // on the stack
//! let mut xs: Vec&lt;u8, 8&gt; = Vec::new(); // can hold up to 8 elements
//! xs.push(42).unwrap();
//! assert_eq!(xs.pop(), Some(42));
//!
//! // in a `static` variable
//! static mut XS: Vec&lt;u8, 8&gt; = Vec::new();
//!
//! let xs = unsafe { &amp;mut XS };
//!
//! xs.push(42);
//! assert_eq!(xs.pop(), Some(42));
//!
//! // in the heap (though kind of pointless because no reallocation)
//! let mut ys: Box&lt;Vec&lt;u8, 8&gt;&gt; = Box::new(Vec::new());
//! ys.push(42).unwrap();
//! assert_eq!(ys.pop(), Some(42));
//! ```
//!
//! Because they have fixed capacity `heapless` data structures don&#39;t implicitly reallocate. This
//! means that operations like `heapless::Vec.push` are *truly* constant time rather than amortized
//! constant time with potentially unbounded (depends on the allocator) worst case execution time
//! (which is bad / unacceptable for hard real time applications).
//!
//! `heapless` data structures don&#39;t use a memory allocator which means no risk of an uncatchable
//! Out Of Memory (OOM) condition while performing operations on them. It&#39;s certainly possible to
//! run out of capacity while growing `heapless` data structures, but the API lets you handle this
//! possibility by returning a `Result` on operations that may exhaust the capacity of the data
//! structure.
//!
//! List of currently implemented data structures:
//!
//! - [`Arc`](pool/singleton/arc/struct.Arc.html) -- Thread-safe reference-counting pointer backed by a memory pool
//! - [`BinaryHeap`](binary_heap/struct.BinaryHeap.html) -- priority queue
//! - [`IndexMap`](struct.IndexMap.html) -- hash table
//! - [`IndexSet`](struct.IndexSet.html) -- hash set
//! - [`LinearMap`](struct.LinearMap.html)
//! - [`Pool`](pool/struct.Pool.html) -- lock-free memory pool
//! - [`String`](struct.String.html)
//! - [`Vec`](struct.Vec.html)
//! - [`mpmc::Q*`](mpmc/index.html) -- multiple producer multiple consumer lock-free queue
//! - [`spsc::Queue`](spsc/struct.Queue.html) -- single producer single consumer lock-free queue
//!
//! # Optional Features
//!
//! The `heapless` crate provides the following optional Cargo features:
//!
//! - `ufmt-impl`: Implement [`ufmt_write::uWrite`] for `String&lt;N&gt;` and `Vec&lt;u8, N&gt;`
//!
//! [`ufmt_write::uWrite`]: https://docs.rs/ufmt-write/
//!
//! # Minimum Supported Rust Version (MSRV)
//!
//! This crate is guaranteed to compile on stable Rust 1.51 and up with its default set of features.
//! It *might* compile on older versions but that may change in any new patch release.
</span><span class="attr">#![cfg_attr(not(test), no_std)]
#![deny(missing_docs)]
#![deny(rust_2018_compatibility)]
#![deny(rust_2018_idioms)]
#![deny(warnings)]
#![deny(const_err)]
</span><span class="kw">pub use </span>binary_heap::BinaryHeap;
<span class="kw">pub use </span>deque::Deque;
<span class="kw">pub use </span>histbuf::{HistoryBuffer, OldestOrdered};
<span class="kw">pub use </span>indexmap::{Bucket, Entry, FnvIndexMap, IndexMap, OccupiedEntry, Pos, VacantEntry};
<span class="kw">pub use </span>indexset::{FnvIndexSet, IndexSet};
<span class="kw">pub use </span>linear_map::LinearMap;
<span class="attr">#[cfg(all(has_cas, feature = <span class="string">&quot;cas&quot;</span>))]
</span><span class="kw">pub use </span>pool::singleton::arc::Arc;
<span class="kw">pub use </span>string::String;
<span class="kw">pub use </span>vec::Vec;
<span class="attr">#[macro_use]
#[cfg(test)]
</span><span class="kw">mod </span>test_helpers;
<span class="kw">mod </span>deque;
<span class="kw">mod </span>histbuf;
<span class="kw">mod </span>indexmap;
<span class="kw">mod </span>indexset;
<span class="kw">mod </span>linear_map;
<span class="kw">mod </span>string;
<span class="kw">mod </span>vec;
<span class="attr">#[cfg(feature = <span class="string">&quot;serde&quot;</span>)]
</span><span class="kw">mod </span>de;
<span class="attr">#[cfg(feature = <span class="string">&quot;serde&quot;</span>)]
</span><span class="kw">mod </span>ser;
<span class="kw">pub mod </span>binary_heap;
<span class="attr">#[cfg(feature = <span class="string">&quot;defmt-impl&quot;</span>)]
</span><span class="kw">mod </span>defmt;
<span class="attr">#[cfg(all(has_cas, feature = <span class="string">&quot;cas&quot;</span>))]
</span><span class="kw">pub mod </span>mpmc;
<span class="attr">#[cfg(all(has_cas, feature = <span class="string">&quot;cas&quot;</span>))]
</span><span class="kw">pub mod </span>pool;
<span class="kw">pub mod </span>sorted_linked_list;
<span class="attr">#[cfg(has_atomics)]
</span><span class="kw">pub mod </span>spsc;
<span class="attr">#[cfg(feature = <span class="string">&quot;ufmt-impl&quot;</span>)]
</span><span class="kw">mod </span>ufmt;
<span class="kw">mod </span>sealed;
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,117 @@
<!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="Source of the Rust file `/home/zenn/.cargo/registry/src/index.crates.io-6f17d22bba15001f/heapless-0.7.16/src/sealed.rs`."><title>sealed.rs - source</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/woff2" crossorigin href="../../static.files/FiraSans-Regular-018c141bf0843ffd.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/FiraSans-Medium-8f9a781e4970d388.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2"><link rel="stylesheet" href="../../static.files/normalize-76eba96aa4d2e634.css"><link rel="stylesheet" href="../../static.files/rustdoc-cb6f1f67f1bcd037.css" id="mainThemeStyle"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="heapless" data-themes="" data-resource-suffix="" data-rustdoc-version="1.73.0-nightly (500647fd8 2023-07-27)" data-channel="nightly" data-search-js="search-6dfdfced5eff6596.js" data-settings-js="settings-de11bff964e9d4e5.js" data-settings-css="settings-8c76f75bfb6bd192.css" data-theme-light-css="light-6d2c9675f3d09c26.css" data-theme-dark-css="dark-45ceb8f2e522f4d1.css" data-theme-ayu-css="ayu-fd19013d6ce078bf.css" ><script src="../../static.files/storage-db41da1a38ea3cb8.js"></script><script defer src="../../static.files/src-script-3280b574d94e47b4.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-0795b7d26be81095.js"></script><noscript><link rel="stylesheet" media="(prefers-color-scheme:light)" href="../../static.files/light-6d2c9675f3d09c26.css"><link rel="stylesheet" media="(prefers-color-scheme:dark)" href="../../static.files/dark-45ceb8f2e522f4d1.css"><link rel="stylesheet" href="../../static.files/noscript-cffde32267a19fd6.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-16x16-8b506e7a72182f1c.png"><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-422f7d1d52889060.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-2c020d218678b618.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"></nav><main><nav class="sub"><a class="sub-logo-container" href="../../heapless/index.html"><img class="rust-logo" src="../../static.files/rust-logo-151179464ae7ed46.svg" alt="logo"></a><form class="search-form"><span></span><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><a href="../../help.html">?</a></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../static.files/wheel-7b819b6101059cd0.svg"></a></div></form></nav><section id="main-content" class="content"><div class="example-wrap"><div data-nosnippet><pre class="src-line-numbers"><a href="#1" id="1">1</a>
<a href="#2" id="2">2</a>
<a href="#3" id="3">3</a>
<a href="#4" id="4">4</a>
<a href="#5" id="5">5</a>
<a href="#6" id="6">6</a>
<a href="#7" id="7">7</a>
<a href="#8" id="8">8</a>
<a href="#9" id="9">9</a>
<a href="#10" id="10">10</a>
<a href="#11" id="11">11</a>
<a href="#12" id="12">12</a>
<a href="#13" id="13">13</a>
<a href="#14" id="14">14</a>
<a href="#15" id="15">15</a>
<a href="#16" id="16">16</a>
<a href="#17" id="17">17</a>
<a href="#18" id="18">18</a>
<a href="#19" id="19">19</a>
<a href="#20" id="20">20</a>
<a href="#21" id="21">21</a>
<a href="#22" id="22">22</a>
<a href="#23" id="23">23</a>
<a href="#24" id="24">24</a>
<a href="#25" id="25">25</a>
<a href="#26" id="26">26</a>
<a href="#27" id="27">27</a>
<a href="#28" id="28">28</a>
<a href="#29" id="29">29</a>
<a href="#30" id="30">30</a>
<a href="#31" id="31">31</a>
<a href="#32" id="32">32</a>
<a href="#33" id="33">33</a>
<a href="#34" id="34">34</a>
<a href="#35" id="35">35</a>
<a href="#36" id="36">36</a>
<a href="#37" id="37">37</a>
<a href="#38" id="38">38</a>
<a href="#39" id="39">39</a>
<a href="#40" id="40">40</a>
<a href="#41" id="41">41</a>
<a href="#42" id="42">42</a>
<a href="#43" id="43">43</a>
<a href="#44" id="44">44</a>
<a href="#45" id="45">45</a>
<a href="#46" id="46">46</a>
<a href="#47" id="47">47</a>
<a href="#48" id="48">48</a>
<a href="#49" id="49">49</a>
<a href="#50" id="50">50</a>
<a href="#51" id="51">51</a>
<a href="#52" id="52">52</a>
<a href="#53" id="53">53</a>
<a href="#54" id="54">54</a>
<a href="#55" id="55">55</a>
<a href="#56" id="56">56</a>
<a href="#57" id="57">57</a>
<a href="#58" id="58">58</a>
</pre></div><pre class="rust"><code><span class="attr">#[allow(dead_code)]
#[allow(path_statements)]
</span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const fn </span>smaller_than&lt;<span class="kw">const </span>N: usize, <span class="kw">const </span>MAX: usize&gt;() {
Assert::&lt;N, MAX&gt;::LESS;
}
<span class="attr">#[allow(dead_code)]
#[allow(path_statements)]
</span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const fn </span>greater_than_eq_0&lt;<span class="kw">const </span>N: usize&gt;() {
Assert::&lt;N, <span class="number">0</span>&gt;::GREATER_EQ;
}
<span class="attr">#[allow(dead_code)]
#[allow(path_statements)]
</span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const fn </span>greater_than_0&lt;<span class="kw">const </span>N: usize&gt;() {
Assert::&lt;N, <span class="number">0</span>&gt;::GREATER;
}
<span class="attr">#[allow(dead_code)]
#[allow(path_statements)]
</span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const fn </span>greater_than_1&lt;<span class="kw">const </span>N: usize&gt;() {
Assert::&lt;N, <span class="number">1</span>&gt;::GREATER;
}
<span class="attr">#[allow(dead_code)]
#[allow(path_statements)]
</span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const fn </span>power_of_two&lt;<span class="kw">const </span>N: usize&gt;() {
Assert::&lt;N, <span class="number">0</span>&gt;::GREATER;
Assert::&lt;N, <span class="number">0</span>&gt;::POWER_OF_TWO;
}
<span class="attr">#[allow(dead_code)]
</span><span class="doccomment">/// Const assert hack
</span><span class="kw">pub struct </span>Assert&lt;<span class="kw">const </span>L: usize, <span class="kw">const </span>R: usize&gt;;
<span class="attr">#[allow(dead_code)]
</span><span class="kw">impl</span>&lt;<span class="kw">const </span>L: usize, <span class="kw">const </span>R: usize&gt; Assert&lt;L, R&gt; {
<span class="doccomment">/// Const assert hack
</span><span class="kw">pub const </span>GREATER_EQ: usize = L - R;
<span class="doccomment">/// Const assert hack
</span><span class="kw">pub const </span>LESS_EQ: usize = R - L;
<span class="doccomment">/// Const assert hack
</span><span class="kw">pub const </span>NOT_EQ: isize = <span class="number">0 </span>/ (R <span class="kw">as </span>isize - L <span class="kw">as </span>isize);
<span class="doccomment">/// Const assert hack
</span><span class="kw">pub const </span>EQ: usize = (R - L) + (L - R);
<span class="doccomment">/// Const assert hack
</span><span class="kw">pub const </span>GREATER: usize = L - R - <span class="number">1</span>;
<span class="doccomment">/// Const assert hack
</span><span class="kw">pub const </span>LESS: usize = R - L - <span class="number">1</span>;
<span class="doccomment">/// Const assert hack
</span><span class="kw">pub const </span>POWER_OF_TWO: usize = <span class="number">0 </span>- (L &amp; (L - <span class="number">1</span>));
}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff