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 object SafeSlice<T> = 29 val empty = SafeSlice<T> null 0 null 0 30 let version = 0 31 32 def create (ptr : Ptr<T>) (size : u32) = 33 SafeSlice ptr size version@ptr 0 34 35 type SafeSliceIterator<T> = 36 inherit Iterator<T> 37 38 let slice : SafeSlice<T> 39 let mut index = -1 40 41 def Iterator.move_next = 42 index += 1 43 index < slice.size 44 45 def Iterator.get_value = 46 slice[index] 47 48 type SafeSlice<T> 49 def try_size = Some size |> as_option 50 def get_iterator = SafeSliceIterator<T> self 51 52 is Iterable<T> 53