Hash-Util-Set-XS
view release on metacpan or search on metacpan
void
keys_union(x, y)
HV *x
HV *y
PROTOTYPE: \%\%
PREINIT:
HV *seen;
HE *he;
SV *key;
PPCODE:
if(GIMME_V != G_LIST)
XSRETURN_IV(THX_keys_union_count(aTHX_ x, y));
EXTEND(SP, (SSize_t)HvTOTALKEYS(x) + (SSize_t)HvTOTALKEYS(y));
sv_2mortal((SV *)(seen = newHV()));
hv_iterinit(x);
while ((he = hv_iternext(x))) {
key = hv_iterkeysv(he);
}
void
keys_intersection(x, y)
HV *x
HV *y
PROTOTYPE: \%\%
PREINIT:
HE *he;
SV *key;
PPCODE:
if(GIMME_V != G_LIST)
XSRETURN_IV(THX_keys_intersection_count(aTHX_ x, y));
if (HvTOTALKEYS(x) > HvTOTALKEYS(y)) {
HV *tmp = x;
x = y;
y = tmp;
}
EXTEND(SP, (SSize_t)HvTOTALKEYS(x));
}
void
keys_difference(x, y)
HV *x
HV *y
PROTOTYPE: \%\%
PREINIT:
HE *he;
SV *key;
PPCODE:
if(GIMME_V != G_LIST)
XSRETURN_IV(THX_keys_difference_count(aTHX_ x, y));
EXTEND(SP, (SSize_t)HvTOTALKEYS(x));
hv_iterinit(x);
while ((he = hv_iternext(x))) {
key = hv_iterkeysv(he);
if (!hv_exists_ent(y, key, HeHASH(he)))
PUSHs(key);
}
void
keys_symmetric_difference(x, y)
HV *x
HV *y
PROTOTYPE: \%\%
PREINIT:
HE *he;
SV *key;
PPCODE:
if(GIMME_V != G_LIST)
XSRETURN_IV(THX_keys_symmetric_difference_count(aTHX_ x, y));
EXTEND(SP, (SSize_t)HvTOTALKEYS(x) + (SSize_t)HvTOTALKEYS(y));
hv_iterinit(x);
while ((he = hv_iternext(x))) {
key = hv_iterkeysv(he);
if (!hv_exists_ent(y, key, HeHASH(he)))
PUSHs(key);
RETVAL = THX_keys_proper_subset(aTHX_ y, x);
OUTPUT:
RETVAL
void
keys_any(x, ...)
HV *x
PROTOTYPE: \%@
PREINIT:
I32 i;
PPCODE:
for (i = 1; i < items; i++) {
if (hv_exists_ent(x, ST(i), 0))
XSRETURN_YES;
}
XSRETURN_NO;
void
keys_all(x, ...)
HV *x
PROTOTYPE: \%@
PREINIT:
I32 i;
PPCODE:
for (i = 1; i < items; i++) {
if (!hv_exists_ent(x, ST(i), 0))
XSRETURN_NO;
}
XSRETURN_YES;
void
keys_none(x, ...)
HV *x
PROTOTYPE: \%@
PREINIT:
I32 i;
PPCODE:
for (i = 1; i < items; i++) {
if (hv_exists_ent(x, ST(i), 0))
XSRETURN_NO;
}
XSRETURN_YES;
void
keys_partition(x, y)
HV *x
HV *y
PROTOTYPE: \%\%
PREINIT:
AV *only_x, *both, *only_y;
HE *he;
SV *key;
PPCODE:
sv_2mortal((SV *)(only_x = newAV()));
sv_2mortal((SV *)(both = newAV()));
sv_2mortal((SV *)(only_y = newAV()));
hv_iterinit(x);
while ((he = hv_iternext(x))) {
key = hv_iterkeysv(he);
if (hv_exists_ent(y, key, HeHASH(he)))
my_av_push_simple(both, SvREFCNT_inc(key));
( run in 0.536 second using v1.01-cache-2.11-cpan-5511b514fd6 )