Set-IntSpan-Fast-XS
view release on metacpan or search on metacpan
__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 )