Algorithm-Permute
view release on metacpan or search on metacpan
RETVAL
void
next(self)
Permute *self
PREINIT:
int i;
#ifdef USE_LINKEDLIST
listrecord *q; /* temporary holder */
#endif
PPCODE:
if (self->is_done) { /* done permutation for all combination */
if (self->c) {
free_combination(self->c);
self->c = NULL;
}
XSRETURN_EMPTY;
}
else {
EXTEND(sp, self->num);
#ifdef USE_LINKEDLIST
void
peek(self)
Permute *self
PREINIT:
#ifdef USE_LINKEDLIST
listrecord *q;
#else
int i;
#endif
PPCODE:
if (self->is_done)
XSRETURN_EMPTY;
EXTEND(sp, self->num);
#ifdef USE_LINKEDLIST
q = self->ptr_head->link;
while (q) {
PUSHs(sv_2mortal(newSVsv(*(self->items + q->info))));
q = q->link;
}
#else
CV* callback;
GV* agv;
I32 x;
PERL_CONTEXT* cx;
I32 gimme = G_VOID; /* We call our callback in VOID context */
bool old_catch;
struct afp_cache *c;
I32 hasargs = 0;
SV** newsp;
PPCODE:
{
if (!SvROK(callback_sv) || SvTYPE(SvRV(callback_sv)) != SVt_PVCV)
Perl_croak(aTHX_ "Callback is not a CODE reference");
if (!SvROK(array_sv) || SvTYPE(SvRV(array_sv)) != SVt_PVAV)
Perl_croak(aTHX_ "Array is not an ARRAY reference");
c = malloc(sizeof(struct afp_cache));
callback = (CV*)SvRV(callback_sv);
c->array = (AV*)SvRV(array_sv);
c->len = 1 + av_len(c->array);
( run in 0.540 second using v1.01-cache-2.11-cpan-71847e10f99 )