1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950(* This file is free software, part of Logtk. See file "license" for more details. *)(** {1 Hashconsed Variable} *)type+'at={id:int;ty:'a;}type'ahvar='atlet[@inline]idt=t.idlet[@inline]tyt=t.tylet[@inline]make~tyi=ifi<0theninvalid_arg"HVar.make";{id=i;ty;}let[@inline]castv~ty={vwithty;}let[@inline]update_tyv~f={vwithty=fv.ty;}let[@inline]comparecmpab=letc=CCOrd.inta.idb.idinifc<>0thencelsecmpa.tyb.tylet[@inline]equaleqab=a.id=b.id&&eqa.tyb.tylet[@inline]hasha=Hash.inta.idlet[@inline]maxab=ifa.id<b.idthenbelsealet[@inline]minab=ifa.id<b.idthenaelsebletppoutv=Format.fprintfout"X%d"v.idletpp_tstp=ppletto_stringv=CCFormat.to_stringppvletto_string_tstp=to_stringlet[@inline]make_unsafe~tyid={ty;id;}letfresh_=ref~-1let[@inline]fresh~ty()=if!fresh_>0thenfailwith"HVar.fresh_var: underflow";letv=make_unsafe~ty!fresh_indecrfresh_;vletfresh_cnt~counter~ty()=letvar=make~ty!counterinincrcounter;varlet[@inline]is_freshv=idv<0