Set-Object
view release on metacpan or search on metacpan
}
MODULE = Set::Object PACKAGE = Set::Object
PROTOTYPES: DISABLE
void
new(pkg, ...)
SV* pkg;
PPCODE:
{
SV* self;
ISET* s;
I32 item;
SV* isv;
New(0, s, 1, ISET);
s->elems = 0;
s->buckets = 0;
IF_DEBUG(_warn("set!"));
PUSHs(self);
XSRETURN(1);
}
void
insert(self, ...)
SV* self;
PPCODE:
ISET* s = INT2PTR(ISET*, SvIV(SvRV(self)));
I32 item;
int inserted = 0;
for (item = 1; item < items; ++item)
{
SV* el = ST(item);
if ((SV*)s == el) {
_warn("INSERTING SET UP OWN ARSE");
}
inserted++;
IF_DEBUG(_warn("inserting %p %p size = %d", el, SvRV(el), s->elems));
}
XSRETURN_IV(inserted);
void
remove(self, ...)
SV* self;
PPCODE:
ISET* s = INT2PTR(ISET*, SvIV(SvRV(self)));
I32 item;
int removed = 0;
for (item = 1; item < items; ++item)
{
SV* el = ST(item);
SvGETMAGIC(el);
removed += iset_remove_one(s, el, 0);
} else {
XSRETURN_UNDEF;
}
OUTPUT: RETVAL
void
includes(self, ...)
SV* self;
PPCODE:
ISET* s = INT2PTR(ISET*, SvIV(SvRV(self)));
I32 hash, index, item;
SV **el_iter, **el_last;
BUCKET* bucket;
for (item = 1; item < items; ++item)
{
SV* el = ST(item);
SV* rv;
next: ;
}
XSRETURN_YES;
void
members(self)
SV* self
PPCODE:
ISET* s = INT2PTR(ISET*, SvIV(SvRV(self)));
BUCKET* bucket_iter = s->bucket;
BUCKET* bucket_last = bucket_iter + s->buckets;
EXTEND(sp, s->elems + (s->flat ? HvKEYS(s->flat) : 0) );
for (; bucket_iter != bucket_last; ++bucket_iter)
{
SV **el_iter, **el_last;
if ( !SvOBJECT(sv) )
XSRETURN_UNDEF;
RETVAL = 1;
OUTPUT:
RETVAL
void
_STORABLE_thaw(obj, cloning, serialized, ...)
SV* obj;
PPCODE:
{
ISET* s;
I32 item;
SV* isv;
New(0, s, 1, ISET);
s->elems = 0;
s->bucket = 0;
s->buckets = 0;
#endif
}
#ifdef USE_ITHREADS
void
CLONE(...)
PROTOTYPE: DISABLE
PREINIT:
ISET *old_s;
PPCODE:
{
dMY_CXT;
old_s = MY_CXT.s;
}
{
MY_CXT_CLONE;
MY_CXT.s = old_s;
}
XSRETURN(0);
( run in 1.935 second using v1.01-cache-2.11-cpan-5511b514fd6 )