12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788(**************************************************************************)(* This file is part of BINSEC. *)(* *)(* Copyright (C) 2016-2026 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file licenses/LGPLv2.1). *)(* *)(**************************************************************************)moduletypeS=sigtype'atvalpush:'a->'at->'atvalpop:'at->'a*'atvalsingleton:'a->'atvallength:'at->intvalis_empty:'at->boolvalempty:'atendmoduleDfs:S=structtype'at='alistletempty=[]letis_empty=function[]->true|_->falseletpushew=e::wletsingletone=[e]letpop=functione::w->(e,w)|[]->raiseNot_foundletlength=List.lengthendmoduleBfs:S=structtype'at='aSequence.tletlength=Sequence.lengthletis_emptyq=Sequence.lengthq=0letempty=Sequence.emptyletpushpq=Sequence.push_backpqletpopq=matchSequence.peek_frontqwith|None->raiseNot_found|Somev->(matchSequence.pop_frontqwith|None->assertfalse|Someseq->(v,seq))letsingletonp=pushpemptyendmoduleNurs:S=struct(* This is actually a fairly classical heap.
The priority added to the date is just generated at random.
*)moduleI=Basic_types.Integers.Int.Maptype'at='aI.tletrecgen_priorityt=letp=Random.bits()inifI.memptthengen_prioritytelsepletlength=I.cardinalletis_empty=I.is_emptyletempty=I.emptyletpushet=letp=gen_prioritytinI.addpetletpopt=let(_,e),t'=I.poptin(e,t')letsingletonp=pushpemptyend