1    begin@ array
2    
3    type Array<T> @abstract @byval =
4        val size : u32
5        local ptr @param = kedr/alloc<T> size
6    
7        fun get (i : u32) = ptr[i]
8        fun get (i : i32) =
9            assert i >= 0
10           ptr[i]
11   
12       fun get_ptr (i : u32) = ptr as Ptr<T> + i
13       fun get_ptr (i : i32) =
14           assert i >= 0
15           ptr as Ptr<T> + i
16   
17       def as_ptr = ptr as Ptr<T>
18       def as_slice = Slice<T> ptr size
19   
20       def is_empty = size == 0
21       def is_not_empty = size <> 0
22   
23       def discard =
24           free@ ptr
25   
26   type MutArray<T> @[mut_of Array] @byval =
27       inherit Array<T>
28   
29       def as_mut_ptr = ptr
30       def as_mut_slice = MutSlice<T> ptr size
31   
32       fun get_mut_ptr (i : u32) = ptr + i
33       fun get_mut_ptr (i : i32) =
34           assert i >= 0
35           ptr + i
36   
37       fun set (i : u32) value =
38           ptr[i] = value
39   
40       fun set (i : i32) value =
41           assert i >= 0
42           ptr[i] = value
43   
44       def as_readonly = self as Array<T>
45   
46   object Array<T> =
47       val empty = Array<T> 0
48