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 2.370 seconds using v1.01-cache-2.11-cpan-5511b514fd6 )