:- module rtti_implementation.
:- use_module builtin, int, list, private_builtin, require, std_util, string.
:- type (rtti_implementation:typeinfo_locn)
	--->	typeinfo_locn((builtin:c_pointer))
	.
:- type (rtti_implementation:type_layout)
	--->	type_layout((builtin:c_pointer))
	.
:- type (rtti_implementation:type_info)
	--->	type_info((builtin:c_pointer))
	.
:- type (rtti_implementation:type_functors)
	--->	type_functors((builtin:c_pointer))
	.
:- type (rtti_implementation:type_ctor_rep)
	--->	enum
	;	enum_usereq
	;	du
	;	du_usereq
	;	notag
	;	notag_usereq
	;	equiv
	;	(func)
	;	int
	;	char
	;	float
	;	string
	;	(pred)
	;	univ
	;	void
	;	c_pointer
	;	typeinfo
	;	typeclassinfo
	;	array
	;	succip
	;	hp
	;	curfr
	;	maxfr
	;	redofr
	;	redoip
	;	trail_ptr
	;	ticket
	;	notag_ground
	;	notag_ground_usereq
	;	equiv_ground
	;	tuple
	;	reserved_addr
	;	reserved_addr_usereq
	;	type_ctor_info
	;	base_typeclass_info
	;	type_desc
	;	type_ctor_desc
	;	foreign
	;	unknown
	.
:- type (rtti_implementation:type_ctor_info)
	--->	type_ctor_info((builtin:c_pointer))
	.
:- type (rtti_implementation:sectag_locn)
	--->	none
	;	local
	;	remote
	;	variable
	.
:- type (rtti_implementation:ptag_entry)
	--->	ptag_entry((builtin:c_pointer))
	.
:- type (rtti_implementation:pseudo_type_info)
	--->	pred_type((builtin:c_pointer))
	.
:- type (rtti_implementation:pred_type)
	--->	pred_type((builtin:c_pointer))
	.
:- type (rtti_implementation:exist_info)
	--->	exist_info((builtin:c_pointer))
	.
:- type (rtti_implementation:du_sectag_alternatives)
	--->	du_sectag_alternatives((builtin:c_pointer))
	.
:- type (rtti_implementation:du_functor_descriptor)
	--->	du_functor_descriptor((builtin:c_pointer))
	.
:- type (rtti_implementation:compare_pred)
	--->	compare_pred((builtin:c_pointer))
	.
:- type (rtti_implementation:arg_types)
	--->	arg_types((builtin:c_pointer))
	.
:- func rtti_implementation:type_ctor_arity((rtti_implementation:type_ctor_info)) = int.
:- mode rtti_implementation:type_ctor_arity((builtin:in)) = (builtin:out) is det.
:- func rtti_implementation:type_ctor_module_name((rtti_implementation:type_ctor_info)) = string.
:- mode rtti_implementation:type_ctor_module_name((builtin:in)) = (builtin:out) is det.
:- func rtti_implementation:type_ctor_name((rtti_implementation:type_ctor_info)) = string.
:- mode rtti_implementation:type_ctor_name((builtin:in)) = (builtin:out) is det.
:- pragma foreign_proc("C", rtti_implementation:get_type_info(_T :: (builtin:unused)) = (TypeInfo :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	TypeInfo = TypeInfo_for_T;
").
rtti_implementation:type_ctor_name_and_arity(TypeCtorInfo_5, ModuleName_6, Name_7, Arity_8) :-
		ModuleName_6 = rtti_implementation:type_ctor_module_name(TypeCtorInfo_5),
		Name_7 = rtti_implementation:type_ctor_name(TypeCtorInfo_5),
		Arity_8 = rtti_implementation:type_ctor_arity(TypeCtorInfo_5).
:- pragma foreign_proc("C", rtti_implementation:unsafe_cast(VarIn :: (builtin:in)) = (VarOut :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	VarOut = VarIn;
").
:- pragma foreign_proc("C", rtti_implementation:type_ctor_arity(TypeCtorInfo :: (builtin:in)) = (Arity :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	MR_TypeCtorInfo tci = (MR_TypeCtorInfo) TypeCtorInfo;
	Arity = tci->MR_type_ctor_arity;
").
:- pragma foreign_proc("C", rtti_implementation:type_ctor_module_name(TypeCtorInfo :: (builtin:in)) = (Name :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	MR_TypeCtorInfo tci = (MR_TypeCtorInfo) TypeCtorInfo;
	Name = (MR_String) MR_type_ctor_module_name(tci);
").
:- pragma foreign_proc("C", rtti_implementation:type_ctor_name(TypeCtorInfo :: (builtin:in)) = (Name :: (builtin:out)), [will_not_call_mercury, thread_safe, not_tabled_for_io, promise_pure], "
	MR_TypeCtorInfo tci = (MR_TypeCtorInfo) TypeCtorInfo;
	Name = (MR_String) MR_type_ctor_name(tci);
").
:- pragma termination_info(rtti_implementation:get_type_info((builtin:unused)) = (builtin:out), infinite, cannot_loop).
:- pragma termination_info(rtti_implementation:generic_unify((builtin:in), (builtin:in)), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(rtti_implementation:generic_compare((builtin:out), (builtin:in), (builtin:in)), finite(0, [no, no, no, no]), can_loop).
:- pragma termination_info(rtti_implementation:compare_type_infos((builtin:out), (builtin:in), (builtin:in)), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(rtti_implementation:type_ctor_and_args((builtin:in), (builtin:out), (builtin:out)), infinite, can_loop).
:- pragma termination_info(rtti_implementation:type_ctor_name_and_arity((builtin:in), (builtin:out), (builtin:out), (builtin:out)), infinite, cannot_loop).
:- pragma termination_info(rtti_implementation:deconstruct((builtin:in), (builtin:out), (builtin:out), (builtin:out)), infinite, can_loop).
:- pragma termination_info(rtti_implementation:unsafe_cast((builtin:in)) = (builtin:out), infinite, cannot_loop).
