Hash-Util-Set-XS

 view release on metacpan or  search on metacpan

XS.xs  view on Meta::CPAN


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);

XS.xs  view on Meta::CPAN

  }

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));

XS.xs  view on Meta::CPAN

  }

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);

XS.xs  view on Meta::CPAN

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