Algorithm-CP-IZ
view release on metacpan or search on metacpan
av_push(elem, newSViv(idx));
av_push(elem, newSViv(vs.method));
av_push(elem, newSViv(vs.value));
r = (SV*)newRV_noinc((SV*)elem);
r = sv_bless(r, ngeh);
av_push(elements, r);
}
r = newRV_noinc((SV*)elements);
XPUSHs(sv_2mortal((SV*)r));
PUTBACK;
{
int count = call_method(meth, G_ARRAY);
SPAGAIN;
if (count > 0) {
ret = sv_true(POPs);
}
}
FREETMPS;
LEAVE;
}
return ret;
}
static IZBOOL noGoodSetPrefilterPerlWrapper(CSnoGoodSet* ngs, CSnoGood* ng, CSint** vars, int size, void* ext)
{
return noGoodSetFilterMethod("_prefilter", ngs, ng, vars, size, ext);
}
static IZBOOL noGoodSetFilterPerlWrapper(CSnoGoodSet* ngs, CSnoGood* ng, CSint** vars, int size, void* ext)
{
return noGoodSetFilterMethod("_filter", ngs, ng, vars, size, ext);
}
static void noGoodSetDestoryPerlWrapper(CSnoGoodSet* ngs, void* ext)
{
SV* ngsObj = (SV*)ext;
{
dTHX;
SvREFCNT_dec(ngsObj);
}
}
static void searchNotify_searchStart(int maxFails, CSint** allvars, int nbVars, void* ext) {
dTHX;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal((SV*)newRV(ext)));
XPUSHs(sv_2mortal((SV*)newSViv(maxFails)));
PUTBACK;
call_method("search_start", G_DISCARD);
FREETMPS;
LEAVE;
}
static void searchNotify_searchEnd(IZBOOL result, int nbFails, int maxFails, CSint** allvars, int nbVars, void* ext) {
dTHX;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal((SV*)newRV(ext)));
XPUSHs(sv_2mortal((SV*)newSViv(result)));
XPUSHs(sv_2mortal((SV*)newSViv(nbFails)));
XPUSHs(sv_2mortal((SV*)newSViv(maxFails)));
PUTBACK;
call_method("search_end", G_DISCARD);
FREETMPS;
LEAVE;
}
static void searchNotify_BeforeValueSelection(int depth, int index, const CSvalueSelection* vs, CSint** allvars, int nbVars, void* ext) {
dTHX;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal((SV*)newRV(ext)));
XPUSHs(sv_2mortal((SV*)newSViv(depth)));
XPUSHs(sv_2mortal((SV*)newSViv(index)));
XPUSHs(sv_2mortal((SV*)newSViv(vs->method)));
XPUSHs(sv_2mortal((SV*)newSViv(vs->value)));
PUTBACK;
call_method("before_value_selection", G_DISCARD);
FREETMPS;
LEAVE;
}
static void searchNotify_AfterValueSelection(IZBOOL result, int depth, int index, const CSvalueSelection* vs, CSint** allvars, int nbVars, void* ext) {
dTHX;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal((SV*)newRV(ext)));
XPUSHs(sv_2mortal((SV*)newSViv(result)));
XPUSHs(sv_2mortal((SV*)newSViv(depth)));
XPUSHs(sv_2mortal((SV*)newSViv(index)));
XPUSHs(sv_2mortal((SV*)newSViv(vs->method)));
XPUSHs(sv_2mortal((SV*)newSViv(vs->value)));
PUTBACK;
call_method("after_value_selection", G_DISCARD);
OUTPUT:
RETVAL
int
cs_searchValueSelectorFail(av, vs, findvar_id, findvar_ref, max_fail, nf_ref)
AV *av
AV *vs
int findvar_id
SV* findvar_ref
int max_fail
SV* nf_ref
PREINIT:
CSint** array;
const CSvalueSelector** vs_array;
SSize_t alen;
SSize_t i;
CODE:
alen = av_len(av) + 1;
Newx(array, alen, CSint*);
Newx(vs_array, alen, const CSvalueSelector*);
for (i = 0; i<alen; i++) {
SV** pptr = av_fetch(av, i, 0);
SV** vsptr = av_fetch(vs, i, 0);
SV** vsvs = hv_fetch((HV*)SvRV((*vsptr)), "_vs", 3, 0);
array[i] = INT2PTR(CSint*, SvIV(*pptr));
vs_array[i] = INT2PTR(CSvalueSelector*, SvIV(*vsvs));
}
currentArray2IndexFunc = 0;
findFreeVarPerlFunc = 0;
if (findvar_id < 0) {
findFreeVarPerlFunc = SvRV(findvar_ref);
currentArray2IndexFunc = findFreeVarPerlWrapper;
}
else {
if (findvar_id >= sizeof(findFreeVarTbl)/sizeof(findFreeVarTbl[0])) {
Safefree(array);
croak("search: Bad FindFreeVar value");
}
currentArray2IndexFunc = findFreeVarTbl[findvar_id];
}
if (max_fail < 0)
max_fail = INT_MAX;
RETVAL = cs_searchValueSelectorFail(array,
vs_array,
(int)alen,
currentArray2IndexFunc,
max_fail,
(nf_ref ? INT2PTR(CSsearchNotify*, SvIV(nf_ref)) : NULL));
Safefree(array);
Safefree(vs_array);
OUTPUT:
RETVAL
int
cs_searchValueSelectorRestartNG(av, vs, findvar_id, findvar_ref, max_fail_func, max_fail, ngs, nf_ref)
AV *av
AV *vs
int findvar_id
SV* findvar_ref
SV* max_fail_func
int max_fail
SV* ngs
SV* nf_ref
PREINIT:
CSint** array;
const CSvalueSelector** vs_array;
SSize_t alen;
SSize_t i;
CODE:
alen = av_len(av) + 1;
Newx(array, alen, CSint*);
Newx(vs_array, alen, const CSvalueSelector*);
for (i = 0; i<alen; i++) {
SV** pptr = av_fetch(av, i, 0);
SV** vsptr = av_fetch(vs, i, 0);
SV** vsvs = hv_fetch((HV*)SvRV((*vsptr)), "_vs", 3, 0);
array[i] = INT2PTR(CSint*, SvIV(*pptr));
vs_array[i] = INT2PTR(CSvalueSelector*, SvIV(*vsvs));
}
currentArray2IndexFunc = 0;
findFreeVarPerlFunc = 0;
if (findvar_id < 0) {
findFreeVarPerlFunc = SvRV(findvar_ref);
currentArray2IndexFunc = findFreeVarPerlWrapper;
}
else {
if (findvar_id >= sizeof(findFreeVarTbl)/sizeof(findFreeVarTbl[0])) {
Safefree(array);
croak("search: Bad FindFreeVar value");
}
currentArray2IndexFunc = findFreeVarTbl[findvar_id];
}
if (max_fail < 0)
max_fail = INT_MAX;
maxFailPerlFunc = max_fail_func;
RETVAL = cs_searchValueSelectorRestartNG(array,
vs_array,
(int)alen,
currentArray2IndexFunc,
maxFailFuncPerlWrapper,
NULL,
max_fail,
INT2PTR(CSnoGoodSet*, SvIV(ngs)),
(nf_ref ? INT2PTR(CSsearchNotify*, SvIV(nf_ref)) : NULL));
Safefree(array);
Safefree(vs_array);
OUTPUT:
RETVAL
int
cs_selectValue(rv, method, value)
SV *rv
int method
int value
PREINIT:
CSvalueSelection vs;
CODE:
vs.method = method;
vs.value = value;
RETVAL = cs_selectValue(INT2PTR(CSint*, SvIV(SvRV(rv))), &vs);
OUTPUT:
RETVAL
void*
cs_createSearchNotify(obj)
SV* obj
CODE:
RETVAL = cs_createSearchNotify(SvRV(obj));
OUTPUT:
RETVAL
void
searchNotify_set_search_start(notify)
SV* notify
CODE:
cs_searchNotifySetSearchStart(INT2PTR(void*, SvIV(notify)),
searchNotify_searchStart);
void
searchNotify_set_search_end(notify)
SV* notify
CODE:
cs_searchNotifySetSearchEnd(INT2PTR(void*, SvIV(notify)),
searchNotify_searchEnd);
void
searchNotify_set_before_value_selection(notify)
SV* notify
CODE:
cs_searchNotifySetBeforeValueSelection(INT2PTR(void*, SvIV(notify)),
searchNotify_BeforeValueSelection);
void
searchNotify_set_after_value_selection(notify)
SV* notify
CODE:
cs_searchNotifySetAfterValueSelection(INT2PTR(void*, SvIV(notify)),
searchNotify_AfterValueSelection);
void
searchNotify_set_enter(notify)
SV* notify
CODE:
cs_searchNotifySetEnter(INT2PTR(void*, SvIV(notify)),
searchNotify_Enter);
void
searchNotify_set_leave(notify)
SV* notify
CODE:
cs_searchNotifySetLeave(INT2PTR(void*, SvIV(notify)),
searchNotify_Leave);
void
searchNotify_set_found(notify)
SV* notify
CODE:
cs_searchNotifySetFound(INT2PTR(void*, SvIV(notify)),
searchNotify_Found);
void
cs_freeSearchNotify(notify)
void* notify
CODE:
cs_freeSearchNotify(notify);
#endif /* (IZ_VERSION_MAJOR == 3 && IZ_VERSION_MINOR >= 6) */
MODULE = Algorithm::CP::IZ PACKAGE = Algorithm::CP::IZ::Int
int
nb_elements(rv)
SV* rv;
( run in 1.077 second using v1.01-cache-2.11-cpan-39bf76dae61 )