Set-IntSpan-Fast-XS

 view release on metacpan or  search on metacpan

XS.xs  view on Meta::CPAN

__merge( AV * self, AV * s1, AV * s2 ) {
  I32 l1 = av_len( s1 ) + 1;
  I32 l2 = av_len( s2 ) + 1;

  IV lo, hi, last;
  I32 p1 = 0, p2 = 0, po = 0;
  AV *out = newAV(  );

  while ( p1 < l1 || p2 < l2 ) {
    if ( p1 < l1 && p2 < l2 ) {
      IV lo1 = _av_fetch_iv( s1, p1 );
      IV lo2 = _av_fetch_iv( s2, p2 );
      if ( lo1 < lo2 ) {
        lo = lo1;
        hi = _av_fetch_iv( s1, p1 + 1 );
        p1 += 2;
      }
      else {
        lo = lo2;
        hi = _av_fetch_iv( s2, p2 + 1 );
        p2 += 2;
      }
    }
    else if ( p1 < l1 ) {
      lo = _av_fetch_iv( s1, p1 );
      hi = _av_fetch_iv( s1, p1 + 1 );
      p1 += 2;
    }
    else {
      lo = _av_fetch_iv( s2, p2 );
      hi = _av_fetch_iv( s2, p2 + 1 );
      p2 += 2;
    }

    if ( po ) {
      last = _av_fetch_iv( out, po - 1 );
      if ( lo <= last ) {
        _av_store_iv( out, po - 1, last > hi ? last : hi );
        continue;
      }
    }

    _av_push_iv( out, lo );
    _av_push_iv( out, hi );
    po += 2;
  }

  return out;
}

/* *INDENT-OFF* */

MODULE = Set::IntSpan::Fast::XS PACKAGE = Set::IntSpan::Fast::XS
PROTOTYPES: ENABLE

int
_find_pos(self, val, low = 0)
AV *self;
IV val = SvIV(ST(1));
IV low = ( items == 3 ) ? SvIV( ST( 2 ) ) : 0;
PPCODE:
{
    XSRETURN_IV( __find_pos(self, val, low ) );
}

AV * 
_merge(self, s1, s2)
AV *self;
AV *s1;
AV *s2;
CODE:
    RETVAL = __merge(self, s1, s2);
    sv_2mortal((SV*) RETVAL);
OUTPUT:
    RETVAL



( run in 1.344 second using v1.01-cache-2.11-cpan-5511b514fd6 )