Fetch

 view release on metacpan or  search on metacpan

xs/future.xs  view on Meta::CPAN

        hmf_await(aTHX_ self);
        RETVAL = SvREFCNT_inc(self);
    OUTPUT:
        RETVAL

void
get(self)
    SV *self
    ALIAS:
        result = 1
    PPCODE:
    {
        IV st;
        PERL_UNUSED_VAR(ix);
        hmf_await(aTHX_ self);
        st = hmf_state(aTHX_ self);
        if (st == HMF_FAILED) {
            AV *fav = hmf_values_av(aTHX_ self);
            SV **e = fav ? av_fetch(fav, 0, 0) : NULL;
            if (e) croak_sv(sv_mortalcopy(*e));
            croak("Failed");

xs/future.xs  view on Meta::CPAN

                XPUSHs(e ? sv_mortalcopy(*e) : &PL_sv_undef);
            } else {
                XPUSHs(&PL_sv_undef);
            }
        }
    }

void
failure(self)
    SV *self
    PPCODE:
    {
        hmf_await(aTHX_ self);
        if (hmf_state(aTHX_ self) != HMF_FAILED) XSRETURN_EMPTY;
        {
            AV *fav = hmf_values_av(aTHX_ self);
            SSize_t n = fav ? av_len(fav) + 1 : 0;
            if (GIMME_V == G_ARRAY) {
                SSize_t i;
                EXTEND(SP, n);
                for (i = 0; i < n; i++) {

xs/future.xs  view on Meta::CPAN

            } else if (n) {
                SV **e = av_fetch(fav, 0, 0);
                XPUSHs(e ? sv_mortalcopy(*e) : &PL_sv_undef);
            }
        }
    }

void
_values(self)
    SV *self
    PPCODE:
    {
        AV *rav = hmf_values_av(aTHX_ self);
        SSize_t i, n = rav ? av_len(rav) + 1 : 0;
        EXTEND(SP, n);
        for (i = 0; i < n; i++) {
            SV **e = av_fetch(rav, i, 0);
            PUSHs(e ? sv_mortalcopy(*e) : &PL_sv_undef);
        }
    }

xs/headers.xs  view on Meta::CPAN

        }
    }
    OUTPUT:
        RETVAL

# every value for $name, in order
void
get_all(self, name)
    SV *self
    SV *name
    PPCODE:
    {
        STRLEN nl;
        const char *ns = SvPV_const(name, nl);
        AV *av = (AV *)SvRV(self);
        SSize_t n = av_len(av) + 1, i;
        for (i = 0; i + 1 < n; i += 2) {
            SV **k = av_fetch(av, i, 0);
            if (k && *k) {
                STRLEN kl;
                const char *ks = SvPV_const(*k, kl);

xs/headers.xs  view on Meta::CPAN

        }
        RETVAL = SvREFCNT_inc(self);
    }
    OUTPUT:
        RETVAL

# distinct field names, in order of first appearance
void
names(self)
    SV *self
    PPCODE:
    {
        AV *av = (AV *)SvRV(self);
        AV *seen = newAV();
        SSize_t n = av_len(av) + 1, i;
        sv_2mortal((SV *)seen);
        for (i = 0; i + 1 < n; i += 2) {
            SV **k = av_fetch(av, i, 0);
            if (k && *k) {
                STRLEN kl;
                const char *ks = SvPV_const(*k, kl);

xs/headers.xs  view on Meta::CPAN

                    mXPUSHs(newSVsv(*k));
                }
            }
        }
    }

# the flat name => value list
void
pairs(self)
    SV *self
    PPCODE:
    {
        AV *av = (AV *)SvRV(self);
        SSize_t n = av_len(av) + 1, i;
        for (i = 0; i < n; i++) {
            SV **e = av_fetch(av, i, 0);
            mXPUSHs((e && *e) ? newSVsv(*e) : newSV(0));
        }
    }

# a shallow copy



( run in 0.563 second using v1.01-cache-2.11-cpan-4e7a2411597 )