kip/u.c

13 lines
782 B
C

#include"u.h"
V vini(Vec*v,W c,W z){*v=(Vec){z,c,0,mk(c*z)};}
V vgrw(Vec*v,W c){v->p=remk(v->p,c*v->z),v->c=c;}
V vput(Vec*v,V*a){Q(v->l>=v->c,vgrw(v,(v->c*3)/2))memcpy(vget(*v,v->l++),a,v->z);}
V*vget(Vec v,W i){R v.p+(v.z*i);}
B seql(S a,S b){Q(a.l!=b.l,R 0)Sfor(a,c,i,Q(c!=b.p[i],R 0))R 1;}
W fnv1a(S s){W h=16777619;Sfor(s,c,i,h^=c,c*=2166136261)R h;}
V hini(Ht*h,W c,W z){*h=(Ht){z,c,0,mk(c*SZ(S)),mk(c*z)};}
V hgrw(Ht*h,W c){Ht j=*h;h->k=mk(c*SZ(S)),h->v=mk(c*h->z),h->c=c;Hfor(j,k,v,i,hput(h,k,v));del(j.k),del(j.v);}
V hput(Ht*h,S k,V*v){W c;W i=hind(*h,k);Q((c=h->c*3/2)<h->l++,hgrw(h,c))h->k[i]=k,memcpy(h->v+i*h->z,v,h->z);}
W hind(Ht h,S k){W j,i=fnv1a(k);x:j=i%h.c;Q(0!=h.k[j].l&&!seql(k,h.k[j]),++i;goto x)R j;}
V*hget(Ht h,S k){W i=hind(h,k);R h.k[i].l?h.v+i*h.z:0;}