1 type Set<T> @abstract = 2 include HashCollection<T, Entry<T>> 3 private all@ 4 public contains 5 internal first 6 array 7 8 var size : u32 = 0 9 var version : u32 = 0 10 11 def is_empty = size == 0 12 def is_not_empty = size <> 0 13 14 type MutSet<T> @[mut_of Set] = 15 inherit Set<T> 16 17 let put (x : T) = 18 let i = find_index x 19 if array[i].is_occupied then 20 false 21 else 22 let entry = Entry<T> key = x 23 f@ struct@zero 24 put entry 25 true 26 27 def insert (x : T) = 28 if array.size == 0 || size as f32 / array.size as f32 >= 0.7 then 29 rebuild 30 31 let result = put x 32 if result then 33 size += 1 34 35 version += 1 36 37 result 38 39 def add x = 40 let result = insert x 41 assert result 42 43 def remove x = 44 remove_key x 45 size -= 1 46 version += 1 47 48 def clear = 49 remove_all 50 size = 0 51 version += 1 52 53 def as_readonly = self as Set<T> 54