Hash-GuavaRing
view release on metacpan or search on metacpan
GuavaRing.xs view on Meta::CPAN
SV * self;
HV * stash;
AV * nodes;
} GuavaRing;
#define svstrcmp(a,b) strcmp(SvPV_nolen(a),b)
MODULE = Hash::GuavaRing PACKAGE = Hash::GuavaRing
void new(...)
PPCODE:
if (items < 1) croak("Usage: %s->new(...)",SvPV_nolen(ST(0)));
GuavaRing * self = (GuavaRing *) safemalloc( sizeof(GuavaRing) );
if (unlikely(!self)) croak("Failed to allocate memory");
memset(self,0,sizeof(GuavaRing));
self->stash = gv_stashpv(SvPV_nolen(ST(0)), TRUE);
{
SV *iv = newSViv(PTR2IV( self ));
self->self = sv_bless(newRV_noinc (iv), self->stash);
ST(0) = sv_2mortal(self->self);
}
GuavaRing.xs view on Meta::CPAN
}
self->nodes = newAV();
for ( i = 0; i <= av_len(nodes); i++ ) {
key = av_fetch( nodes, i, 0 );
av_store(self->nodes, i, SvREFCNT_inc(*key));
}
XSRETURN(1);
void DESTROY(SV *)
PPCODE:
register GuavaRing *self = ( GuavaRing * ) SvUV( SvRV( ST(0) ) );
if (self->nodes) SvREFCNT_dec(self->nodes);
if (self->self && SvOK(self->self) && SvOK( SvRV(self->self) )) {
SvREFCNT_inc(SvRV(self->self));
SvREFCNT_dec(self->self);
}
safefree(self);
XSRETURN_UNDEF;
void get (SV *, SV * key)
PPCODE:
register GuavaRing *self = ( GuavaRing * ) SvUV( SvRV( ST(0) ) );
// fprintf(stderr,"\nav_len(self->nodes) = %i\n",av_len(self->nodes));
int idx = guava( SvIV(key), av_len(self->nodes)+1 );
SV **node = av_fetch(self->nodes, idx, 0);
ST(0) = *node;
XSRETURN(1);
( run in 0.605 second using v1.01-cache-2.11-cpan-5511b514fd6 )