123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109(**************************************************************************)(* *)(* OCaml *)(* *)(* Jacob Van Buren, Jane Street, New York *)(* *)(* Copyright 2024 Jane Street Group LLC *)(* *)(* All rights reserved. This file is distributed under the terms of *)(* the GNU Lesser General Public License version 2.1, with the *)(* special exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)[@@@ocaml.flambda_o3]open!Stdlibtypet=int#letsize=Sys.int_sizeexternalof_int:int->int#@@portable="%int#_of_int"externalto_int:int#->int@@portable="%int_of_int#"external(<):int#->int#->bool@@portable="%int#_lessthan"letzero()=of_int0letone()=of_int1letminus_one()=of_int(-1)externalneg:int#->int#@@portable="%int#_neg"externaladd:int#->int#->int#@@portable="%int#_add"externalsub:int#->int#->int#@@portable="%int#_sub"externalmul:int#->int#->int#@@portable="%int#_mul"externaldiv:int#->int#->int#@@portable="%int#_div"externalrem:int#->int#->int#@@portable="%int#_mod"externalsucc:int#->int#@@portable="%int#_succ"externalpred:int#->int#@@portable="%int#_pred"externallogand:int#->int#->int#@@portable="%int#_and"externallogor:int#->int#->int#@@portable="%int#_or"externallogxor:int#->int#->int#@@portable="%int#_xor"let[@inline]lognotx=logxorx(minus_one())externalshift_left:int#->int->int#@@portable="%int#_lsl"externalshift_right:int#->int->int#@@portable="%int#_asr"externalshift_right_logical:int#->int->int#@@portable="%int#_lsr"let[@inline]absx=ifx<zero()thennegxelsexexternalequal:int#->int#->bool@@portable="%int#_equal"externalcompare:int#->int#->int@@portable="%int#_compare"let[@inline]minxy=ifx<ythenxelseylet[@inline]maxxy=ifx<ythenyelsexexternalof_float:float->int#@@portable="%int#_of_float"externalto_float:int#->float@@portable="%float_of_int#"let[@inline]to_stringt=string_of_int(to_intt)let[@inline]of_strings=of_int(int_of_strings)letmax_int()=shift_right_logical(minus_one())1letmin_int()=succ(max_int())let[@inline]unsigned_to_intt=ift<zero()thenNoneelseSome(to_intt)externalunsigned_compare:int#->int#->int@@portable="%int#_unsigned_compare"externalunsigned_lt:int#->int#->bool@@portable="%int#_unsigned_lessthan"(* Unsigned division from signed division of the same bitness. See Warren Jr.,
Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3. *)let[@inline]unsigned_divnd=ifd<zero()thenifunsigned_ltndthenzero()elseone()elseletq=shift_left(div(shift_right_logicaln1)d)1inletr=subn(mulqd)inifunsigned_ltrdthenqelsesuccqlet[@inline]unsigned_remnd=subn(mul(unsigned_divnd)d)letseeded_hashseedx=Stdlib.Hashtbl.seeded_hashseed(to_intx)lethashx=Stdlib.Hashtbl.hash(to_intx)