"""Primitive set (and frozenset) ops.""" from __future__ import annotations from mypyc.ir.ops import ERR_FALSE, ERR_MAGIC from mypyc.ir.rtypes import ( bit_rprimitive, bool_rprimitive, c_int_rprimitive, object_rprimitive, pointer_rprimitive, set_rprimitive, ) from mypyc.primitives.registry import ( ERR_NEG_INT, binary_op, function_op, load_address_op, method_op, ) # Get the 'builtins.set' type object. load_address_op(name="builtins.set", type=object_rprimitive, src="PySet_Type") # Get the 'builtins.frozenset' tyoe object. load_address_op(name="builtins.frozenset", type=object_rprimitive, src="PyFrozenSet_Type") # Construct an empty set. new_set_op = function_op( name="builtins.set", arg_types=[], return_type=set_rprimitive, c_function_name="PySet_New", error_kind=ERR_MAGIC, extra_int_constants=[(0, pointer_rprimitive)], ) # set(obj) function_op( name="builtins.set", arg_types=[object_rprimitive], return_type=set_rprimitive, c_function_name="PySet_New", error_kind=ERR_MAGIC, ) # frozenset(obj) function_op( name="builtins.frozenset", arg_types=[object_rprimitive], return_type=object_rprimitive, c_function_name="PyFrozenSet_New", error_kind=ERR_MAGIC, ) # item in set set_in_op = binary_op( name="in", arg_types=[object_rprimitive, set_rprimitive], return_type=c_int_rprimitive, c_function_name="PySet_Contains", error_kind=ERR_NEG_INT, truncated_type=bool_rprimitive, ordering=[1, 0], ) # set.remove(obj) method_op( name="remove", arg_types=[set_rprimitive, object_rprimitive], return_type=bit_rprimitive, c_function_name="CPySet_Remove", error_kind=ERR_FALSE, ) # set.discard(obj) method_op( name="discard", arg_types=[set_rprimitive, object_rprimitive], return_type=c_int_rprimitive, c_function_name="PySet_Discard", error_kind=ERR_NEG_INT, ) # set.add(obj) set_add_op = method_op( name="add", arg_types=[set_rprimitive, object_rprimitive], return_type=c_int_rprimitive, c_function_name="PySet_Add", error_kind=ERR_NEG_INT, ) # set.update(obj) # # This is not a public API but looks like it should be fine. set_update_op = method_op( name="update", arg_types=[set_rprimitive, object_rprimitive], return_type=c_int_rprimitive, c_function_name="_PySet_Update", error_kind=ERR_NEG_INT, ) # set.clear() method_op( name="clear", arg_types=[set_rprimitive], return_type=c_int_rprimitive, c_function_name="PySet_Clear", error_kind=ERR_NEG_INT, ) # set.pop() method_op( name="pop", arg_types=[set_rprimitive], return_type=object_rprimitive, c_function_name="PySet_Pop", error_kind=ERR_MAGIC, )