123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628(* Utils: utility functions for user convenience *)openCommonopenSizeopenType_classletsize_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.sizevinifheaderthenlettot_len=v_len+size_header_lengthinletbuf=create_buftot_leninletpos=bin_write_size_headerbuf~pos:0v_leninbuf,pos,pos+v_lenelseletbuf=create_bufv_leninbuf,0,v_leninletpos=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=lenthenreselseletmsg=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 *)moduletypeMake_binable_spec=sigmoduleBinable:Binable.Minimal.Stypetvalto_binable:t->Binable.tvalof_binable:Binable.t->tendmoduleOf_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;}endmoduleMake_binable(S:Make_binable_spec)=structincludeOf_minimal(structmoduleB=S.Binabletypet=S.tletbin_shape_t=B.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)endmoduletypeMake_binable1_spec=sigmoduleBinable:Binable.Minimal.S1type'atvalto_binable:'at->'aBinable.tvalof_binable:'aBinable.t->'atendmoduleMake_binable1(S:Make_binable1_spec)=structmoduleB=S.Binableletbin_shape_tbin_shape_el=B.bin_shape_tbin_shape_elletbin_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;}endmoduletypeMake_binable2_spec=sigmoduleBinable:Binable.Minimal.S2type('a,'b)tvalto_binable:('a,'b)t->('a,'b)Binable.tvalof_binable:('a,'b)Binable.t->('a,'b)tendmoduleMake_binable2(S:Make_binable2_spec)=structmoduleB=S.Binableletbin_shape_tbin_shape_el1bin_shape_el2=B.bin_shape_tbin_shape_el1bin_shape_el2letbin_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;}endmoduletypeMake_binable3_spec=sigmoduleBinable:Binable.Minimal.S3type('a,'b,'c)tvalto_binable:('a,'b,'c)t->('a,'b,'c)Binable.tvalof_binable:('a,'b,'c)Binable.t->('a,'b,'c)tendmoduleMake_binable3(S:Make_binable3_spec)=structmoduleB=S.Binableletbin_shape_tbin_shape_el1bin_shape_el2bin_shape_el3=B.bin_shape_tbin_shape_el1bin_shape_el2bin_shape_el3letbin_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;}endmoduletypeMake_iterable_binable_spec=sigtypettypeelvalcaller_identity:Shape.Uuid.tvalmodule_name:stringoptionvallength:t->intvaliter:t->f:(el->unit)->unitvalinit:len:int->next:(unit->el)->tvalbin_size_el:elSize.sizervalbin_write_el:elWrite.writervalbin_read_el:elRead.readervalbin_shape_el:Shape.tendletwith_module_namef~module_namefunction_name=matchmodule_namewith|None->ffunction_name|Somemodule_name->Printf.ksprintff"%s.%s"module_namefunction_nameletraise_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;}endmoduletypeMake_iterable_binable1_spec=sigtype'attype'aelvalcaller_identity:Shape.Uuid.tvalmodule_name:stringoptionvallength:'at->intvaliter:'at->f:('ael->unit)->unitvalinit:len:int->next:(unit->'ael)->'atvalbin_size_el:('a,'ael)Size.sizer1valbin_write_el:('a,'ael)Write.writer1valbin_read_el:('a,'ael)Read.reader1valbin_shape_el:Shape.t->Shape.tendmoduleMake_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";resultlet__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;}endmoduletypeMake_iterable_binable2_spec=sigtype('a,'b)ttype('a,'b)elvalcaller_identity:Shape.Uuid.tvalmodule_name:stringoptionvallength:('a,'b)t->intvaliter:('a,'b)t->f:(('a,'b)el->unit)->unitvalinit:len:int->next:(unit->('a,'b)el)->('a,'b)tvalbin_size_el:('a,'b,('a,'b)el)Size.sizer2valbin_write_el:('a,'b,('a,'b)el)Write.writer2valbin_read_el:('a,'b,('a,'b)el)Read.reader2valbin_shape_el:Shape.t->Shape.t->Shape.tendmoduleMake_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";resultlet__bin_read_t___bin_read_a_bin_read_b_buf~pos_ref_n=raise_variant_wrong_type"t"!pos_refletbin_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;}endmoduletypeMake_iterable_binable3_spec=sigtype('a,'b,'c)ttype('a,'b,'c)elvalcaller_identity:Shape.Uuid.tvalmodule_name:stringoptionvallength:('a,'b,'c)t->intvaliter:('a,'b,'c)t->f:(('a,'b,'c)el->unit)->unitvalinit:len:int->next:(unit->('a,'b,'c)el)->('a,'b,'c)tvalbin_size_el:('a,'b,'c,('a,'b,'c)el)Size.sizer3valbin_write_el:('a,'b,'c,('a,'b,'c)el)Write.writer3valbin_read_el:('a,'b,'c,('a,'b,'c)el)Read.reader3valbin_shape_el:Shape.t->Shape.t->Shape.t->Shape.tendmoduleMake_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";resultlet__bin_read_t___bin_read_a_bin_read_b_bin_read_c_buf~pos_ref_n=raise_variant_wrong_type"t"!pos_refletbin_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