1 type SafeSlice<T> @byval = 2 val ptr : Ptr<T> 3 val size : u32 4 val version : Ptr<u32> 5 val created_at : u32 6 7 let validate () = 8 assert version@value == created_at 9 10 fun get (i : u32) = 11 validate 12 ptr[i] 13 14 fun get (i : i32) = 15 validate 16 assert i >= 0 17 ptr[i] 18 19 fun get_ptr (i : u32) = 20 validate 21 ptr + i 22 23 fun get_ptr (i : i32) = 24 validate 25 assert i >= 0 26 ptr + i 27 28 def is_empty = size == 0 29 def is_not_empty = size <> 0 30 31 object SafeSlice<T> = 32 val empty = SafeSlice<T> null 0 null 0 33 let version = 0 34 35 def create (ptr : Ptr<T>) (size : u32) = 36 SafeSlice ptr size version@ptr 0 37 38 type SafeSliceIterator<T> = 39 inherit Iterator<T> 40 41 let slice : SafeSlice<T> 42 let mut index = -1 43 44 def Iterator.move_next = 45 index += 1 46 index < slice.size 47 48 def Iterator.get_value = 49 slice[index] 50 51 type SafeSlice<T> 52 def try_size = Some size |> as_option 53 def get_iterator = SafeSliceIterator<T> self 54 55 is Iterable<T> 56