123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140(**************************************************************************)(* *)(* This file is part of WP plug-in of Frama-C. *)(* *)(* Copyright (C) 2007-2023 *)(* CEA (Commissariat a l'energie atomique et aux energies *)(* 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). *)(* *)(**************************************************************************)moduletypeElt=sigtypetvalequal:t->t->boolvalcompare:t->t->intendmoduletypeSet=sigtypettypeeltvalsingleton:elt->tvaliter:(elt->unit)->t->unitvalunion:t->t->tvalinter:t->t->tendmoduletypeMap=sigtype'attypekeyvalempty:'atvalis_empty:'at->boolvalfind:key->'at->'avaladd:key->'a->'at->'atvalremove:key->'at->'atvaliter:(key->'a->unit)->'at->unitendmoduleMake(E:Elt)(S:Setwithtypeelt=E.t)(M:Mapwithtypekey=E.t)=structtypeelt=E.ttypeset=S.ttypet={mutabledag:E.tM.t;members:S.tM.t;size:int;}letempty={size=0;dag=M.empty;members=M.empty}letreclookuppa=tryleta0=M.findap.daginleta1=lookuppa0inp.dag<-M.addaa1p.dag;a1withNot_found->aletequaltab=E.equal(lookupta)(lookuptb)letmemberspe=tryM.findep.memberswithNot_found->S.singletoneletmergepab=leta=lookuppainletb=lookuppbinletcmp=E.compareabinifcmp=0thenpelseletc=S.union(memberspa)(memberspb)inletsize=succp.sizeinifcmp<0then{size;dag=M.addbap.dag;members=M.addac(M.removebp.members);}else{size;dag=M.addabp.dag;members=M.addbc(M.removeap.members);}letrecmerge_withpe=function|[]->p|e'::es->merge_with(mergepee')eesletmerge_listp=function|[]->p|e::es->merge_withpeesletmerge_setps=letp=refpinletw=refNoneinS.iter(fune->match!wwith|None->w:=Somee|Someu->p:=merge!pue)s;!pletiterfp=M.iterfp.membersletunstable_iterfp=M.iterfp.dagletmapfp=letr=refemptyinM.iter(funab->r:=merge!r(fa)(fb))p.dag;!rletmerge_dagpdag=letr=refpinM.iter(funab->r:=merge!rab)dag;!rletunionpq=ifp.size<q.sizethenmerge_dagqp.dagelsemerge_dagpq.dagletinterpq=letr=refemptyinM.iter(fun_ca->M.iter(fun_cb->r:=merge_set!r(S.intercacb))q.members)p.members;!rletis_emptyp=M.is_emptyp.dagend