Algorithm-BinarySearch-Vec

 view release on metacpan or  search on metacpan

Vec.xs  view on Meta::CPAN

}

//--------------------------------------------------------------
static ABSV_UINT absv_bsearch_ub(const uchar *v, ABSV_UINT key, ABSV_UINT ilo, ABSV_UINT ihi, ABSV_UINT nbits)
{
 ABSV_UINT imid, imax=ihi;
 while (ihi-ilo > 1) {
   imid = (ihi+ilo) >> 1;
   if (absv_vget(v, imid, nbits) > key) {
     ihi = imid;
   } else {
     ilo = imid;
   }
 }
 if (ihi<imax && absv_vget(v,ihi,nbits)==key) return ihi;
 if (            absv_vget(v,ilo,nbits)>=key) return ilo;
 return ihi>=imax ? KEY_NOT_FOUND : ihi;
}

/*==============================================================================
 * XS Guts
 */

MODULE = Algorithm::BinarySearch::Vec    PACKAGE = Algorithm::BinarySearch::Vec::XS

PROTOTYPES: ENABLE

##===================================================================
## DEBUG
##=====================================================================

##--------------------------------------------------------------
ABSV_UINT
vget(SV *vec, ABSV_UINT i, ABSV_UINT nbits)
PREINIT:
  uchar *vp;
  STRLEN len;
CODE:
 vp = (uchar *)SvPVbyte(vec, len);
 if (len > i*nbits/8)
   RETVAL = absv_vget(vp, i, nbits);
 else
   RETVAL = 0;
OUTPUT:
  RETVAL

 ##--------------------------------------------------------------
void
vset(SV *vec, ABSV_UINT i, ABSV_UINT nbits, ABSV_UINT val)
PREINIT:
  uchar *vp;
  STRLEN len;
CODE:
 vp = (uchar *)SvPVbyte(vec,len);
 if (len <= i*nbits/8) {
#if 0
   //-- doesn't propagate to perl sv?
   vp = (uchar *)SvGROW(vec, (i+1)*nbits/8);
   SvCUR_set(vec, (i+1)*nbits/8);
#endif //-- re-allocate
   croak("vset(): index " ABSV_PRI " exceeds vector length = " ABSV_PRI " element(s)", i, i*nbits/8);
 }
 absv_vset(vp, i, nbits, val);

##=====================================================================
## CONSTANTS

##--------------------------------------------------------------
ABSV_UINT
HAVE_QUAD()
CODE:
#ifdef ABSV_HAVE_QUAD
 RETVAL = 1;
#else
 RETVAL = 0;
#endif
OUTPUT:
 RETVAL

##--------------------------------------------------------------
ABSV_UINT
KEY_NOT_FOUND()
CODE:
 RETVAL = KEY_NOT_FOUND;
OUTPUT:
 RETVAL

##=====================================================================
## BINARY SEARCH, element-wise

##--------------------------------------------------------------
ABSV_UINT
vbsearch(SV *vec, ABSV_UINT key, ABSV_UINT nbits, ...)
PREINIT:
  const uchar *v;
  STRLEN vlen;
  ABSV_UINT ilo, ihi;
CODE:
 v = SvPV(vec,vlen);
 ilo = items > 3 ? SvUV(ST(3)) : 0;
 ihi = items > 4 ? SvUV(ST(4)) : (vlen*8/nbits);
 RETVAL = absv_bsearch(v,key,ilo,ihi,nbits);
OUTPUT:
 RETVAL

##--------------------------------------------------------------
ABSV_UINT
vbsearch_lb(SV *vec, ABSV_UINT key, ABSV_UINT nbits, ...)
PREINIT:
  const uchar *v;
  STRLEN vlen;
  ABSV_UINT ilo, ihi;
CODE:
 v = SvPV(vec,vlen);
 ilo = items > 3 ? SvUV(ST(3)) : 0;
 ihi = items > 4 ? SvUV(ST(4)) : (vlen*8/nbits);
 RETVAL = absv_bsearch_lb(v,key,ilo,ihi,nbits);
OUTPUT:
 RETVAL

##--------------------------------------------------------------



( run in 0.634 second using v1.01-cache-2.11-cpan-140bd7fdf52 )