123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274(*
* Copyright (c) 2013 Jeremy Yallop.
*
* This file is distributed under the terms of the MIT License.
* See the file LICENSE for details.
*)modulePervasives=Pervasives[@@ocaml.warning"-3"]externalinit:unit->unit="integers_unsigned_init"let()=init()(* Boxed unsigned types *)moduletypeBasics=sigtypetvaladd:t->t->tvalsub:t->t->tvalmul:t->t->tvaldiv:t->t->tvalrem:t->t->tvalmax_int:tvallogand:t->t->tvallogor:t->t->tvallogxor:t->t->tvalshift_left:t->int->tvalshift_right:t->int->tvalof_int:int->tvalto_int:t->intvalof_int64:int64->tvalto_int64:t->int64valof_string:string->tvalto_string:t->stringendmoduletypeExtras=sigtypetvalzero:tvalone:tvallognot:t->tvalsucc:t->tvalpred:t->tvalcompare:t->t->intvalequal:t->t->boolvalmax:t->t->tvalmin:t->t->tvalpp:Format.formatter->t->unitendmoduletypeInfix=sigtypetval(+):t->t->tval(-):t->t->tval(*):t->t->tval(/):t->t->tval(mod):t->t->tval(land):t->t->tval(lor):t->t->tval(lxor):t->t->tval(lsl):t->int->tval(lsr):t->int->tendmoduletypeS=sigincludeBasicsincludeExtraswithtypet:=tmoduleInfix:Infixwithtypet:=tendmoduleMakeInfix(B:Basics)=structopenBlet(+)=addlet(-)=sublet(*)=mullet(/)=divlet(mod)=remlet(land)=logandlet(lor)=logorlet(lxor)=logxorlet(lsl)=shift_leftlet(lsr)=shift_rightendmoduleExtras(Basics:Basics):Extraswithtypet:=Basics.t=structopenBasicsletzero=of_int0letone=of_int1letsuccn=addnoneletpredn=subnoneletlognotn=logxornmax_intletcompare(x:t)(y:t)=Pervasives.comparexyletequal(x:t)(y:t)=Pervasives.(=)xyletmax(x:t)(y:t)=Pervasives.maxxyletmin(x:t)(y:t)=Pervasives.minxyletppfmtx=Format.fprintffmt"%s"(to_stringx)endmoduleUInt8:Swithtypet=privateint=structmoduleB=structtypet=intletmax_int=255letadd:t->t->t=funxy->(x+y)landmax_intletsub:t->t->t=funxy->(x-y)landmax_intletmul:t->t->t=funxy->(x*y)landmax_intletdiv:t->t->t=(/)letrem:t->t->t=(mod)letlogand:t->t->t=(land)letlogor:t->t->t=(lor)letlogxor:t->t->t=(lxor)letshift_left:t->int->t=funxy->(xlsly)landmax_intletshift_right:t->int->t=(lsr)letof_int(x:int):t=(* For backwards compatibility, this wraps *)xlandmax_intexternalto_int:t->int="%identity"letof_int64:int64->t=funx->of_int(Int64.to_intx)letto_int64:t->int64=funx->Int64.of_int(to_intx)externalof_string:string->t="integers_uint8_of_string"letto_string:t->string=string_of_intendincludeBincludeExtras(B)moduleInfix=MakeInfix(B)endmoduleUInt16:Swithtypet=privateint=structmoduleB=structtypet=intletmax_int=65535letadd:t->t->t=funxy->(x+y)landmax_intletsub:t->t->t=funxy->(x-y)landmax_intletmul:t->t->t=funxy->(x*y)landmax_intletdiv:t->t->t=(/)letrem:t->t->t=(mod)letlogand:t->t->t=(land)letlogor:t->t->t=(lor)letlogxor:t->t->t=(lxor)letshift_left:t->int->t=funxy->(xlsly)landmax_intletshift_right:t->int->t=(lsr)letof_int(x:int):t=(* For backwards compatibility, this wraps *)xlandmax_intexternalto_int:t->int="%identity"letof_int64:int64->t=funx->Int64.to_intx|>of_intletto_int64:t->int64=funx->to_intx|>Int64.of_intexternalof_string:string->t="integers_uint16_of_string"letto_string:t->string=string_of_intendincludeBincludeExtras(B)moduleInfix=MakeInfix(B)endmoduleUInt32:sigincludeSexternalof_int32:int32->t="integers_uint32_of_int32"externalto_int32:t->int32="integers_int32_of_uint32"end=structmoduleB=structtypetexternaladd:t->t->t="integers_uint32_add"externalsub:t->t->t="integers_uint32_sub"externalmul:t->t->t="integers_uint32_mul"externaldiv:t->t->t="integers_uint32_div"externalrem:t->t->t="integers_uint32_rem"externallogand:t->t->t="integers_uint32_logand"externallogor:t->t->t="integers_uint32_logor"externallogxor:t->t->t="integers_uint32_logxor"externalshift_left:t->int->t="integers_uint32_shift_left"externalshift_right:t->int->t="integers_uint32_shift_right"externalof_int:int->t="integers_uint32_of_int"externalto_int:t->int="integers_uint32_to_int"externalof_int64:int64->t="integers_uint32_of_int64"externalto_int64:t->int64="integers_uint32_to_int64"externalof_string:string->t="integers_uint32_of_string"externalto_string:t->string="integers_uint32_to_string"external_max_int:unit->t="integers_uint32_max"letmax_int=_max_int()endincludeBincludeExtras(B)moduleInfix=MakeInfix(B)externalof_int32:int32->t="integers_uint32_of_int32"externalto_int32:t->int32="integers_int32_of_uint32"endmoduleUInt64:sigincludeSexternalof_int64:int64->t="integers_uint64_of_int64"externalto_int64:t->int64="integers_uint64_to_int64"externalof_uint32:UInt32.t->t="integers_uint64_of_uint32"externalto_uint32:t->UInt32.t="integers_uint32_of_uint64"end=structmoduleB=structtypetexternaladd:t->t->t="integers_uint64_add"externalsub:t->t->t="integers_uint64_sub"externalmul:t->t->t="integers_uint64_mul"externaldiv:t->t->t="integers_uint64_div"externalrem:t->t->t="integers_uint64_rem"externallogand:t->t->t="integers_uint64_logand"externallogor:t->t->t="integers_uint64_logor"externallogxor:t->t->t="integers_uint64_logxor"externalshift_left:t->int->t="integers_uint64_shift_left"externalshift_right:t->int->t="integers_uint64_shift_right"externalof_int:int->t="integers_uint64_of_int"externalto_int:t->int="integers_uint64_to_int"externalof_int64:int64->t="integers_uint64_of_int64"externalto_int64:t->int64="integers_uint64_to_int64"externalof_uint32:UInt32.t->t="integers_uint64_of_uint32"externalto_uint32:t->UInt32.t="integers_uint32_of_uint64"externalof_string:string->t="integers_uint64_of_string"externalto_string:t->string="integers_uint64_to_string"external_max_int:unit->t="integers_uint64_max"letmax_int=_max_int()endincludeBincludeExtras(B)moduleInfix=MakeInfix(B)endletof_byte_size:int->(moduleS)=function|1->(moduleUInt8)|2->(moduleUInt16)|4->(moduleUInt32)|8->(moduleUInt64)|_->invalid_arg"Unsigned.of_byte_size"externalsize_t_size:unit->int="integers_size_t_size"externalushort_size:unit->int="integers_ushort_size"externaluint_size:unit->int="integers_uint_size"externalulong_size:unit->int="integers_ulong_size"externalulonglong_size:unit->int="integers_ulonglong_size"moduleSize_t:S=(valof_byte_size(size_t_size()))moduleUChar=UInt8moduleUShort:S=(valof_byte_size(ushort_size()))moduleUInt:S=(valof_byte_size(uint_size()))moduleULong:S=(valof_byte_size(ulong_size()))moduleULLong:S=(valof_byte_size(ulonglong_size()))typeuchar=UChar.ttypeuint8=UInt8.ttypeuint16=UInt16.ttypeuint32=UInt32.ttypeuint64=UInt64.ttypesize_t=Size_t.ttypeushort=UShort.ttypeuint=UInt.ttypeulong=ULong.ttypeullong=ULLong.t