123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628(* Utils: utility functions for user convenience *)openCommonopenSizeopenType_classincludeUtils_intfletsize_header_length=8letbin_write_size_header=Write.bin_write_int_64bitletbin_read_size_header=Read.bin_read_int_64bitletbin_dump?(header=false)writerv=letbuf,pos,pos_len=letv_len=writer.sizevinifheaderthen(lettot_len=v_len+size_header_lengthinletbuf=create_buftot_leninletpos=bin_write_size_headerbuf~pos:0v_leninbuf,pos,pos+v_len)else(letbuf=create_bufv_leninbuf,0,v_len)inletpos=writer.writebuf~posvinifpos=pos_lenthenbufelsefailwith"Bin_prot.Utils.bin_dump: size changed during writing";;(* Reading from streams *)letbin_read_stream?max_size~readreader=letbuf=create_bufsize_header_lengthinreadbuf~pos:0~len:size_header_length;letpos_ref=ref0inletlen=bin_read_size_headerbuf~pos_refinmatchmax_sizewith|Somemax_sizewhenlen>max_size->failwith(Printf.sprintf"Bin_prot.Utils.bin_read_stream: size exceeds max_size: %d > %d"lenmax_size)|_->letbuf=iflen>size_header_lengththencreate_buflenelsebufinreadbuf~pos:0~len;pos_ref:=0;letres=reader.readbuf~pos_refinif!pos_ref=lenthenreselse(letmsg=Printf.sprintf"Bin_prot.Utils.bin_read_stream: protocol lied about length of value: \
expected %d, received %d"len!pos_refinfailwithmsg);;(* Conversion of binable types *)moduleOf_minimal(S:Binable.Minimal.S):Binable.Swithtypet:=S.t=structincludeSletbin_writer_t={size=bin_size_t;write=bin_write_t}letbin_reader_t={read=bin_read_t;vtag_read=__bin_read_t__}letbin_t={shape=bin_shape_t;writer=bin_writer_t;reader=bin_reader_t}endletmaybe_annotate_shapemaybe_uuidshape=matchmaybe_uuidwith|None->shape|Someuuid->Shape.annotateuuidshape;;moduleMake_binable_gen(S:sigincludeMake_binable_without_uuid_specvalmaybe_caller_identity:Shape.Uuid.toptionend)=structincludeOf_minimal(structmoduleB=S.Binabletypet=S.tletbin_shape_t=maybe_annotate_shapeS.maybe_caller_identityB.bin_shape_tletbin_size_tt=B.bin_size_t(S.to_binablet)letbin_write_tbuf~post=B.bin_write_tbuf~pos(S.to_binablet)letbin_read_tbuf~pos_ref=S.of_binable(B.bin_read_tbuf~pos_ref)let__bin_read_t__buf~pos_refn=S.of_binable(B.__bin_read_t__buf~pos_refn)end)endmoduleMake_binable1_gen(S:sigincludeMake_binable1_without_uuid_specvalmaybe_caller_identity:Shape.Uuid.toptionend)=structmoduleB=S.Binableletbin_shape_tbin_shape_el=maybe_annotate_shapeS.maybe_caller_identity(B.bin_shape_tbin_shape_el);;letbin_size_tbin_size_elt=B.bin_size_tbin_size_el(S.to_binablet)letbin_write_tbin_write_elbuf~post=B.bin_write_tbin_write_elbuf~pos(S.to_binablet);;letbin_read_tbin_read_elbuf~pos_ref=S.of_binable(B.bin_read_tbin_read_elbuf~pos_ref);;let__bin_read_t__bin_read_elbuf~pos_refn=S.of_binable(B.__bin_read_t__bin_read_elbuf~pos_refn);;letbin_writer_tbin_writer={size=(funv->bin_size_tbin_writer.sizev);write=(funbuf~posv->bin_write_tbin_writer.writebuf~posv)};;letbin_reader_tbin_reader={read=(funbuf~pos_ref->bin_read_tbin_reader.readbuf~pos_ref);vtag_read=(fun_buf~pos_ref_n->raise_variant_wrong_type"Bin_prot.Utils.Make_binable1.bin_reader_t"!pos_ref)};;letbin_ttype_class={shape=bin_shape_ttype_class.shape;writer=bin_writer_ttype_class.writer;reader=bin_reader_ttype_class.reader};;endmoduleMake_binable2_gen(S:sigincludeMake_binable2_without_uuid_specvalmaybe_caller_identity:Shape.Uuid.toptionend)=structmoduleB=S.Binableletbin_shape_tbin_shape_el1bin_shape_el2=maybe_annotate_shapeS.maybe_caller_identity(B.bin_shape_tbin_shape_el1bin_shape_el2);;letbin_size_tbin_size_el1bin_size_el2t=B.bin_size_tbin_size_el1bin_size_el2(S.to_binablet);;letbin_write_tbin_write_el1bin_write_el2buf~post=B.bin_write_tbin_write_el1bin_write_el2buf~pos(S.to_binablet);;letbin_read_tbin_read_el1bin_read_el2buf~pos_ref=S.of_binable(B.bin_read_tbin_read_el1bin_read_el2buf~pos_ref);;let__bin_read_t__bin_read_el1bin_read_el2buf~pos_refn=S.of_binable(B.__bin_read_t__bin_read_el1bin_read_el2buf~pos_refn);;letbin_writer_tbin_writer1bin_writer2={size=(funv->bin_size_tbin_writer1.sizebin_writer2.sizev);write=(funbuf~posv->bin_write_tbin_writer1.writebin_writer2.writebuf~posv)};;letbin_reader_tbin_reader1bin_reader2={read=(funbuf~pos_ref->bin_read_tbin_reader1.readbin_reader2.readbuf~pos_ref);vtag_read=(fun_buf~pos_ref_n->raise_variant_wrong_type"Bin_prot.Utils.Make_binable2.bin_reader_t"!pos_ref)};;letbin_ttype_class1type_class2={shape=bin_shape_ttype_class1.shapetype_class2.shape;writer=bin_writer_ttype_class1.writertype_class2.writer;reader=bin_reader_ttype_class1.readertype_class2.reader};;endmoduleMake_binable3_gen(S:sigincludeMake_binable3_without_uuid_specvalmaybe_caller_identity:Shape.Uuid.toptionend)=structmoduleB=S.Binableletbin_shape_tbin_shape_el1bin_shape_el2bin_shape_el3=maybe_annotate_shapeS.maybe_caller_identity(B.bin_shape_tbin_shape_el1bin_shape_el2bin_shape_el3);;letbin_size_tbin_size_el1bin_size_el2bin_size_el3t=B.bin_size_tbin_size_el1bin_size_el2bin_size_el3(S.to_binablet);;letbin_write_tbin_write_el1bin_write_el2bin_write_el3buf~post=B.bin_write_tbin_write_el1bin_write_el2bin_write_el3buf~pos(S.to_binablet);;letbin_read_tbin_read_el1bin_read_el2bin_read_el3buf~pos_ref=S.of_binable(B.bin_read_tbin_read_el1bin_read_el2bin_read_el3buf~pos_ref);;let__bin_read_t__bin_read_el1bin_read_el2bin_read_el3buf~pos_refn=S.of_binable(B.__bin_read_t__bin_read_el1bin_read_el2bin_read_el3buf~pos_refn);;letbin_writer_tbin_writer1bin_writer2bin_writer3={size=(funv->bin_size_tbin_writer1.sizebin_writer2.sizebin_writer3.sizev);write=(funbuf~posv->bin_write_tbin_writer1.writebin_writer2.writebin_writer3.writebuf~posv)};;letbin_reader_tbin_reader1bin_reader2bin_reader3={read=(funbuf~pos_ref->bin_read_tbin_reader1.readbin_reader2.readbin_reader3.readbuf~pos_ref);vtag_read=(fun_buf~pos_ref_n->raise_variant_wrong_type"Bin_prot.Utils.Make_binable3.bin_reader_t"!pos_ref)};;letbin_ttype_class1type_class2type_class3={shape=bin_shape_ttype_class1.shapetype_class2.shapetype_class3.shape;writer=bin_writer_ttype_class1.writertype_class2.writertype_class3.writer;reader=bin_reader_ttype_class1.readertype_class2.readertype_class3.reader};;endmoduleMake_binable_with_uuid(S:Make_binable_with_uuid_spec)=Make_binable_gen(structincludeSletmaybe_caller_identity=SomeS.caller_identityend)moduleMake_binable1_with_uuid(S:Make_binable1_with_uuid_spec)=Make_binable1_gen(structincludeSletmaybe_caller_identity=SomeS.caller_identityend)moduleMake_binable2_with_uuid(S:Make_binable2_with_uuid_spec)=Make_binable2_gen(structincludeSletmaybe_caller_identity=SomeS.caller_identityend)moduleMake_binable3_with_uuid(S:Make_binable3_with_uuid_spec)=Make_binable3_gen(structincludeSletmaybe_caller_identity=SomeS.caller_identityend)moduleMake_binable_without_uuid(S:Make_binable_without_uuid_spec)=Make_binable_gen(structincludeSletmaybe_caller_identity=Noneend)moduleMake_binable1_without_uuid(S:Make_binable1_without_uuid_spec)=Make_binable1_gen(structincludeSletmaybe_caller_identity=Noneend)moduleMake_binable2_without_uuid(S:Make_binable2_without_uuid_spec)=Make_binable2_gen(structincludeSletmaybe_caller_identity=Noneend)moduleMake_binable3_without_uuid(S:Make_binable3_without_uuid_spec)=Make_binable3_gen(structincludeSletmaybe_caller_identity=Noneend)moduleMake_binable=Make_binable_without_uuidmoduleMake_binable1=Make_binable1_without_uuidmoduleMake_binable2=Make_binable2_without_uuidmoduleMake_binable3=Make_binable3_without_uuidletwith_module_namef~module_namefunction_name=matchmodule_namewith|None->ffunction_name|Somemodule_name->Printf.ksprintff"%s.%s"module_namefunction_name;;letraise_concurrent_modification=with_module_nameraise_concurrent_modificationletraise_read_too_much=with_module_name(Printf.ksprintffailwith"%s: tried to read more elements than available");;letraise_read_not_enough=with_module_name(Printf.ksprintffailwith"%s: didn't read all elements");;moduleMake_iterable_binable(S:Make_iterable_binable_spec)=structopenSletbin_shape_t=Shape.(basetypecaller_identity[basetype(Uuid.of_string"6592371a-4994-11e6-923a-7748e4182764")[S.bin_shape_el]]);;letbin_size_tt=letsize_ref=ref0inletcnt_ref=ref0initert~f:(funel->size_ref:=!size_ref+bin_size_elel;incrcnt_ref);letlen=lengthtinif!cnt_ref=lenthenbin_size_nat0(Nat0.unsafe_of_intlen)+!size_refelseraise_concurrent_modification~module_name"bin_size_t";;letbin_write_tbuf~post=letlen=lengthtinletplen=Nat0.unsafe_of_intleninletpos_ref=ref(Write.bin_write_nat0buf~posplen)inletcnt_ref=ref0initert~f:(funel->pos_ref:=bin_write_elbuf~pos:!pos_refel;incrcnt_ref);if!cnt_ref=lenthen!pos_refelseraise_concurrent_modification~module_name"bin_write_t";;letbin_read_tbuf~pos_ref=letlen=(Read.bin_read_nat0buf~pos_ref:>int)inletidx=ref0inletnext()=if!idx>=lenthenraise_read_too_much~module_name"bin_read_t";incridx;bin_read_elbuf~pos_refinletresult=init~len~nextinif!idx<lenthenraise_read_not_enough~module_name"bin_read_t";result;;let__bin_read_t___buf~pos_ref_n=raise_variant_wrong_type"t"!pos_refletbin_writer_t={size=bin_size_t;write=bin_write_t}letbin_reader_t={read=bin_read_t;vtag_read=__bin_read_t__}letbin_t={shape=bin_shape_t;writer=bin_writer_t;reader=bin_reader_t}endmoduleMake_iterable_binable1(S:Make_iterable_binable1_spec)=structopenSletbin_shape_tt=Shape.(basetypecaller_identity[basetype(Uuid.of_string"ac8a9ff4-4994-11e6-9a1b-9fb4e933bd9d")[S.bin_shape_elt]]);;letbin_size_tbin_size_at=letsize_ref=ref0inletcnt_ref=ref0initert~f:(funel->size_ref:=!size_ref+bin_size_elbin_size_ael;incrcnt_ref);letlen=lengthtinif!cnt_ref=lenthenbin_size_nat0(Nat0.unsafe_of_intlen)+!size_refelseraise_concurrent_modification~module_name"bin_size_t";;letbin_write_tbin_write_abuf~post=letlen=lengthtinletplen=Nat0.unsafe_of_intleninletpos_ref=ref(Write.bin_write_nat0buf~posplen)inletcnt_ref=ref0initert~f:(funel->pos_ref:=bin_write_elbin_write_abuf~pos:!pos_refel;incrcnt_ref);if!cnt_ref=lenthen!pos_refelseraise_concurrent_modification~module_name"bin_write_t";;letbin_read_tbin_read_abuf~pos_ref=letlen=(Read.bin_read_nat0buf~pos_ref:>int)inletidx=ref0inletnext()=if!idx>=lenthenraise_read_too_much~module_name"bin_read_t";incridx;bin_read_elbin_read_abuf~pos_refinletresult=init~len~nextinif!idx<lenthenraise_read_not_enough~module_name"bin_read_t";result;;let__bin_read_t___bin_read_a_buf~pos_ref_n=raise_variant_wrong_type"t"!pos_refletbin_writer_tbin_writer={size=(funv->bin_size_tbin_writer.sizev);write=(funbuf~posv->bin_write_tbin_writer.writebuf~posv)};;letbin_reader_tbin_reader={read=(funbuf~pos_ref->bin_read_tbin_reader.readbuf~pos_ref);vtag_read=(funbuf~pos_ref_n->__bin_read_t__bin_reader.readbuf~pos_ref_n)};;letbin_ttype_class={shape=bin_shape_ttype_class.shape;writer=bin_writer_ttype_class.writer;reader=bin_reader_ttype_class.reader};;endmoduleMake_iterable_binable2(S:Make_iterable_binable2_spec)=structopenSletbin_shape_tt1t2=Shape.(basetypecaller_identity[basetype(Uuid.of_string"b4e54ad2-4994-11e6-b8df-87c2997f9f52")[S.bin_shape_elt1t2]]);;letbin_size_tbin_size_abin_size_bt=letsize_ref=ref0inletcnt_ref=ref0initert~f:(funel->size_ref:=!size_ref+bin_size_elbin_size_abin_size_bel;incrcnt_ref);letlen=lengthtinif!cnt_ref=lenthenbin_size_nat0(Nat0.unsafe_of_intlen)+!size_refelseraise_concurrent_modification~module_name"bin_size_t";;letbin_write_tbin_write_abin_write_bbuf~post=letlen=lengthtinletplen=Nat0.unsafe_of_intleninletpos_ref=ref(Write.bin_write_nat0buf~posplen)inletcnt_ref=ref0initert~f:(funel->pos_ref:=bin_write_elbin_write_abin_write_bbuf~pos:!pos_refel;incrcnt_ref);if!cnt_ref=lenthen!pos_refelseraise_concurrent_modification~module_name"bin_write_t";;letbin_read_tbin_read_abin_read_bbuf~pos_ref=letlen=(Read.bin_read_nat0buf~pos_ref:>int)inletidx=ref0inletnext()=if!idx>=lenthenraise_read_too_much~module_name"bin_read_t";incridx;bin_read_elbin_read_abin_read_bbuf~pos_refinletresult=init~len~nextinif!idx<lenthenraise_read_not_enough~module_name"bin_read_t";result;;let__bin_read_t___bin_read_a_bin_read_b_buf~pos_ref_n=raise_variant_wrong_type"t"!pos_ref;;letbin_writer_tbin_writer1bin_writer2={size=(funv->bin_size_tbin_writer1.sizebin_writer2.sizev);write=(funbuf~posv->bin_write_tbin_writer1.writebin_writer2.writebuf~posv)};;letbin_reader_tbin_reader1bin_reader2={read=(funbuf~pos_ref->bin_read_tbin_reader1.readbin_reader2.readbuf~pos_ref);vtag_read=(funbuf~pos_refn->__bin_read_t__bin_reader1.readbin_reader2.readbuf~pos_refn)};;letbin_ttype_class1type_class2={shape=bin_shape_ttype_class1.shapetype_class2.shape;writer=bin_writer_ttype_class1.writertype_class2.writer;reader=bin_reader_ttype_class1.readertype_class2.reader};;endmoduleMake_iterable_binable3(S:Make_iterable_binable3_spec)=structopenSletbin_shape_tt1t2t3=Shape.(basetypecaller_identity[basetype(Uuid.of_string"f2112eda-e7d7-11e6-bb36-072e9ce159db")[S.bin_shape_elt1t2t3]]);;letbin_size_tbin_size_abin_size_bbin_size_ct=letsize_ref=ref0inletcnt_ref=ref0initert~f:(funel->size_ref:=!size_ref+bin_size_elbin_size_abin_size_bbin_size_cel;incrcnt_ref);letlen=lengthtinif!cnt_ref=lenthenbin_size_nat0(Nat0.unsafe_of_intlen)+!size_refelseraise_concurrent_modification~module_name"bin_size_t";;letbin_write_tbin_write_abin_write_bbin_write_cbuf~post=letlen=lengthtinletplen=Nat0.unsafe_of_intleninletpos_ref=ref(Write.bin_write_nat0buf~posplen)inletcnt_ref=ref0initert~f:(funel->pos_ref:=bin_write_elbin_write_abin_write_bbin_write_cbuf~pos:!pos_refel;incrcnt_ref);if!cnt_ref=lenthen!pos_refelseraise_concurrent_modification~module_name"bin_write_t";;letbin_read_tbin_read_abin_read_bbin_read_cbuf~pos_ref=letlen=(Read.bin_read_nat0buf~pos_ref:>int)inletidx=ref0inletnext()=if!idx>=lenthenraise_read_too_much~module_name"bin_read_t";incridx;bin_read_elbin_read_abin_read_bbin_read_cbuf~pos_refinletresult=init~len~nextinif!idx<lenthenraise_read_not_enough~module_name"bin_read_t";result;;let__bin_read_t___bin_read_a_bin_read_b_bin_read_c_buf~pos_ref_n=raise_variant_wrong_type"t"!pos_ref;;letbin_writer_tbin_writer1bin_writer2bin_writer3={size=(funv->bin_size_tbin_writer1.sizebin_writer2.sizebin_writer3.sizev);write=(funbuf~posv->bin_write_tbin_writer1.writebin_writer2.writebin_writer3.writebuf~posv)};;letbin_reader_tbin_reader1bin_reader2bin_reader3={read=(funbuf~pos_ref->bin_read_tbin_reader1.readbin_reader2.readbin_reader3.readbuf~pos_ref);vtag_read=(funbuf~pos_refn->__bin_read_t__bin_reader1.readbin_reader2.readbin_reader3.readbuf~pos_refn)};;letbin_ttype_class1type_class2type_class3={shape=bin_shape_ttype_class1.shapetype_class2.shapetype_class3.shape;writer=bin_writer_ttype_class1.writertype_class2.writertype_class3.writer;reader=bin_reader_ttype_class1.readertype_class2.readertype_class3.reader};;end