This commit is contained in:
krahets
2025-09-11 03:53:53 +08:00
parent 9e518c0561
commit fe56286bb0
57 changed files with 1002 additions and 926 deletions

View File

@@ -5947,121 +5947,157 @@
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">my_list.zig</span><pre><span></span><code><a id="__codelineno-97-1" name="__codelineno-97-1" href="#__codelineno-97-1"></a><span class="c1">// 列表类</span>
<a id="__codelineno-97-2" name="__codelineno-97-2" href="#__codelineno-97-2"></a><span class="k">fn</span><span class="w"> </span><span class="n">MyList</span><span class="p">(</span><span class="kr">comptime</span><span class="w"> </span><span class="n">T</span><span class="o">:</span><span class="w"> </span><span class="kt">type</span><span class="p">)</span><span class="w"> </span><span class="kt">type</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-3" name="__codelineno-97-3" href="#__codelineno-97-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-4" name="__codelineno-97-4" href="#__codelineno-97-4"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">Self</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@This</span><span class="p">();</span>
<a id="__codelineno-97-5" name="__codelineno-97-5" href="#__codelineno-97-5"></a>
<a id="__codelineno-97-6" name="__codelineno-97-6" href="#__codelineno-97-6"></a><span class="w"> </span><span class="n">arr</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="n">T</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">undefined</span><span class="p">,</span><span class="w"> </span><span class="c1">// 数组(存储列表元素)</span>
<a id="__codelineno-97-7" name="__codelineno-97-7" href="#__codelineno-97-7"></a><span class="w"> </span><span class="n">arrCapacity</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="c1">// 列表容量</span>
<a id="__codelineno-97-8" name="__codelineno-97-8" href="#__codelineno-97-8"></a><span class="w"> </span><span class="n">numSize</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="c1">// 列表长度(当前元素数量)</span>
<a id="__codelineno-97-9" name="__codelineno-97-9" href="#__codelineno-97-9"></a><span class="w"> </span><span class="n">extendRatio</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="c1">// 每次列表扩容的倍数</span>
<a id="__codelineno-97-10" name="__codelineno-97-10" href="#__codelineno-97-10"></a><span class="w"> </span><span class="n">mem_arena</span><span class="o">:</span><span class="w"> </span><span class="o">?</span><span class="n">std</span><span class="p">.</span><span class="n">heap</span><span class="p">.</span><span class="n">ArenaAllocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<a id="__codelineno-97-11" name="__codelineno-97-11" href="#__codelineno-97-11"></a><span class="w"> </span><span class="n">mem_allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">undefined</span><span class="p">,</span><span class="w"> </span><span class="c1">// 内存分配器</span>
<a id="__codelineno-97-12" name="__codelineno-97-12" href="#__codelineno-97-12"></a>
<a id="__codelineno-97-13" name="__codelineno-97-13" href="#__codelineno-97-13"></a><span class="w"> </span><span class="c1">// 构造函数(分配内存+初始化列表)</span>
<a id="__codelineno-97-14" name="__codelineno-97-14" href="#__codelineno-97-14"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">init</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-15" name="__codelineno-97-15" href="#__codelineno-97-15"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">mem_arena</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-16" name="__codelineno-97-16" href="#__codelineno-97-16"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">mem_arena</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">heap</span><span class="p">.</span><span class="n">ArenaAllocator</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span>
<a id="__codelineno-97-17" name="__codelineno-97-17" href="#__codelineno-97-17"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">mem_allocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">mem_arena</span><span class="p">.</span><span class="o">?</span><span class="p">.</span><span class="n">allocator</span><span class="p">();</span>
<a id="__codelineno-97-18" name="__codelineno-97-18" href="#__codelineno-97-18"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-19" name="__codelineno-97-19" href="#__codelineno-97-19"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">mem_allocator</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span><span class="n">T</span><span class="p">,</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arrCapacity</span><span class="p">);</span>
<a id="__codelineno-97-20" name="__codelineno-97-20" href="#__codelineno-97-20"></a><span class="w"> </span><span class="nb">@memset</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">,</span><span class="w"> </span><span class="nb">@as</span><span class="p">(</span><span class="n">T</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">));</span>
<a id="__codelineno-97-21" name="__codelineno-97-21" href="#__codelineno-97-21"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-22" name="__codelineno-97-22" href="#__codelineno-97-22"></a>
<a id="__codelineno-97-23" name="__codelineno-97-23" href="#__codelineno-97-23"></a><span class="w"> </span><span class="c1">// 析构函数(释放内存)</span>
<a id="__codelineno-97-24" name="__codelineno-97-24" href="#__codelineno-97-24"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">deinit</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-25" name="__codelineno-97-25" href="#__codelineno-97-25"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">mem_arena</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a id="__codelineno-97-26" name="__codelineno-97-26" href="#__codelineno-97-26"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">mem_arena</span><span class="p">.</span><span class="o">?</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span>
<a id="__codelineno-97-27" name="__codelineno-97-27" href="#__codelineno-97-27"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-28" name="__codelineno-97-28" href="#__codelineno-97-28"></a>
<a id="__codelineno-97-29" name="__codelineno-97-29" href="#__codelineno-97-29"></a><span class="w"> </span><span class="c1">// 获取列表长度(当前元素数量)</span>
<a id="__codelineno-97-30" name="__codelineno-97-30" href="#__codelineno-97-30"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">size</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-31" name="__codelineno-97-31" href="#__codelineno-97-31"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">numSize</span><span class="p">;</span>
<a id="__codelineno-97-32" name="__codelineno-97-32" href="#__codelineno-97-32"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-33" name="__codelineno-97-33" href="#__codelineno-97-33"></a>
<a id="__codelineno-97-34" name="__codelineno-97-34" href="#__codelineno-97-34"></a><span class="w"> </span><span class="c1">// 获取列表容量</span>
<a id="__codelineno-97-35" name="__codelineno-97-35" href="#__codelineno-97-35"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">capacity</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-36" name="__codelineno-97-36" href="#__codelineno-97-36"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arrCapacity</span><span class="p">;</span>
<a id="__codelineno-97-37" name="__codelineno-97-37" href="#__codelineno-97-37"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-38" name="__codelineno-97-38" href="#__codelineno-97-38"></a>
<a id="__codelineno-97-39" name="__codelineno-97-39" href="#__codelineno-97-39"></a><span class="w"> </span><span class="c1">// 访问元素</span>
<a id="__codelineno-97-40" name="__codelineno-97-40" href="#__codelineno-97-40"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">get</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">index</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">)</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-41" name="__codelineno-97-41" href="#__codelineno-97-41"></a><span class="w"> </span><span class="c1">// 索引如果越界,则抛出异常,下同</span>
<a id="__codelineno-97-42" name="__codelineno-97-42" href="#__codelineno-97-42"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">())</span><span class="w"> </span><span class="nb">@panic</span><span class="p">(</span><span class="s">&quot;索引越界&quot;</span><span class="p">);</span>
<a id="__codelineno-97-43" name="__codelineno-97-43" href="#__codelineno-97-43"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a id="__codelineno-97-44" name="__codelineno-97-44" href="#__codelineno-97-44"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span>
<a id="__codelineno-97-45" name="__codelineno-97-45" href="#__codelineno-97-45"></a>
<a id="__codelineno-97-46" name="__codelineno-97-46" href="#__codelineno-97-46"></a><span class="w"> </span><span class="c1">// 更新元素</span>
<a id="__codelineno-97-47" name="__codelineno-97-47" href="#__codelineno-97-47"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">set</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">index</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="n">num</span><span class="o">:</span><span class="w"> </span><span class="n">T</span><span class="p">)</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-48" name="__codelineno-97-48" href="#__codelineno-97-48"></a><span class="w"> </span><span class="c1">// 索引如果越界,则抛出异常,下同</span>
<a id="__codelineno-97-49" name="__codelineno-97-49" href="#__codelineno-97-49"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">())</span><span class="w"> </span><span class="nb">@panic</span><span class="p">(</span><span class="s">&quot;索引越界&quot;</span><span class="p">);</span>
<a id="__codelineno-97-50" name="__codelineno-97-50" href="#__codelineno-97-50"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">num</span><span class="p">;</span>
<a id="__codelineno-97-51" name="__codelineno-97-51" href="#__codelineno-97-51"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span>
<a id="__codelineno-97-52" name="__codelineno-97-52" href="#__codelineno-97-52"></a>
<a id="__codelineno-97-53" name="__codelineno-97-53" href="#__codelineno-97-53"></a><span class="w"> </span><span class="c1">// 在尾部添加元素</span>
<a id="__codelineno-97-54" name="__codelineno-97-54" href="#__codelineno-97-54"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">add</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">num</span><span class="o">:</span><span class="w"> </span><span class="n">T</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-55" name="__codelineno-97-55" href="#__codelineno-97-55"></a><span class="w"> </span><span class="c1">// 元素数量超出容量时,触发扩容机制</span>
<a id="__codelineno-97-56" name="__codelineno-97-56" href="#__codelineno-97-56"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="p">())</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">extendCapacity</span><span class="p">();</span>
<a id="__codelineno-97-57" name="__codelineno-97-57" href="#__codelineno-97-57"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">()]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">num</span><span class="p">;</span>
<a id="__codelineno-97-58" name="__codelineno-97-58" href="#__codelineno-97-58"></a><span class="w"> </span><span class="c1">// 更新元素数量</span>
<a id="__codelineno-97-59" name="__codelineno-97-59" href="#__codelineno-97-59"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">numSize</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-60" name="__codelineno-97-60" href="#__codelineno-97-60"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span>
<a id="__codelineno-97-61" name="__codelineno-97-61" href="#__codelineno-97-61"></a>
<a id="__codelineno-97-62" name="__codelineno-97-62" href="#__codelineno-97-62"></a><span class="w"> </span><span class="c1">// 在中间插入元素</span>
<a id="__codelineno-97-63" name="__codelineno-97-63" href="#__codelineno-97-63"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">insert</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">index</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="n">num</span><span class="o">:</span><span class="w"> </span><span class="n">T</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-64" name="__codelineno-97-64" href="#__codelineno-97-64"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">())</span><span class="w"> </span><span class="nb">@panic</span><span class="p">(</span><span class="s">&quot;索引越界&quot;</span><span class="p">);</span>
<a id="__codelineno-97-65" name="__codelineno-97-65" href="#__codelineno-97-65"></a><span class="w"> </span><span class="c1">// 元素数量超出容量时,触发扩容机制</span>
<a id="__codelineno-97-66" name="__codelineno-97-66" href="#__codelineno-97-66"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="p">())</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">extendCapacity</span><span class="p">();</span>
<a id="__codelineno-97-67" name="__codelineno-97-67" href="#__codelineno-97-67"></a><span class="w"> </span><span class="c1">// 将索引 index 以及之后的元素都向后移动一位</span>
<a id="__codelineno-97-68" name="__codelineno-97-68" href="#__codelineno-97-68"></a><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-69" name="__codelineno-97-69" href="#__codelineno-97-69"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">j</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">index</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="p">(</span><span class="n">j</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-70" name="__codelineno-97-70" href="#__codelineno-97-70"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
<a id="__codelineno-97-71" name="__codelineno-97-71" href="#__codelineno-97-71"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-72" name="__codelineno-97-72" href="#__codelineno-97-72"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">num</span><span class="p">;</span>
<a id="__codelineno-97-73" name="__codelineno-97-73" href="#__codelineno-97-73"></a><span class="w"> </span><span class="c1">// 更新元素数量</span>
<a id="__codelineno-97-74" name="__codelineno-97-74" href="#__codelineno-97-74"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">numSize</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-75" name="__codelineno-97-75" href="#__codelineno-97-75"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-76" name="__codelineno-97-76" href="#__codelineno-97-76"></a>
<a id="__codelineno-97-77" name="__codelineno-97-77" href="#__codelineno-97-77"></a><span class="w"> </span><span class="c1">// 删除元素</span>
<a id="__codelineno-97-78" name="__codelineno-97-78" href="#__codelineno-97-78"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">remove</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">index</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">)</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-79" name="__codelineno-97-79" href="#__codelineno-97-79"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">())</span><span class="w"> </span><span class="nb">@panic</span><span class="p">(</span><span class="s">&quot;索引越界&quot;</span><span class="p">);</span>
<a id="__codelineno-97-80" name="__codelineno-97-80" href="#__codelineno-97-80"></a><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">num</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a id="__codelineno-97-81" name="__codelineno-97-81" href="#__codelineno-97-81"></a><span class="w"> </span><span class="c1">// 将索引 index 之后的元素都向前移动一位</span>
<a id="__codelineno-97-82" name="__codelineno-97-82" href="#__codelineno-97-82"></a><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<a id="__codelineno-97-83" name="__codelineno-97-83" href="#__codelineno-97-83"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">j</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="p">(</span><span class="n">j</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-84" name="__codelineno-97-84" href="#__codelineno-97-84"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">];</span>
<a id="__codelineno-97-85" name="__codelineno-97-85" href="#__codelineno-97-85"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-86" name="__codelineno-97-86" href="#__codelineno-97-86"></a><span class="w"> </span><span class="c1">// 更新元素数量</span>
<a id="__codelineno-97-87" name="__codelineno-97-87" href="#__codelineno-97-87"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">numSize</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-88" name="__codelineno-97-88" href="#__codelineno-97-88"></a><span class="w"> </span><span class="c1">// 返回被删除的元素</span>
<a id="__codelineno-97-89" name="__codelineno-97-89" href="#__codelineno-97-89"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">num</span><span class="p">;</span>
<a id="__codelineno-97-90" name="__codelineno-97-90" href="#__codelineno-97-90"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-91" name="__codelineno-97-91" href="#__codelineno-97-91"></a>
<a id="__codelineno-97-92" name="__codelineno-97-92" href="#__codelineno-97-92"></a><span class="w"> </span><span class="c1">// 列表扩容</span>
<a id="__codelineno-97-93" name="__codelineno-97-93" href="#__codelineno-97-93"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">extendCapacity</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-94" name="__codelineno-97-94" href="#__codelineno-97-94"></a><span class="w"> </span><span class="c1">// 新建一个长度为 size * extendRatio 的数组,并将原数组复制到新数组</span>
<a id="__codelineno-97-95" name="__codelineno-97-95" href="#__codelineno-97-95"></a><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">newCapacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">extendRatio</span><span class="p">;</span>
<a id="__codelineno-97-96" name="__codelineno-97-96" href="#__codelineno-97-96"></a><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">extend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">mem_allocator</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span><span class="n">T</span><span class="p">,</span><span class="w"> </span><span class="n">newCapacity</span><span class="p">);</span>
<a id="__codelineno-97-97" name="__codelineno-97-97" href="#__codelineno-97-97"></a><span class="w"> </span><span class="nb">@memset</span><span class="p">(</span><span class="n">extend</span><span class="p">,</span><span class="w"> </span><span class="nb">@as</span><span class="p">(</span><span class="n">T</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">));</span>
<a id="__codelineno-97-98" name="__codelineno-97-98" href="#__codelineno-97-98"></a><span class="w"> </span><span class="c1">// 将原数组中的所有元素复制到新数组</span>
<a id="__codelineno-97-99" name="__codelineno-97-99" href="#__codelineno-97-99"></a><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">copy</span><span class="p">(</span><span class="n">T</span><span class="p">,</span><span class="w"> </span><span class="n">extend</span><span class="p">,</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="p">);</span>
<a id="__codelineno-97-100" name="__codelineno-97-100" href="#__codelineno-97-100"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">extend</span><span class="p">;</span>
<a id="__codelineno-97-101" name="__codelineno-97-101" href="#__codelineno-97-101"></a><span class="w"> </span><span class="c1">// 更新列表容量</span>
<a id="__codelineno-97-102" name="__codelineno-97-102" href="#__codelineno-97-102"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">arrCapacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newCapacity</span><span class="p">;</span>
<a id="__codelineno-97-103" name="__codelineno-97-103" href="#__codelineno-97-103"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-2" name="__codelineno-97-2" href="#__codelineno-97-2"></a><span class="kr">const</span><span class="w"> </span><span class="n">MyList</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-3" name="__codelineno-97-3" href="#__codelineno-97-3"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">Self</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@This</span><span class="p">();</span>
<a id="__codelineno-97-4" name="__codelineno-97-4" href="#__codelineno-97-4"></a>
<a id="__codelineno-97-5" name="__codelineno-97-5" href="#__codelineno-97-5"></a><span class="w"> </span><span class="n">items</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="c1">// 数组(存储列表元素)</span>
<a id="__codelineno-97-6" name="__codelineno-97-6" href="#__codelineno-97-6"></a><span class="w"> </span><span class="n">capacity</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="c1">// 列表容量</span>
<a id="__codelineno-97-7" name="__codelineno-97-7" href="#__codelineno-97-7"></a><span class="w"> </span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">,</span><span class="w"> </span><span class="c1">// 内存分配器</span>
<a id="__codelineno-97-8" name="__codelineno-97-8" href="#__codelineno-97-8"></a>
<a id="__codelineno-97-9" name="__codelineno-97-9" href="#__codelineno-97-9"></a><span class="w"> </span><span class="n">extend_ratio</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="c1">// 每次列表扩容的倍数</span>
<a id="__codelineno-97-10" name="__codelineno-97-10" href="#__codelineno-97-10"></a>
<a id="__codelineno-97-11" name="__codelineno-97-11" href="#__codelineno-97-11"></a><span class="w"> </span><span class="c1">// 构造函数(分配内存+初始化列表)</span>
<a id="__codelineno-97-12" name="__codelineno-97-12" href="#__codelineno-97-12"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">)</span><span class="w"> </span><span class="n">Self</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-13" name="__codelineno-97-13" href="#__codelineno-97-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">Self</span><span class="p">{</span>
<a id="__codelineno-97-14" name="__codelineno-97-14" href="#__codelineno-97-14"></a><span class="w"> </span><span class="p">.</span><span class="n">items</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="p">[</span><span class="n">_</span><span class="p">]</span><span class="kt">i32</span><span class="p">{},</span>
<a id="__codelineno-97-15" name="__codelineno-97-15" href="#__codelineno-97-15"></a><span class="w"> </span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<a id="__codelineno-97-16" name="__codelineno-97-16" href="#__codelineno-97-16"></a><span class="w"> </span><span class="p">.</span><span class="n">allocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">allocator</span><span class="p">,</span>
<a id="__codelineno-97-17" name="__codelineno-97-17" href="#__codelineno-97-17"></a><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-97-18" name="__codelineno-97-18" href="#__codelineno-97-18"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-19" name="__codelineno-97-19" href="#__codelineno-97-19"></a>
<a id="__codelineno-97-20" name="__codelineno-97-20" href="#__codelineno-97-20"></a><span class="w"> </span><span class="c1">// 析构函数(释放内存)</span>
<a id="__codelineno-97-21" name="__codelineno-97-21" href="#__codelineno-97-21"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">deinit</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-22" name="__codelineno-97-22" href="#__codelineno-97-22"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">allocatedSlice</span><span class="p">());</span>
<a id="__codelineno-97-23" name="__codelineno-97-23" href="#__codelineno-97-23"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-24" name="__codelineno-97-24" href="#__codelineno-97-24"></a>
<a id="__codelineno-97-25" name="__codelineno-97-25" href="#__codelineno-97-25"></a><span class="w"> </span><span class="c1">// 在尾部添加元素</span>
<a id="__codelineno-97-26" name="__codelineno-97-26" href="#__codelineno-97-26"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">add</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">item</span><span class="o">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-27" name="__codelineno-97-27" href="#__codelineno-97-27"></a><span class="w"> </span><span class="c1">// 元素数量超出容量时,触发扩容机制</span>
<a id="__codelineno-97-28" name="__codelineno-97-28" href="#__codelineno-97-28"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">newlen</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-29" name="__codelineno-97-29" href="#__codelineno-97-29"></a><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">ensureTotalCapacity</span><span class="p">(</span><span class="n">newlen</span><span class="p">);</span>
<a id="__codelineno-97-30" name="__codelineno-97-30" href="#__codelineno-97-30"></a>
<a id="__codelineno-97-31" name="__codelineno-97-31" href="#__codelineno-97-31"></a><span class="w"> </span><span class="c1">// 更新元素</span>
<a id="__codelineno-97-32" name="__codelineno-97-32" href="#__codelineno-97-32"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-33" name="__codelineno-97-33" href="#__codelineno-97-33"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">new_item_ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">];</span>
<a id="__codelineno-97-34" name="__codelineno-97-34" href="#__codelineno-97-34"></a><span class="w"> </span><span class="n">new_item_ptr</span><span class="p">.</span><span class="o">*</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">item</span><span class="p">;</span>
<a id="__codelineno-97-35" name="__codelineno-97-35" href="#__codelineno-97-35"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-36" name="__codelineno-97-36" href="#__codelineno-97-36"></a>
<a id="__codelineno-97-37" name="__codelineno-97-37" href="#__codelineno-97-37"></a><span class="w"> </span><span class="c1">// 获取列表长度(当前元素数量)</span>
<a id="__codelineno-97-38" name="__codelineno-97-38" href="#__codelineno-97-38"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">getSize</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-39" name="__codelineno-97-39" href="#__codelineno-97-39"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="p">;</span>
<a id="__codelineno-97-40" name="__codelineno-97-40" href="#__codelineno-97-40"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-41" name="__codelineno-97-41" href="#__codelineno-97-41"></a>
<a id="__codelineno-97-42" name="__codelineno-97-42" href="#__codelineno-97-42"></a><span class="w"> </span><span class="c1">// 获取列表容量</span>
<a id="__codelineno-97-43" name="__codelineno-97-43" href="#__codelineno-97-43"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">getCapacity</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-44" name="__codelineno-97-44" href="#__codelineno-97-44"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="p">;</span>
<a id="__codelineno-97-45" name="__codelineno-97-45" href="#__codelineno-97-45"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-46" name="__codelineno-97-46" href="#__codelineno-97-46"></a>
<a id="__codelineno-97-47" name="__codelineno-97-47" href="#__codelineno-97-47"></a><span class="w"> </span><span class="c1">// 访问元素</span>
<a id="__codelineno-97-48" name="__codelineno-97-48" href="#__codelineno-97-48"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">get</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">index</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">)</span><span class="w"> </span><span class="kt">i32</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-49" name="__codelineno-97-49" href="#__codelineno-97-49"></a><span class="w"> </span><span class="c1">// 索引如果越界,则抛出异常,下同</span>
<a id="__codelineno-97-50" name="__codelineno-97-50" href="#__codelineno-97-50"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-51" name="__codelineno-97-51" href="#__codelineno-97-51"></a><span class="w"> </span><span class="nb">@panic</span><span class="p">(</span><span class="s">&quot;索引越界&quot;</span><span class="p">);</span>
<a id="__codelineno-97-52" name="__codelineno-97-52" href="#__codelineno-97-52"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-53" name="__codelineno-97-53" href="#__codelineno-97-53"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a id="__codelineno-97-54" name="__codelineno-97-54" href="#__codelineno-97-54"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-55" name="__codelineno-97-55" href="#__codelineno-97-55"></a>
<a id="__codelineno-97-56" name="__codelineno-97-56" href="#__codelineno-97-56"></a><span class="w"> </span><span class="c1">// 更新元素</span>
<a id="__codelineno-97-57" name="__codelineno-97-57" href="#__codelineno-97-57"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">set</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">index</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="n">num</span><span class="o">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-58" name="__codelineno-97-58" href="#__codelineno-97-58"></a><span class="w"> </span><span class="c1">// 索引如果越界,则抛出异常,下同</span>
<a id="__codelineno-97-59" name="__codelineno-97-59" href="#__codelineno-97-59"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-60" name="__codelineno-97-60" href="#__codelineno-97-60"></a><span class="w"> </span><span class="nb">@panic</span><span class="p">(</span><span class="s">&quot;索引越界&quot;</span><span class="p">);</span>
<a id="__codelineno-97-61" name="__codelineno-97-61" href="#__codelineno-97-61"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-62" name="__codelineno-97-62" href="#__codelineno-97-62"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">num</span><span class="p">;</span>
<a id="__codelineno-97-63" name="__codelineno-97-63" href="#__codelineno-97-63"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-64" name="__codelineno-97-64" href="#__codelineno-97-64"></a>
<a id="__codelineno-97-65" name="__codelineno-97-65" href="#__codelineno-97-65"></a><span class="w"> </span><span class="c1">// 在中间插入元素</span>
<a id="__codelineno-97-66" name="__codelineno-97-66" href="#__codelineno-97-66"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">insert</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">index</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="n">item</span><span class="o">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-67" name="__codelineno-97-67" href="#__codelineno-97-67"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-68" name="__codelineno-97-68" href="#__codelineno-97-68"></a><span class="w"> </span><span class="nb">@panic</span><span class="p">(</span><span class="s">&quot;索引越界&quot;</span><span class="p">);</span>
<a id="__codelineno-97-69" name="__codelineno-97-69" href="#__codelineno-97-69"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-70" name="__codelineno-97-70" href="#__codelineno-97-70"></a>
<a id="__codelineno-97-71" name="__codelineno-97-71" href="#__codelineno-97-71"></a><span class="w"> </span><span class="c1">// 元素数量超出容量时,触发扩容机制</span>
<a id="__codelineno-97-72" name="__codelineno-97-72" href="#__codelineno-97-72"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">newlen</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-73" name="__codelineno-97-73" href="#__codelineno-97-73"></a><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">ensureTotalCapacity</span><span class="p">(</span><span class="n">newlen</span><span class="p">);</span>
<a id="__codelineno-97-74" name="__codelineno-97-74" href="#__codelineno-97-74"></a>
<a id="__codelineno-97-75" name="__codelineno-97-75" href="#__codelineno-97-75"></a><span class="w"> </span><span class="c1">// 将索引 index 以及之后的元素都向后移动一位</span>
<a id="__codelineno-97-76" name="__codelineno-97-76" href="#__codelineno-97-76"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-77" name="__codelineno-97-77" href="#__codelineno-97-77"></a><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-78" name="__codelineno-97-78" href="#__codelineno-97-78"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">index</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-79" name="__codelineno-97-79" href="#__codelineno-97-79"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">];</span>
<a id="__codelineno-97-80" name="__codelineno-97-80" href="#__codelineno-97-80"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-81" name="__codelineno-97-81" href="#__codelineno-97-81"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">item</span><span class="p">;</span>
<a id="__codelineno-97-82" name="__codelineno-97-82" href="#__codelineno-97-82"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-83" name="__codelineno-97-83" href="#__codelineno-97-83"></a>
<a id="__codelineno-97-84" name="__codelineno-97-84" href="#__codelineno-97-84"></a><span class="w"> </span><span class="c1">// 删除元素</span>
<a id="__codelineno-97-85" name="__codelineno-97-85" href="#__codelineno-97-85"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">remove</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">index</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">)</span><span class="w"> </span><span class="kt">i32</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-86" name="__codelineno-97-86" href="#__codelineno-97-86"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">getSize</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-87" name="__codelineno-97-87" href="#__codelineno-97-87"></a><span class="w"> </span><span class="nb">@panic</span><span class="p">(</span><span class="s">&quot;索引越界&quot;</span><span class="p">);</span>
<a id="__codelineno-97-88" name="__codelineno-97-88" href="#__codelineno-97-88"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-89" name="__codelineno-97-89" href="#__codelineno-97-89"></a><span class="w"> </span><span class="c1">// 将索引 index 之后的元素都向前移动一位</span>
<a id="__codelineno-97-90" name="__codelineno-97-90" href="#__codelineno-97-90"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">item</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a id="__codelineno-97-91" name="__codelineno-97-91" href="#__codelineno-97-91"></a><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<a id="__codelineno-97-92" name="__codelineno-97-92" href="#__codelineno-97-92"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-93" name="__codelineno-97-93" href="#__codelineno-97-93"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">];</span>
<a id="__codelineno-97-94" name="__codelineno-97-94" href="#__codelineno-97-94"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-95" name="__codelineno-97-95" href="#__codelineno-97-95"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a id="__codelineno-97-96" name="__codelineno-97-96" href="#__codelineno-97-96"></a><span class="w"> </span><span class="c1">// 返回被删除的元素</span>
<a id="__codelineno-97-97" name="__codelineno-97-97" href="#__codelineno-97-97"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">item</span><span class="p">;</span>
<a id="__codelineno-97-98" name="__codelineno-97-98" href="#__codelineno-97-98"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-99" name="__codelineno-97-99" href="#__codelineno-97-99"></a>
<a id="__codelineno-97-100" name="__codelineno-97-100" href="#__codelineno-97-100"></a><span class="w"> </span><span class="c1">// 将列表转换为数组</span>
<a id="__codelineno-97-101" name="__codelineno-97-101" href="#__codelineno-97-101"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">toArraySlice</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="p">[]</span><span class="kt">i32</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-102" name="__codelineno-97-102" href="#__codelineno-97-102"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">toOwnedSlice</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<a id="__codelineno-97-103" name="__codelineno-97-103" href="#__codelineno-97-103"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-104" name="__codelineno-97-104" href="#__codelineno-97-104"></a>
<a id="__codelineno-97-105" name="__codelineno-97-105" href="#__codelineno-97-105"></a><span class="w"> </span><span class="c1">// 将列表转换为数组</span>
<a id="__codelineno-97-106" name="__codelineno-97-106" href="#__codelineno-97-106"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">toArray</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="p">[]</span><span class="n">T</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-107" name="__codelineno-97-107" href="#__codelineno-97-107"></a><span class="w"> </span><span class="c1">// 仅转换有效长度范围内的列表元素</span>
<a id="__codelineno-97-108" name="__codelineno-97-108" href="#__codelineno-97-108"></a><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">arr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">mem_allocator</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span><span class="n">T</span><span class="p">,</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">size</span><span class="p">());</span>
<a id="__codelineno-97-109" name="__codelineno-97-109" href="#__codelineno-97-109"></a><span class="w"> </span><span class="nb">@memset</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span><span class="w"> </span><span class="nb">@as</span><span class="p">(</span><span class="n">T</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">));</span>
<a id="__codelineno-97-110" name="__codelineno-97-110" href="#__codelineno-97-110"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">arr</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">..)</span><span class="w"> </span><span class="o">|*</span><span class="n">num</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="o">|</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-111" name="__codelineno-97-111" href="#__codelineno-97-111"></a><span class="w"> </span><span class="n">num</span><span class="p">.</span><span class="o">*</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<a id="__codelineno-97-105" name="__codelineno-97-105" href="#__codelineno-97-105"></a><span class="w"> </span><span class="c1">// 返回新的切片并设置是否要重置或清空列表容器</span>
<a id="__codelineno-97-106" name="__codelineno-97-106" href="#__codelineno-97-106"></a><span class="w"> </span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">toOwnedSlice</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">clear</span><span class="o">:</span><span class="w"> </span><span class="kt">bool</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="p">[]</span><span class="kt">i32</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-107" name="__codelineno-97-107" href="#__codelineno-97-107"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">allocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">allocator</span><span class="p">;</span>
<a id="__codelineno-97-108" name="__codelineno-97-108" href="#__codelineno-97-108"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">old_memory</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">allocatedSlice</span><span class="p">();</span>
<a id="__codelineno-97-109" name="__codelineno-97-109" href="#__codelineno-97-109"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">allocator</span><span class="p">.</span><span class="n">remap</span><span class="p">(</span><span class="n">old_memory</span><span class="p">,</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="p">))</span><span class="w"> </span><span class="o">|</span><span class="n">new_items</span><span class="o">|</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-110" name="__codelineno-97-110" href="#__codelineno-97-110"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">clear</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-111" name="__codelineno-97-111" href="#__codelineno-97-111"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="o">*</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span>
<a id="__codelineno-97-112" name="__codelineno-97-112" href="#__codelineno-97-112"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-113" name="__codelineno-97-113" href="#__codelineno-97-113"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">arr</span><span class="p">;</span>
<a id="__codelineno-97-113" name="__codelineno-97-113" href="#__codelineno-97-113"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">new_items</span><span class="p">;</span>
<a id="__codelineno-97-114" name="__codelineno-97-114" href="#__codelineno-97-114"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-115" name="__codelineno-97-115" href="#__codelineno-97-115"></a><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-97-116" name="__codelineno-97-116" href="#__codelineno-97-116"></a><span class="p">}</span>
<a id="__codelineno-97-115" name="__codelineno-97-115" href="#__codelineno-97-115"></a>
<a id="__codelineno-97-116" name="__codelineno-97-116" href="#__codelineno-97-116"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">new_memory</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span><span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="p">);</span>
<a id="__codelineno-97-117" name="__codelineno-97-117" href="#__codelineno-97-117"></a><span class="w"> </span><span class="nb">@memcpy</span><span class="p">(</span><span class="n">new_memory</span><span class="p">,</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">);</span>
<a id="__codelineno-97-118" name="__codelineno-97-118" href="#__codelineno-97-118"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">clear</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-119" name="__codelineno-97-119" href="#__codelineno-97-119"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">clearAndFree</span><span class="p">();</span>
<a id="__codelineno-97-120" name="__codelineno-97-120" href="#__codelineno-97-120"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-121" name="__codelineno-97-121" href="#__codelineno-97-121"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">new_memory</span><span class="p">;</span>
<a id="__codelineno-97-122" name="__codelineno-97-122" href="#__codelineno-97-122"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-123" name="__codelineno-97-123" href="#__codelineno-97-123"></a>
<a id="__codelineno-97-124" name="__codelineno-97-124" href="#__codelineno-97-124"></a><span class="w"> </span><span class="c1">// 列表扩容</span>
<a id="__codelineno-97-125" name="__codelineno-97-125" href="#__codelineno-97-125"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">ensureTotalCapacity</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">new_capacity</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-126" name="__codelineno-97-126" href="#__codelineno-97-126"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">new_capacity</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a id="__codelineno-97-127" name="__codelineno-97-127" href="#__codelineno-97-127"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">capcacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="p">;</span>
<a id="__codelineno-97-128" name="__codelineno-97-128" href="#__codelineno-97-128"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">better_capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">capcacity</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">extend_ratio</span><span class="p">;</span>
<a id="__codelineno-97-129" name="__codelineno-97-129" href="#__codelineno-97-129"></a>
<a id="__codelineno-97-130" name="__codelineno-97-130" href="#__codelineno-97-130"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">old_memory</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">allocatedSlice</span><span class="p">();</span>
<a id="__codelineno-97-131" name="__codelineno-97-131" href="#__codelineno-97-131"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">allocator</span><span class="p">.</span><span class="n">remap</span><span class="p">(</span><span class="n">old_memory</span><span class="p">,</span><span class="w"> </span><span class="n">better_capacity</span><span class="p">))</span><span class="w"> </span><span class="o">|</span><span class="n">new_memory</span><span class="o">|</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-132" name="__codelineno-97-132" href="#__codelineno-97-132"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new_memory</span><span class="p">.</span><span class="n">ptr</span><span class="p">;</span>
<a id="__codelineno-97-133" name="__codelineno-97-133" href="#__codelineno-97-133"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new_memory</span><span class="p">.</span><span class="n">len</span><span class="p">;</span>
<a id="__codelineno-97-134" name="__codelineno-97-134" href="#__codelineno-97-134"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-135" name="__codelineno-97-135" href="#__codelineno-97-135"></a><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">new_memory</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">allocator</span><span class="p">.</span><span class="n">alloc</span><span class="p">(</span><span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="n">better_capacity</span><span class="p">);</span>
<a id="__codelineno-97-136" name="__codelineno-97-136" href="#__codelineno-97-136"></a><span class="w"> </span><span class="nb">@memcpy</span><span class="p">(</span><span class="n">new_memory</span><span class="p">[</span><span class="mi">0</span><span class="p">..</span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="p">],</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">);</span>
<a id="__codelineno-97-137" name="__codelineno-97-137" href="#__codelineno-97-137"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">old_memory</span><span class="p">);</span>
<a id="__codelineno-97-138" name="__codelineno-97-138" href="#__codelineno-97-138"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new_memory</span><span class="p">.</span><span class="n">ptr</span><span class="p">;</span>
<a id="__codelineno-97-139" name="__codelineno-97-139" href="#__codelineno-97-139"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new_memory</span><span class="p">.</span><span class="n">len</span><span class="p">;</span>
<a id="__codelineno-97-140" name="__codelineno-97-140" href="#__codelineno-97-140"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-141" name="__codelineno-97-141" href="#__codelineno-97-141"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-142" name="__codelineno-97-142" href="#__codelineno-97-142"></a>
<a id="__codelineno-97-143" name="__codelineno-97-143" href="#__codelineno-97-143"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">clearAndFree</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">Self</span><span class="p">,</span><span class="w"> </span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">)</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-144" name="__codelineno-97-144" href="#__codelineno-97-144"></a><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">allocatedSlice</span><span class="p">());</span>
<a id="__codelineno-97-145" name="__codelineno-97-145" href="#__codelineno-97-145"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a id="__codelineno-97-146" name="__codelineno-97-146" href="#__codelineno-97-146"></a><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a id="__codelineno-97-147" name="__codelineno-97-147" href="#__codelineno-97-147"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-148" name="__codelineno-97-148" href="#__codelineno-97-148"></a>
<a id="__codelineno-97-149" name="__codelineno-97-149" href="#__codelineno-97-149"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">allocatedSlice</span><span class="p">(</span><span class="n">self</span><span class="o">:</span><span class="w"> </span><span class="n">Self</span><span class="p">)</span><span class="w"> </span><span class="p">[]</span><span class="kt">i32</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-97-150" name="__codelineno-97-150" href="#__codelineno-97-150"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">self</span><span class="p">.</span><span class="n">items</span><span class="p">.</span><span class="n">ptr</span><span class="p">[</span><span class="mi">0</span><span class="p">..</span><span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="p">];</span>
<a id="__codelineno-97-151" name="__codelineno-97-151" href="#__codelineno-97-151"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-97-152" name="__codelineno-97-152" href="#__codelineno-97-152"></a><span class="p">};</span>
</code></pre></div>
</div>
</div>