Devel-MAT

 view release on metacpan or  search on metacpan

lib/Devel/MAT.xs  view on Meta::CPAN


    Newx(hv->values_at, n, struct pmat_hval);
    for(i = 0; (ent = hv_iternext(values_at)); i++) {
      I32 klen;
      const char *key = hv_iterkey(ent, &klen);

      SV *val = hv_iterval(values_at, ent);
      assert(SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV);
      AV *valav = (AV *)SvRV(val);
      SV *hek_at   = *av_fetch_simple(valav, 0, 0);
      SV *value_at = *av_fetch_simple(valav, 1, 0);

      hv->values_at[i].key   = save_string(key, klen);
      hv->values_at[i].klen  = klen;
      hv->values_at[i].hek   = SvOK(hek_at) ? SvUV(hek_at) : 0;
      hv->values_at[i].value = SvUV(value_at);
    }

    // TODO: sort the values so we can binsearch for them later
  }

void DESTROY(self)
  HV   *self
CODE:
  {
    struct pmat_sv_hash *hv = (struct pmat_sv_hash *)get_pmat_sv(self);
    long i;

    for(i = 0; i < hv->n_values; i++)
      drop_string(hv->values_at[i].key, hv->values_at[i].klen);

    Safefree(hv->values_at);

    free_pmat_sv((struct pmat_sv *)hv);
  }

long
backrefs_at(self)
  HV   *self
ALIAS:
  backrefs_at = 0
  n_values    = 1
CODE:
  {
    struct pmat_sv_hash *hv = (struct pmat_sv_hash *)get_pmat_sv(self);
    if(hv)
      switch(ix) {
        case 0: RETVAL = hv->backrefs_at; break;
        case 1: RETVAL = hv->n_values;    break;
      }
  }
OUTPUT:
  RETVAL

void
keys(self)
  HV    *self
ALIAS:
  keys      = 0
  values_at = 1
PPCODE:
  {
    struct pmat_sv_hash *hv = (struct pmat_sv_hash *)get_pmat_sv(self);
    long i;

    EXTEND(SP, hv->n_values);
    for(i = 0; i < hv->n_values; i++)
      switch(ix) {
        case 0: // keys
          mPUSHp(hv->values_at[i].key, hv->values_at[i].klen);
          break;
        case 1: // values_at
          mPUSHu(hv->values_at[i].value);
          break;
      }

    XSRETURN(hv->n_values);
  }

SV *
value_at(self, key)
  HV    *self
  SV    *key
ALIAS:
  hek_at   = 0
  value_at = 1
CODE:
  {
    struct pmat_sv_hash *hv = (struct pmat_sv_hash *)get_pmat_sv(self);
    long i;
    long klen = SvCUR(key);

    RETVAL = &PL_sv_undef;

    // TODO: store values sorted so we can binsearch
    for(i = 0; i < hv->n_values; i++) {
      if(hv->values_at[i].klen != klen)
        continue;
      if(memcmp(hv->values_at[i].key, SvPV_nolen(key), klen) != 0)
        continue;

      switch(ix) {
        case 0:
          RETVAL = newSVuv(hv->values_at[i].hek);
          break;

        case 1:
          RETVAL = newSVuv(hv->values_at[i].value);
          break;
      }
      break;
    }
  }
OUTPUT:
  RETVAL

MODULE = Devel::MAT                PACKAGE = Devel::MAT::SV::CODE

void
_set_code_fields(self, line, flags, oproot, depth, name_hek, stash_at, outside_at, padlist_at, constval_at, file, name)
  HV   *self



( run in 0.953 second using v1.01-cache-2.11-cpan-71847e10f99 )