123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172(* This file is free software, part of containers. See file "license" for more details. *)includeNativeint[@@@iflt4.13]letmin:t->t->t=Stdlib.minletmax:t->t->t=Stdlib.max[@@@endif]lethashx=Stdlib.abs(to_intx)letsigni=compareizeroletpowab=letrecauxacc=function|1n->acc|n->ifequal(remn2n)zerothenaux(mulaccacc)(divn2n)elsemulacc(aux(mulaccacc)(divn2n))inmatchbwith|0n->ifequala0nthenraise(Invalid_argument"pow: undefined value 0^0")else1n|bwhencompareb0n<0->raise(Invalid_argument"pow: can't raise int to negative power")|b->auxabletfloor_divan=ifcomparea0n<0&&comparen0n>=0thensub(div(adda1n)n)1nelseifcomparea0n>0&&comparen0n<0thensub(div(suba1n)n)1nelsedivantype'aprinter=Format.formatter->'a->unittype'arandom_gen=Random.State.t->'atype'aiter=('a->unit)->unitletrangeijyield=letrecupijyield=ifequalijthenyieldielse(yieldi;up(addi1n)jyield)anddownijyield=ifequalijthenyieldielse(yieldi;down(subi1n)jyield)inifcompareij<=0thenupijyieldelsedownijyieldletrange'ijyield=ifcompareij<0thenrangei(subj1n)yieldelseifequalijthen()elserangei(addj1n)yieldletrange_by~stepijyield=letrecrangeijyield=ifequalijthenyieldielse(yieldi;range(addistep)jyield)inifequalstep0nthenraise(Invalid_argument"CCNativeint.range_by")elseififcomparestep0n>0thencompareij>0elsecompareij<0then()elserangei(add(mul(div(subji)step)step)i)yieldletrandomnst=Random.State.nativeintstnletrandom_small=random100nletrandom_rangeijst=addi(random(subji)st)(** {2 Conversion} *)letof_string_exn=of_stringletof_string=of_string_optletmost_significant_bit=logxor(neg1n)(shift_right_logical(neg1n)1)typeoutput=char->unit(* abstract printer *)letto_binary_gen(out:output)n=letn=ifcomparen0n<0then(out'-';negn)elseninout'0';out'b';letrecloopstartedbitn=ifequalbit0nthen(ifnotstartedthenout'0')else(letb=logandnbitinifequalb0nthen(ifstartedthenout'0';loopstarted(shift_right_logicalbit1)n)else(out'1';looptrue(shift_right_logicalbit1)n))inloopfalsemost_significant_bitnletto_string_binaryn=letbuf=Buffer.create16into_binary_gen(Buffer.add_charbuf)n;Buffer.contentsbuf(** {2 Printing} *)letppoutn=Format.pp_print_stringout(to_stringn)letpp_binaryoutn=to_binary_gen(Format.pp_print_charout)n(** {2 Infix Operators} *)moduleInfix=structlet(+)=addlet(-)=sublet(~-)=neglet(*)=mullet(/)=divlet(**)=powlet(--)=rangelet(--^)=range'let(mod)=remlet(land)=logandlet(lor)=logorlet(lxor)=logxorletlnot=lognotlet(lsl)=shift_leftlet(lsr)=shift_right_logicallet(asr)=shift_rightlet(=)=equallet(<>)=Stdlib.(<>)let(<)=Stdlib.(<)let(<=)=Stdlib.(<=)let(>)=Stdlib.(>)let(>=)=Stdlib.(>=)endincludeInfix