Warning, file /frameworks/syntax-highlighting/autotests/html/highlight.cr.dark.html was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 <!DOCTYPE html>
0002 <html><head>
0003 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
0004 <title>highlight.cr</title>
0005 <meta name="generator" content="KF5::SyntaxHighlighting - Definition (Crystal) - Theme (Breeze Dark)"/>
0006 </head><body style="background-color:#232629;color:#cfcfc2"><pre>
0007 <span style="color:#7a7c7d;"># This file is a testcase for the highlighting of Crystal code</span>
0008 <span style="color:#7a7c7d;"># It's not executable code, but a collection of code snippets</span>
0009 <span style="color:#7a7c7d;">#</span>
0010 
0011 <span style="color:#8e44ad;font-weight:bold;">require</span> <span style="color:#f44f4f;">&quot;lib_z&quot;</span>
0012 <span style="color:#8e44ad;font-weight:bold;">require</span> <span style="color:#f44f4f;">&quot;./digest&quot;</span>
0013 
0014 <span style="color:#fdbc4b;font-weight:bold;">module</span> <span style="color:#2980b9;">Digest</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">Adler32</span>
0015   <span style="color:#fdbc4b;font-weight:bold;">def</span> <span style="color:#f67400;">self</span><span style="color:#2980b9;">.initial</span> : <span style="color:#2980b9;">UInt32</span>
0016     <span style="color:#2980b9;">LibZ</span><span style="color:#2980b9;">.adler32</span>(<span style="color:#f67400;">0</span>, <span style="color:#f67400;">nil</span>, <span style="color:#f67400;">0</span>)<span style="color:#2980b9;">.to_u32</span>
0017   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0018 
0019   <span style="color:#fdbc4b;font-weight:bold;">def</span> <span style="color:#f67400;">self</span><span style="color:#2980b9;">.checksum</span>(data) : <span style="color:#2980b9;">UInt32</span>
0020     update(data, initial)
0021   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0022 
0023   <span style="color:#fdbc4b;font-weight:bold;">def</span> <span style="color:#f67400;">self</span><span style="color:#2980b9;">.update</span>(data, adler32 : <span style="color:#2980b9;">UInt32</span>) : <span style="color:#2980b9;">UInt32</span>
0024     slice <span style="font-weight:bold;">=</span> data<span style="color:#2980b9;">.to_slice</span>
0025     <span style="color:#2980b9;">LibZ</span><span style="color:#2980b9;">.adler32</span>(adler32, slice, slice<span style="color:#2980b9;">.size</span>)<span style="color:#2980b9;">.to_u32</span>
0026   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0027 
0028   <span style="color:#fdbc4b;font-weight:bold;">def</span> <span style="color:#f67400;">self</span><span style="color:#2980b9;">.combine</span>(adler1 : <span style="color:#2980b9;">UInt32</span>, adler2 : <span style="color:#2980b9;">UInt32</span>, len) : <span style="color:#2980b9;">UInt32</span>
0029     <span style="color:#2980b9;">LibZ</span><span style="color:#2980b9;">.adler32_combine</span>(adler1, adler2, len)<span style="color:#2980b9;">.to_u32</span>
0030   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0031 <span style="color:#fdbc4b;font-weight:bold;">end</span>
0032 
0033 <span style="color:#fdbc4b;font-weight:bold;">struct</span> <span style="color:#2980b9;">BigRational</span>
0034   <span style="color:#2980b9;">Number</span><span style="color:#2980b9;">.expand_div</span> <span style="font-weight:bold;">[</span><span style="color:#2980b9;">Int8</span>, <span style="color:#2980b9;">UInt8</span>, <span style="color:#2980b9;">Int16</span>, <span style="color:#2980b9;">UInt16</span>, <span style="color:#2980b9;">Int32</span>, <span style="color:#2980b9;">UInt32</span>, <span style="color:#2980b9;">Int64</span>, <span style="color:#2980b9;">UInt64</span>, <span style="color:#2980b9;">Int128</span>, <span style="color:#2980b9;">UInt128</span><span style="font-weight:bold;">]</span>, <span style="color:#2980b9;">BigRational</span>
0035   <span style="color:#2980b9;">Number</span><span style="color:#2980b9;">.expand_div</span> <span style="font-weight:bold;">[</span><span style="color:#2980b9;">Float32</span>, <span style="color:#2980b9;">Float64</span><span style="font-weight:bold;">]</span>, <span style="color:#2980b9;">BigRational</span>
0036 <span style="color:#fdbc4b;font-weight:bold;">end</span>
0037 
0038 <span style="color:#fdbc4b;font-weight:bold;">module</span> <span style="color:#2980b9;">Crystal</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">Repl</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">Closure</span>
0039   <span style="color:#27aeae;font-weight:bold;">VAR_NAME</span> <span style="font-weight:bold;">=</span> <span style="color:#f44f4f;">&quot;.closure_var&quot;</span>
0040   <span style="color:#27aeae;font-weight:bold;">ARG_NAME</span> <span style="font-weight:bold;">=</span> <span style="color:#f44f4f;">&quot;.closure_arg&quot;</span>
0041 <span style="color:#fdbc4b;font-weight:bold;">end</span>
0042 
0043 <span style="color:#fdbc4b;font-weight:bold;">class</span> <span style="color:#2980b9;">FunctionType</span>
0044   <span style="color:#27ae60;">getter</span> arg_types : <span style="color:#2980b9;">Array</span>(<span style="color:#2980b9;">ArgType</span>)
0045   <span style="color:#27ae60;">getter</span> return_type : <span style="color:#2980b9;">ArgType</span>
0046 
0047   <span style="color:#27ae60;">@@cvar</span> <span style="font-weight:bold;">=</span> <span style="color:#f67400;">3</span>
0048   <span style="color:#27ae60;">@ivar</span> <span style="font-weight:bold;">=</span> <span style="color:#f67400;">7</span>
0049 
0050   <span style="color:#fdbc4b;font-weight:bold;">def</span> initialize(<span style="color:#27ae60;">@arg_types</span>, <span style="color:#27ae60;">@return_type</span>)
0051   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0052 
0053   <span style="color:#fdbc4b;font-weight:bold;">def</span> /<span style="color:#da4453;">/(other : Int::Unsigned) : BigInt</span>
0054 <span style="color:#da4453;">    check_division_by_zero other</span>
0055 <span style="color:#da4453;">    unsafe_floored_div(other)</span>
0056 <span style="color:#da4453;">  end</span>
0057 
0058 <span style="color:#da4453;">  def /</span><span style="font-weight:bold;">/</span>(other : <span style="color:#2980b9;">Int</span>) : <span style="color:#2980b9;">BigInt</span>
0059     check_division_by_zero other
0060 
0061     <span style="color:#fdbc4b;font-weight:bold;">if</span> other <span style="font-weight:bold;">&lt;</span> <span style="color:#f67400;">0</span>
0062       (<span style="font-weight:bold;">-</span><span style="color:#f67400;">self</span>)<span style="color:#2980b9;">.unsafe_floored_div</span>(<span style="font-weight:bold;">-</span>other)
0063       <span style="color:#27ae60;">@cvar</span> <span style="font-weight:bold;">+=</span> <span style="color:#f67400;">1</span>
0064     <span style="color:#fdbc4b;font-weight:bold;">else</span>
0065       unsafe_floored_div(other)
0066      <span style="color:#27ae60;">@ivar</span> <span style="font-weight:bold;">+=</span> <span style="color:#f67400;">10</span>
0067     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0068   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0069 <span style="color:#fdbc4b;font-weight:bold;">end</span>
0070 
0071 <span style="color:#8e44ad;font-weight:bold;">require</span> <span style="color:#f44f4f;">&quot;llvm/enums/atomic&quot;</span>
0072 <span style="color:#fdbc4b;font-weight:bold;">struct</span> <span style="color:#2980b9;">Atomic</span>(T)
0073   <span style="color:#7a7c7d;"># Creates an Atomic with the given initial value.</span>
0074   <span style="color:#fdbc4b;font-weight:bold;">def</span> compare_and_set(cmp : T, new : T) : <span style="font-weight:bold;">{</span>T, <span style="color:#2980b9;">Bool</span><span style="font-weight:bold;">}</span>
0075     <span style="font-weight:bold;">{%</span> <span style="color:#fdbc4b;font-weight:bold;">if</span> T<span style="color:#2980b9;">.union?</span> <span style="font-weight:bold;">&amp;&amp;</span> T<span style="color:#2980b9;">.union_types.all?</span> <span style="font-weight:bold;">{</span> <span style="font-weight:bold;">|</span>t<span style="font-weight:bold;">|</span> t <span style="font-weight:bold;">==</span> <span style="color:#2980b9;">Nil</span> <span style="font-weight:bold;">||</span> t <span style="font-weight:bold;">&lt;</span> <span style="color:#2980b9;">Reference</span> <span style="font-weight:bold;">}</span> <span style="font-weight:bold;">%}</span>
0076       address, success <span style="font-weight:bold;">=</span> <span style="color:#2980b9;">Ops</span><span style="color:#2980b9;">.cmpxchg</span>(pointerof(<span style="color:#27ae60;">@value</span>)<span style="color:#2980b9;">.as</span>(<span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">SizeT</span><span style="font-weight:bold;">*</span>), <span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">SizeT</span><span style="color:#2980b9;">.new</span>(cmp<span style="color:#2980b9;">.as</span>(T)<span style="color:#2980b9;">.object_id</span>), <span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">SizeT</span><span style="color:#2980b9;">.new</span>(new<span style="color:#2980b9;">.as</span>(T)<span style="color:#2980b9;">.object_id</span>), <span style="color:#da4453;">:sequentially_consistent</span>, <span style="color:#da4453;">:sequentially_consistent</span>)
0077       <span style="font-weight:bold;">{</span>address <span style="font-weight:bold;">==</span> <span style="color:#f67400;">0</span> ? <span style="color:#f67400;">nil</span> : <span style="color:#2980b9;">Pointer</span>(T)<span style="color:#2980b9;">.new</span>(address)<span style="color:#2980b9;">.as</span>(T), success<span style="font-weight:bold;">}</span>
0078     <span style="font-weight:bold;">{%</span> <span style="color:#fdbc4b;font-weight:bold;">elsif</span> T <span style="font-weight:bold;">&lt;</span> <span style="color:#2980b9;">Reference</span> <span style="font-weight:bold;">%}</span>
0079       <span style="color:#7a7c7d;"># Use addresses again (but this can't return nil)</span>
0080       address, success <span style="font-weight:bold;">=</span> <span style="color:#2980b9;">Ops</span><span style="color:#2980b9;">.cmpxchg</span>(pointerof(<span style="color:#27ae60;">@value</span>)<span style="color:#2980b9;">.as</span>(<span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">SizeT</span><span style="font-weight:bold;">*</span>), <span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">SizeT</span><span style="color:#2980b9;">.new</span>(cmp<span style="color:#2980b9;">.as</span>(T)<span style="color:#2980b9;">.object_id</span>), <span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">SizeT</span><span style="color:#2980b9;">.new</span>(new<span style="color:#2980b9;">.as</span>(T)<span style="color:#2980b9;">.object_id</span>), <span style="color:#da4453;">:sequentially_consistent</span>, <span style="color:#da4453;">:sequentially_consistent</span>)
0081       <span style="font-weight:bold;">{</span><span style="color:#2980b9;">Pointer</span>(T)<span style="color:#2980b9;">.new</span>(address)<span style="color:#2980b9;">.as</span>(T), success<span style="font-weight:bold;">}</span>
0082     <span style="font-weight:bold;">{%</span> <span style="color:#fdbc4b;font-weight:bold;">else</span> <span style="font-weight:bold;">%}</span>
0083       <span style="color:#2980b9;">Ops</span><span style="color:#2980b9;">.cmpxchg</span>(pointerof(<span style="color:#27ae60;">@value</span>), cmp, new, <span style="color:#da4453;">:sequentially_consistent</span>, <span style="color:#da4453;">:sequentially_consistent</span>)
0084     <span style="font-weight:bold;">{%</span> <span style="color:#fdbc4b;font-weight:bold;">end</span> <span style="font-weight:bold;">%}</span>
0085   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0086 
0087   <span style="color:#fdbc4b;font-weight:bold;">def</span> swap(value : T)
0088     <span style="font-weight:bold;">{%</span> <span style="color:#fdbc4b;font-weight:bold;">if</span> T<span style="color:#2980b9;">.union?</span> <span style="font-weight:bold;">&amp;&amp;</span> T<span style="color:#2980b9;">.union_types.all?</span> <span style="font-weight:bold;">{</span> <span style="font-weight:bold;">|</span>t<span style="font-weight:bold;">|</span> t <span style="font-weight:bold;">==</span> <span style="color:#2980b9;">Nil</span> <span style="font-weight:bold;">||</span> t <span style="font-weight:bold;">&lt;</span> <span style="color:#2980b9;">Reference</span> <span style="font-weight:bold;">}</span> <span style="font-weight:bold;">||</span> T <span style="font-weight:bold;">&lt;</span> <span style="color:#2980b9;">Reference</span> <span style="font-weight:bold;">%}</span>
0089       address <span style="font-weight:bold;">=</span> <span style="color:#2980b9;">Ops</span><span style="color:#2980b9;">.atomicrmw</span>(<span style="color:#da4453;">:xchg</span>, pointerof(<span style="color:#27ae60;">@value</span>)<span style="color:#2980b9;">.as</span>(<span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">SizeT</span><span style="font-weight:bold;">*</span>), <span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">SizeT</span><span style="color:#2980b9;">.new</span>(value<span style="color:#2980b9;">.as</span>(T)<span style="color:#2980b9;">.object_id</span>), <span style="color:#da4453;">:sequentially_consistent</span>, <span style="color:#f67400;">false</span>)
0090       <span style="color:#2980b9;">Pointer</span>(T)<span style="color:#2980b9;">.new</span>(address)<span style="color:#2980b9;">.as</span>(T)
0091     <span style="font-weight:bold;">{%</span> <span style="color:#fdbc4b;font-weight:bold;">else</span> <span style="font-weight:bold;">%}</span>
0092       <span style="color:#2980b9;">Ops</span><span style="color:#2980b9;">.atomicrmw</span>(<span style="color:#da4453;">:xchg</span>, pointerof(<span style="color:#27ae60;">@value</span>), value, <span style="color:#da4453;">:sequentially_consistent</span>, <span style="color:#f67400;">false</span>)
0093     <span style="font-weight:bold;">{%</span> <span style="color:#fdbc4b;font-weight:bold;">end</span> <span style="font-weight:bold;">%}</span>
0094   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0095 <span style="color:#fdbc4b;font-weight:bold;">end</span>
0096 
0097 <span style="color:#fdbc4b;font-weight:bold;">class</span> <span style="color:#2980b9;">Deque</span>(T)
0098   <span style="color:#8e44ad;font-weight:bold;">include</span> <span style="color:#2980b9;">Indexable</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">Mutable</span>(T)
0099 
0100   <span style="color:#27ae60;">@start</span> <span style="font-weight:bold;">=</span> <span style="color:#f67400;">0</span>
0101   <span style="color:#2980b9;font-weight:bold;">protected</span> <span style="color:#27ae60;">setter</span> size
0102   <span style="color:#2980b9;font-weight:bold;">private</span> <span style="color:#27ae60;">getter</span> buffer
0103 
0104   <span style="color:#fdbc4b;font-weight:bold;">def</span> initialize(size : <span style="color:#2980b9;">Int</span>, value : T)
0105     <span style="color:#fdbc4b;font-weight:bold;">if</span> size <span style="font-weight:bold;">&lt;</span> <span style="color:#f67400;">0</span>
0106       <span style="color:#8e44ad;font-weight:bold;">raise</span> <span style="color:#2980b9;">ArgumentError</span><span style="color:#2980b9;">.new</span>(<span style="color:#f44f4f;">&quot;Negative deque size: </span><span style="color:#3daee9;">#{</span>size<span style="color:#3daee9;">}</span><span style="color:#f44f4f;">&quot;</span>)
0107     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0108     <span style="color:#27ae60;">@size</span> <span style="font-weight:bold;">=</span> size<span style="color:#2980b9;">.to_i</span>
0109     <span style="color:#27ae60;">@capacity</span> <span style="font-weight:bold;">=</span> size<span style="color:#2980b9;">.to_i</span>
0110 
0111     <span style="color:#fdbc4b;font-weight:bold;">unless</span> <span style="color:#27ae60;">@capacity</span> <span style="font-weight:bold;">==</span> <span style="color:#f67400;">0</span>
0112       <span style="color:#27ae60;">@buffer</span> <span style="font-weight:bold;">=</span> <span style="color:#2980b9;">Pointer</span>(T)<span style="color:#2980b9;">.malloc</span>(<span style="color:#27ae60;">@capacity</span>, value)
0113     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0114   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0115 
0116   <span style="color:#7a7c7d;"># Returns a new `Deque` that has this deque's elements cloned.</span>
0117   <span style="color:#7a7c7d;"># That is, it returns a deep copy of this deque.</span>
0118   <span style="color:#7a7c7d;">#</span>
0119   <span style="color:#7a7c7d;"># Use `#dup` if you want a shallow copy.</span>
0120   <span style="color:#fdbc4b;font-weight:bold;">def</span> clone
0121     <span style="font-weight:bold;">{%</span> <span style="color:#fdbc4b;font-weight:bold;">if</span> T <span style="font-weight:bold;">==</span> <span style="font-weight:bold;">::</span><span style="color:#2980b9;">Bool</span> <span style="font-weight:bold;">||</span> T <span style="font-weight:bold;">==</span> <span style="font-weight:bold;">::</span><span style="color:#2980b9;">Char</span> <span style="font-weight:bold;">||</span> T <span style="font-weight:bold;">==</span> <span style="font-weight:bold;">::</span><span style="color:#2980b9;">String</span> <span style="font-weight:bold;">||</span> T <span style="font-weight:bold;">==</span> <span style="font-weight:bold;">::</span><span style="color:#2980b9;">Symbol</span> <span style="font-weight:bold;">||</span> T <span style="font-weight:bold;">&lt;</span> <span style="font-weight:bold;">::</span><span style="color:#2980b9;">Number</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">Primitive</span> <span style="font-weight:bold;">%</span><span style="font-weight:bold;">}</span>
0122       <span style="color:#2980b9;">Deque</span>(T)<span style="color:#2980b9;">.new</span>(size) <span style="font-weight:bold;">{</span> <span style="font-weight:bold;">|</span>i<span style="font-weight:bold;">|</span> <span style="color:#f67400;">self</span><span style="font-weight:bold;">[</span>i<span style="font-weight:bold;">]</span><span style="color:#2980b9;">.clone.as</span>(T) <span style="font-weight:bold;">}</span>
0123     <span style="font-weight:bold;">{</span>% <span style="color:#fdbc4b;font-weight:bold;">else</span> %<span style="font-weight:bold;">}</span>
0124       exec_recursive_clone <span style="color:#fdbc4b;font-weight:bold;">do</span> <span style="font-weight:bold;">|</span>hash<span style="font-weight:bold;">|</span>
0125         clone <span style="font-weight:bold;">=</span> <span style="color:#2980b9;">Deque</span>(T)<span style="color:#2980b9;">.new</span>(size)
0126         each <span style="color:#fdbc4b;font-weight:bold;">do</span> <span style="font-weight:bold;">|</span>element<span style="font-weight:bold;">|</span>
0127           clone <span style="font-weight:bold;">&lt;&lt;</span> element<span style="color:#2980b9;">.clone</span>
0128         <span style="color:#fdbc4b;font-weight:bold;">end</span>
0129         clone
0130       <span style="color:#fdbc4b;font-weight:bold;">end</span>
0131     <span style="font-weight:bold;">{</span>% <span style="color:#fdbc4b;font-weight:bold;">end</span> %<span style="font-weight:bold;">}</span>
0132   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0133 
0134   <span style="color:#fdbc4b;font-weight:bold;">def</span> delete_at(index : <span style="color:#2980b9;">Int</span>) : T
0135     <span style="color:#fdbc4b;font-weight:bold;">unless</span> <span style="color:#f67400;">0</span> <span style="font-weight:bold;">&lt;=</span> index <span style="font-weight:bold;">&lt;</span> @size
0136       raise <span style="color:#2980b9;">IndexError</span><span style="color:#2980b9;">.new</span>
0137     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0138     <span style="color:#fdbc4b;font-weight:bold;">return</span> shift <span style="color:#fdbc4b;font-weight:bold;">if</span> index <span style="font-weight:bold;">==</span> <span style="color:#f67400;">0</span>
0139 
0140     <span style="color:#fdbc4b;font-weight:bold;">if</span> index <span style="font-weight:bold;">&gt;</span> @size <span style="font-weight:bold;">//</span> <span style="color:#f67400;">2</span>
0141       <span style="color:#7a7c7d;"># Move following items to the left, starting with the first one</span>
0142       <span style="color:#7a7c7d;"># [56-01234] -&gt; [6x-01235]</span>
0143       dst <span style="font-weight:bold;">=</span> rindex
0144       finish <span style="font-weight:bold;">=</span> (@start <span style="font-weight:bold;">+</span> @size <span style="font-weight:bold;">-</span> <span style="color:#f67400;">1</span>) <span style="font-weight:bold;">%</span> @capacity
0145       loop <span style="color:#fdbc4b;font-weight:bold;">do</span>
0146         src <span style="font-weight:bold;">=</span> dst <span style="font-weight:bold;">+</span> <span style="color:#f67400;">1</span>
0147         src <span style="font-weight:bold;">-=</span> @capacity <span style="color:#fdbc4b;font-weight:bold;">if</span> src <span style="font-weight:bold;">&gt;=</span> @capacity
0148         @buffer<span style="font-weight:bold;">[</span>dst<span style="font-weight:bold;">]</span> <span style="font-weight:bold;">=</span> @buffer<span style="font-weight:bold;">[</span>src<span style="font-weight:bold;">]</span>
0149         <span style="color:#fdbc4b;font-weight:bold;">break</span> <span style="color:#fdbc4b;font-weight:bold;">if</span> src <span style="font-weight:bold;">==</span> finish
0150         dst <span style="font-weight:bold;">=</span> src
0151       <span style="color:#fdbc4b;font-weight:bold;">end</span>
0152       (@buffer <span style="font-weight:bold;">+</span> finish)<span style="color:#2980b9;">.clear</span>
0153     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0154 
0155   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0156 
0157   <span style="color:#fdbc4b;font-weight:bold;">def</span> each(<span style="font-weight:bold;">&amp; : </span>T <span style="font-weight:bold;">-&gt;</span>) : <span style="color:#2980b9;">Nil</span>
0158     halfs <span style="color:#fdbc4b;font-weight:bold;">do</span> <span style="font-weight:bold;">|</span>r<span style="font-weight:bold;">|</span>
0159       r<span style="color:#2980b9;">.each</span> <span style="color:#fdbc4b;font-weight:bold;">do</span> <span style="font-weight:bold;">|</span>i<span style="font-weight:bold;">|</span>
0160         <span style="color:#fdbc4b;font-weight:bold;">yield</span> @buffer<span style="font-weight:bold;">[</span>i<span style="font-weight:bold;">]</span>
0161       <span style="color:#fdbc4b;font-weight:bold;">end</span>
0162     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0163   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0164 
0165   <span style="color:#fdbc4b;font-weight:bold;">def</span> pop : T
0166     pop <span style="font-weight:bold;">{</span> <span style="color:#8e44ad;font-weight:bold;">raise</span> <span style="color:#2980b9;">IndexError</span><span style="color:#2980b9;">.new</span> <span style="font-weight:bold;">}</span>
0167   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0168 
0169 
0170   <span style="font-weight:bold;">macro</span> <span style="font-weight:bold;">[]</span>(<span style="font-weight:bold;">*</span>args)
0171     array <span style="font-weight:bold;">=</span> uninitialized <span style="color:#2980b9;">Array</span>(<span style="color:#2980b9;">Int32</span>)
0172     <span style="font-weight:bold;">{</span>% <span style="color:#fdbc4b;font-weight:bold;">for</span> arg, i <span style="color:#fdbc4b;font-weight:bold;">in</span> args %<span style="font-weight:bold;">}</span>
0173       array<span style="color:#2980b9;">.to_unsafe</span><span style="font-weight:bold;">[</span><span style="font-weight:bold;">{{</span>i<span style="font-weight:bold;">}}</span><span style="font-weight:bold;">]</span> <span style="font-weight:bold;">=</span> <span style="font-weight:bold;">{{</span>arg<span style="font-weight:bold;">}}</span>
0174     <span style="font-weight:bold;">{</span>% <span style="color:#fdbc4b;font-weight:bold;">end</span> %<span style="font-weight:bold;">}</span>
0175     array
0176   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0177 
0178     <span style="color:#fdbc4b;font-weight:bold;">def</span> message : <span style="color:#2980b9;">String</span>
0179         <span style="color:#fdbc4b;font-weight:bold;">case</span> <span style="color:#f67400;">self</span>
0180         <span style="color:#fdbc4b;font-weight:bold;">when</span> <span style="color:#27aeae;font-weight:bold;">SUCCESS</span>        <span style="color:#fdbc4b;font-weight:bold;">then</span> <span style="color:#f44f4f;">&quot;No error occurred. System call completed successfully.&quot;</span>
0181         <span style="color:#fdbc4b;font-weight:bold;">when</span> <span style="color:#27aeae;font-weight:bold;">TXTBSY</span>         <span style="color:#fdbc4b;font-weight:bold;">then</span> <span style="color:#2980b9;">Errno</span><span style="font-weight:bold;">::</span><span style="color:#27aeae;">ETXTBSY</span>
0182         <span style="color:#fdbc4b;font-weight:bold;">when</span> <span style="color:#27aeae;font-weight:bold;">NOTCAPABLE</span>     <span style="color:#fdbc4b;font-weight:bold;">then</span> <span style="color:#2980b9;">Errno</span><span style="font-weight:bold;">::</span><span style="color:#27aeae;">ENOTCAPABLE</span>
0183         <span style="color:#fdbc4b;font-weight:bold;">else</span>                     <span style="color:#2980b9;">Errno</span><span style="font-weight:bold;">::</span><span style="color:#27aeae;">EINVAL</span>
0184         <span style="color:#fdbc4b;font-weight:bold;">end</span>
0185     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0186 
0187     enum <span style="color:#2980b9;">Signal</span>
0188         <span style="color:#27aeae;font-weight:bold;">KILL</span> <span style="font-weight:bold;">=</span> <span style="color:#f67400;">0</span>
0189         <span style="color:#27aeae;font-weight:bold;">BILL</span> <span style="font-weight:bold;">=</span> <span style="color:#f67400;">101</span>
0190     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0191 
0192 <span style="color:#fdbc4b;font-weight:bold;">end</span>
0193 
0194 
0195   <span style="color:#7a7c7d;"># :nodoc:</span>
0196 <span style="font-weight:bold;">module</span> <span style="color:#2980b9;">Ops</span>
0197     <span style="color:#7a7c7d;"># Defines methods that directly map to LLVM instructions related to atomic operations.</span>
0198 
0199     @<span style="font-weight:bold;">[</span><span style="color:#2980b9;">Primitive</span>(<span style="color:#da4453;">:cmpxchg</span>)<span style="font-weight:bold;">]</span>
0200     <span style="color:#fdbc4b;font-weight:bold;">def</span> <span style="color:#f67400;">self</span><span style="color:#2980b9;">.cmpxchg</span>(ptr : T<span style="font-weight:bold;">*</span>, cmp : T, new : T, success_ordering : <span style="color:#27aeae;font-weight:bold;">LLVM</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">AtomicOrdering</span>, failure_ordering : <span style="color:#27aeae;font-weight:bold;">LLVM</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">AtomicOrdering</span>) : <span style="font-weight:bold;">{</span>T, <span style="color:#2980b9;">Bool</span><span style="font-weight:bold;">}</span> forall T
0201     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0202 
0203     @<span style="font-weight:bold;">[</span><span style="color:#2980b9;">Primitive</span>(<span style="color:#da4453;">:atomicrmw</span>)<span style="font-weight:bold;">]</span>
0204     <span style="color:#fdbc4b;font-weight:bold;">def</span> <span style="color:#f67400;">self</span><span style="color:#2980b9;">.atomicrmw</span>(op : <span style="color:#27aeae;font-weight:bold;">LLVM</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">AtomicRMWBinOp</span>, ptr : T<span style="font-weight:bold;">*</span>, val : T, ordering : <span style="color:#27aeae;font-weight:bold;">LLVM</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">AtomicOrdering</span>, singlethread : <span style="color:#2980b9;">Bool</span>) : T forall T
0205     <span style="color:#fdbc4b;font-weight:bold;">end</span>
0206 <span style="color:#fdbc4b;font-weight:bold;">end</span>
0207 
0208 
0209 @<span style="font-weight:bold;">[</span><span style="color:#2980b9;">Link</span>(<span style="color:#f44f4f;">&quot;z&quot;</span>)<span style="font-weight:bold;">]</span>
0210 lib <span style="color:#2980b9;">LibZ</span>
0211   <span style="font-weight:bold;">alias</span> <span style="color:#2980b9;">Char</span> <span style="font-weight:bold;">=</span> <span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">Char</span>
0212   <span style="font-weight:bold;">alias</span> <span style="color:#2980b9;">SizeT</span> <span style="font-weight:bold;">=</span> <span style="color:#2980b9;">LibC</span><span style="font-weight:bold;">::</span><span style="color:#2980b9;">SizeT</span>
0213 
0214   fun zlibVersion : <span style="color:#2980b9;">Char</span><span style="font-weight:bold;">*</span>
0215   fun crc32_combine(crc1 : <span style="color:#2980b9;">ULong</span>, crc2 : <span style="color:#2980b9;">ULong</span>, len : <span style="color:#2980b9;">Long</span>) : <span style="color:#2980b9;">ULong</span>
0216 
0217   <span style="font-weight:bold;">alias</span> <span style="color:#2980b9;">AllocFunc</span> <span style="font-weight:bold;">=</span> <span style="color:#2980b9;">Void</span><span style="font-weight:bold;">*</span>, <span style="color:#2980b9;">UInt</span>, <span style="color:#2980b9;">UInt</span> <span style="font-weight:bold;">-&gt;</span> <span style="color:#2980b9;">Void</span><span style="font-weight:bold;">*</span>
0218   <span style="font-weight:bold;">alias</span> <span style="color:#2980b9;">FreeFunc</span> <span style="font-weight:bold;">=</span> (<span style="color:#2980b9;">Void</span><span style="font-weight:bold;">*</span>, <span style="color:#2980b9;">Void</span><span style="font-weight:bold;">*</span>) <span style="font-weight:bold;">-&gt;</span>
0219 
0220   <span style="font-weight:bold;">struct</span> <span style="color:#2980b9;">ZStream</span>
0221     next_in : <span style="color:#2980b9;">Bytef</span><span style="font-weight:bold;">*</span>
0222     avail_in : <span style="color:#2980b9;">UInt</span>
0223     next_out : <span style="color:#2980b9;">Bytef</span><span style="font-weight:bold;">*</span>
0224     total_out : <span style="color:#2980b9;">ULong</span>
0225     msg : <span style="color:#2980b9;">Char</span><span style="font-weight:bold;">*</span>
0226     state : <span style="color:#2980b9;">Void</span><span style="font-weight:bold;">*</span>
0227     zalloc : <span style="color:#2980b9;">AllocFunc</span>
0228     zfree : <span style="color:#2980b9;">FreeFunc</span>
0229     opaque : <span style="color:#2980b9;">Void</span><span style="font-weight:bold;">*</span>
0230     data_type : <span style="color:#2980b9;">Int</span>
0231     adler : <span style="color:#2980b9;">Long</span>
0232   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0233 
0234   <span style="color:#7a7c7d;"># error codes</span>
0235   enum <span style="color:#2980b9;">Error</span>
0236     <span style="color:#27aeae;font-weight:bold;">OK</span>            <span style="font-weight:bold;">=</span>  <span style="color:#f67400;">0</span>
0237     <span style="color:#27aeae;font-weight:bold;">VERSION_ERROR</span> <span style="font-weight:bold;">=</span> <span style="font-weight:bold;">-</span><span style="color:#f67400;">6</span>
0238   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0239 
0240   enum <span style="color:#2980b9;">Flush</span>
0241     <span style="color:#27aeae;font-weight:bold;">NO_FLUSH</span>      <span style="font-weight:bold;">=</span> <span style="color:#f67400;">0</span>
0242     <span style="color:#27aeae;font-weight:bold;">TREES</span>         <span style="font-weight:bold;">=</span> <span style="color:#f67400;">6</span>
0243   <span style="color:#fdbc4b;font-weight:bold;">end</span>
0244 
0245   <span style="color:#27aeae;font-weight:bold;">MAX_BITS</span>      <span style="font-weight:bold;">=</span> <span style="color:#f67400;">15</span>
0246 
0247   fun deflateInit2 <span style="font-weight:bold;">=</span> deflateInit2_(stream : <span style="color:#2980b9;">ZStream</span><span style="font-weight:bold;">*</span>, level : <span style="color:#2980b9;">Int32</span>, method : <span style="color:#2980b9;">Int32</span>,
0248                                    window_bits : <span style="color:#2980b9;">Int32</span>, mem_level : <span style="color:#2980b9;">Int32</span>, strategy : <span style="color:#2980b9;">Int32</span>,
0249                                    version : <span style="color:#2980b9;">UInt8</span><span style="font-weight:bold;">*</span>, stream_size : <span style="color:#2980b9;">Int32</span>) : <span style="color:#2980b9;">Error</span>
0250   fun deflate(stream : <span style="color:#2980b9;">ZStream</span><span style="font-weight:bold;">*</span>, flush : <span style="color:#2980b9;">Flush</span>) : <span style="color:#2980b9;">Error</span>
0251   fun deflateSetDictionary(stream : <span style="color:#2980b9;">ZStream</span><span style="font-weight:bold;">*</span>, dictionary : <span style="color:#2980b9;">UInt8</span><span style="font-weight:bold;">*</span>, len : <span style="color:#2980b9;">UInt</span>) : <span style="color:#2980b9;">Int</span>
0252 
0253   fun inflateInit2 <span style="font-weight:bold;">=</span> inflateInit2_(stream : <span style="color:#2980b9;">ZStream</span><span style="font-weight:bold;">*</span>, window_bits : <span style="color:#2980b9;">Int32</span>, version : <span style="color:#2980b9;">UInt8</span><span style="font-weight:bold;">*</span>, stream_size : <span style="color:#2980b9;">Int32</span>) : <span style="color:#2980b9;">Error</span>
0254   fun inflate(stream : <span style="color:#2980b9;">ZStream</span><span style="font-weight:bold;">*</span>, flush : <span style="color:#2980b9;">Flush</span>) : <span style="color:#2980b9;">Error</span>
0255   fun inflateSetDictionary(stream : <span style="color:#2980b9;">ZStream</span><span style="font-weight:bold;">*</span>, dictionary : <span style="color:#2980b9;">UInt8</span><span style="font-weight:bold;">*</span>, len : <span style="color:#2980b9;">UInt</span>) : <span style="color:#2980b9;">Error</span>
0256 <span style="color:#fdbc4b;font-weight:bold;">end</span>
0257 </pre></body></html>