def set_constructor(context, builder, sig, args): set_type = sig.return_type items_type, = sig.args items, = args # If the argument has a len(), preallocate the set so as to # avoid resizes. n = call_len(context, builder, items_type, items) inst = SetInstance.allocate(context, builder, set_type, n) with for_iter(context, builder, items_type, items) as loop: inst.add(loop.value) return impl_ret_new_ref(context, builder, set_type, inst.value)
def set_update(context, builder, sig, args): inst = SetInstance(context, builder, sig.args[0], args[0]) items_type = sig.args[1] items = args[1] # If the argument has a len(), assume there are few collisions and # presize to len(set) + len(items) n = call_len(context, builder, items_type, items) if n is not None: new_size = builder.add(inst.payload.used, n) inst.upsize(new_size) with for_iter(context, builder, items_type, items) as loop: inst.add(loop.value) if n is not None: # If we pre-grew the set, downsize in case there were many collisions inst.downsize(inst.payload.used) return context.get_dummy_value()