5 #include "pdqidxsort.h"
7 #define MVL_STATIC_MEMBERS 1
11 template <
class Numeric>
15 pdqidxsort_branchless(data, data+count, indices, [](Numeric a, Numeric b) {
return (a<b);});
28 template <
class Numeric>
32 pdqidxsort_branchless(data, data+count, indices, [](Numeric a, Numeric b) {
return (a>b);});
49 const unsigned char *ad, *bd;
57 if(ad[j]<bd[j])
return true;
58 if(ad[j]>bd[j])
return false;
68 const unsigned char *ad, *bd;
76 if(ad[j]>bd[j])
return true;
77 if(ad[j]<bd[j])
return false;
83 template <
class Numeric>
88 while(i<stop-start-1) {
89 if(data[i]!=data[i+1]) {
93 for(j=i+2;(j<stop-start) && data[j]==data[i];j++);
94 ties.push_back(std::make_pair(i+start, j+start));
116 if(new_length>length) {
119 data0=malloc(new_length);
155 unsigned char *d=(
unsigned char*)scratch.data();
157 sort_indices_asc(stop-start, indices+start, d);
163 int *d=(
int *)scratch.data();
165 sort_indices_asc(stop-start, indices+start, d);
171 float *d=(
float *)scratch.data();
173 sort_indices_asc(stop-start, indices+start, d);
179 long long int *d=(
long long int*)scratch.data();
181 sort_indices_asc(stop-start, indices+start, d);
189 sort_indices_asc(stop-start, indices+start, d);
195 double *d=(
double *)scratch.data();
197 sort_indices_asc(stop-start, indices+start, d);
201 sort_indices_packed_list64_asc(start, stop, indices, vec, data);
216 unsigned char *d=(
unsigned char*)scratch.data();
218 sort_indices_desc(stop-start, indices+start, d);
224 int *d=(
int *)scratch.data();
226 sort_indices_desc(stop-start, indices+start, d);
232 float *d=(
float *)scratch.data();
234 sort_indices_desc(stop-start, indices+start, d);
240 long long int *d=(
long long int*)scratch.data();
242 sort_indices_desc(stop-start, indices+start, d);
250 sort_indices_desc(stop-start, indices+start, d);
256 double *d=(
double *)scratch.data();
258 sort_indices_desc(stop-start, indices+start, d);
262 sort_indices_packed_list64_desc(start, stop, indices, vec, data);
273 const unsigned char *ad, *bd;
282 if(ad[k]!=bd[k])
return 0;
289 if(scratch.error()<0)
return;
294 unsigned char *d=(
unsigned char*)scratch.data();
295 mvl_find_ties(start, stop, d, ties);
299 int *d=(
int *)scratch.data();
300 mvl_find_ties(start, stop, d, ties);
304 float *d=(
float *)scratch.data();
305 mvl_find_ties(start, stop, d, ties);
309 long long int *d=(
long long int*)scratch.data();
310 mvl_find_ties(start, stop, d, ties);
315 mvl_find_ties(start, stop, d, ties);
319 double *d=(
double *)scratch.data();
320 mvl_find_ties(start, stop, d, ties);
327 if(!mvl_packed64_equal(vec, data, indices[i], indices[i+1])) {
332 for(j=i+2;j<stop && mvl_packed64_equal(vec, data, indices[i], indices[j]);j++);
333 ties.push_back(std::make_pair(i, j));
356 if(vec_count<1)
return 0;
360 std::vector<std::pair<LIBMVL_OFFSET64, LIBMVL_OFFSET64>> ties1, ties2;
364 ties1.push_back(std::make_pair(0, indices_count));
366 for(i=0;i<vec_count;i++) {
368 for(j=0;j<ties1.size();j++) {
369 switch(sort_function) {
371 mvl_indexed_sort_single_vector_asc(ties1[j].first, ties1[j].second, indices, vec[i], vec_data[i], scratch);
374 mvl_indexed_sort_single_vector_desc(ties1[j].first, ties1[j].second, indices, vec[i], vec_data[i], scratch);
380 mvl_indexed_find_ties(ties1[j].first, ties1[j].second, indices, vec[i], vec_data[i], scratch, ties2);
382 std::swap(ties1, ties2);
383 if(ties1.size()<1)
break;
385 if(scratch.error()<0)
return(scratch.error());
391 for(j=0;j<ties1.size();j++) {
392 pdqsort(indices+ties1[j].first, indices+ties1[j].second);