#include <u.h>#include <libc.h> #include "git.h" voidosinit(Objset *s){ s->sz = 16; s->nobj = 0; s->obj = eamalloc(s->sz, sizeof(Object*));} voidosclear(Objset *s){ free(s->obj);} voidosadd(Objset *s, Object *o){ u32int probe; Object **obj; int i, sz; probe = GETBE32(o->hash.h) % s->sz; while(s->obj[probe]){ if(hasheq(&s->obj[probe]->hash, &o->hash)){ s->obj[probe] = o; return; } probe = (probe + 1) % s->sz; } assert(s->obj[probe] == nil); s->obj[probe] = o; s->nobj++; if(s->sz < 2*s->nobj){ sz = s->sz; obj = s->obj; s->sz *= 2; s->nobj = 0; s->obj = eamalloc(s->sz, sizeof(Object*)); for(i = 0; i < sz; i++) if(obj[i]) osadd(s, obj[i]); free(obj); }} Object*osfind(Objset *s, Hash h){ u32int probe; for(probe = GETBE32(h.h) % s->sz; s->obj[probe]; probe = (probe + 1) % s->sz) if(hasheq(&s->obj[probe]->hash, &h)) return s->obj[probe]; return 0;} intoshas(Objset *s, Hash h){ return osfind(s, h) != nil;}
#include <u.h>
#include <libc.h>
#include "git.h"
void
osinit(Objset *s)
{
s->sz = 16;
s->nobj = 0;
s->obj = eamalloc(s->sz, sizeof(Object*));
}
void
osclear(Objset *s)
{
free(s->obj);
}
void
osadd(Objset *s, Object *o)
{
u32int probe;
Object **obj;
int i, sz;
probe = GETBE32(o->hash.h) % s->sz;
while(s->obj[probe]){
if(hasheq(&s->obj[probe]->hash, &o->hash)){
s->obj[probe] = o;
return;
}
probe = (probe + 1) % s->sz;
}
assert(s->obj[probe] == nil);
s->obj[probe] = o;
s->nobj++;
if(s->sz < 2*s->nobj){
sz = s->sz;
obj = s->obj;
s->sz *= 2;
s->nobj = 0;
s->obj = eamalloc(s->sz, sizeof(Object*));
for(i = 0; i < sz; i++)
if(obj[i])
osadd(s, obj[i]);
free(obj);
}
}
Object*
osfind(Objset *s, Hash h)
{
u32int probe;
for(probe = GETBE32(h.h) % s->sz; s->obj[probe]; probe = (probe + 1) % s->sz)
if(hasheq(&s->obj[probe]->hash, &h))
return s->obj[probe];
return 0;
}
int
oshas(Objset *s, Hash h)
{
return osfind(s, h) != nil;
}