Warning, /frameworks/syntax-highlighting/autotests/folding/highlight.cr.fold is written in an unsupported language. File is not indexed.

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