Sort-Key-Radix
view release on metacpan or search on metacpan
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 )