Sort-Key-Radix

 view release on metacpan or  search on metacpan

Radix.xs  view on Meta::CPAN

            break;

        default:
            Perl_croak(aTHX_ "internal error: bad ix value");
        }

        if (calc_klen) {
            SV **svkeys = ( keygen
                            ? calc_svkeys(aTHX_ keygen, values, offset, ax, n)
                            : values );
            klen = (*calc_klen)(aTHX_ svkeys, offset, ax, n);
            if (klen) {
                start = init_keys(aTHX_
                                  svkeys, offset, ax, n, NULL,
                                  sv_to_key, &keys, &temps, klen, &byte);

                /* if (n) print_keys("subkeys", keys, n, byte); */
        

            }
        }
        else if (klen)  {
            start = init_keys(aTHX_
                              values, offset, ax, n, keygen,
                              sv_to_key, &keys, &temps, klen, &byte);
        }
        if (byte >= 0) {
            SPAGAIN;
            /* printf("byte: %d\n", byte); */
            radix_sort_1(keys, temps, n, byte);
            
            if (values)
                resort_as_keys(aTHX_
                               values, values, start,
                               ((byte & 1) ? keys : temps),
                               n, klen);
            else
                resort_as_keys(aTHX_
                               &(ST(offset)), &(ST(0)), start,
                               ((byte & 1) ? keys : temps),
                               n, klen);
        }
    }
}

MODULE = Sort::Key::Radix		PACKAGE = Sort::Key::Radix		

void
_sort(...)
ALIAS:
    nsort = 2
    isort = 3
    usort = 4
    fsort = 5
    ssort = 7
    rnsort = 130
    risort = 131
    rusort = 132
    rfsort = 133
    rssort = 135
PPCODE:
    radix_sort(aTHX_ ix, 0, 0, 0, ax, items);
    SPAGAIN;
    XSRETURN(items);

void
_sort_inplace(AV *values)
PROTOTYPE: \@
PREINIT:
    AV *magic_values = 0;
    int len;
ALIAS:
    nsort_inplace = 2
    isort_inplace = 3
    usort_inplace = 4
    fsort_inplace = 5
    ssort_inplace = 7
    rnsort_inplace = 130
    risort_inplace = 131
    rusort_inplace = 132
    rfsort_inplace = 133
    rssort_inplace = 135
CODE:
    if ((len = av_len(values) + 1)) {
        /* warn("ix=%d\n", ix); */
	if (SvMAGICAL(values) || AvREIFY(values)) {
	    int i;
	    magic_values = values;
	    values = (AV*)sv_2mortal((SV*)newAV());
	    av_extend(values, len-1);
	    for (i=0; i<len; i++) {
		SV **currentp = av_fetch(magic_values, i, 0);
		av_store( values, i,
			  ( currentp
			    ? SvREFCNT_inc(*currentp)
			    : newSV(0) ) );
	    }
	}
	radix_sort(aTHX_ ix, 0, AvARRAY(values), 0, 0, len);
        SPAGAIN;
	if (magic_values) {
	    int i;
	    SV **values_array = AvARRAY(values);
	    for(i=0; i<len; i++) {
		SV *current = values_array[i];
		if (!current) current = &PL_sv_undef;
		if (!av_store(magic_values, i, SvREFCNT_inc(current)))
		    SvREFCNT_dec(current);
	    }
	}
    }

void
_keysort(SV *keygen, ...)
PROTOTYPE: &@
ALIAS:
    nkeysort = 2
    ikeysort = 3
    ukeysort = 4
    fkeysort = 5
    skeysort = 7
    rnkeysort = 130
    rikeysort = 131
    rukeysort = 132
    rfkeysort = 133
    rskeysort = 135
PPCODE:
    radix_sort(aTHX_ ix, keygen, 0, 1, ax, items - 1);
    SPAGAIN;
    XSRETURN(items - 1);


void
_keysort_inplace(SV *keygen, AV *values)
PROTOTYPE: &\@
PREINIT:
    AV *magic_values = 0;
    int len;
ALIAS:
    nkeysort_inplace = 2
    ikeysort_inplace = 3
    ukeysort_inplace = 4
    fkeysort_inplace = 5
    skeysort_inplace = 7
    rnkeysort_inplace = 130
    rikeysort_inplace = 131
    rukeysort_inplace = 132
    rfkeysort_inplace = 133
    rskeysort_inplace = 135
CODE:
    if ((len = av_len(values) + 1)) {
        /* warn("ix=%d\n", ix); */
	if (SvMAGICAL(values) || AvREIFY(values)) {
	    int i;
	    magic_values = values;
	    values = (AV*)sv_2mortal((SV*)newAV());
	    av_extend(values, len-1);
	    for (i=0; i<len; i++) {
		SV **currentp = av_fetch(magic_values, i, 0);
		av_store( values, i,
			  ( currentp
			    ? SvREFCNT_inc(*currentp)
			    : newSV(0) ) );
	    }
	}
	radix_sort(aTHX_ ix, keygen, AvARRAY(values), 0, 0, len);
        SPAGAIN;
	if (magic_values) {
	    int i;
	    SV **values_array = AvARRAY(values);
	    for(i=0; i<len; i++) {
		SV *current = values_array[i];
		if (!current) current = &PL_sv_undef;
		if (!av_store(magic_values, i, SvREFCNT_inc(current)))
		    SvREFCNT_dec(current);
	    }
	}
    }



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