Skip to content

Commit

Permalink
Road to C++: quicksort.c.src -> quicksort.cpp
Browse files Browse the repository at this point in the history
Quicksort depends on heapsort. In order to keep current (temporary) structure, I
had to explicitly instantiate each heapsort function. This will disappear once I
cut the final pieces of .c.src from src/npysort.
  • Loading branch information
serge-sans-paille committed Feb 10, 2022
1 parent 9d3735a commit da6fd57
Show file tree
Hide file tree
Showing 5 changed files with 1,100 additions and 660 deletions.
2 changes: 1 addition & 1 deletion numpy/core/setup.py
Expand Up @@ -948,7 +948,7 @@ def gl_if_msvc(build_cmd):
join('src', 'multiarray', 'vdot.c'),
join('src', 'common', 'npy_sort.h.src'),
join('src', 'npysort', 'x86-qsort.dispatch.c.src'),
join('src', 'npysort', 'quicksort.c.src'),
join('src', 'npysort', 'quicksort.cpp'),
join('src', 'npysort', 'mergesort.cpp'),
join('src', 'npysort', 'timsort.cpp'),
join('src', 'npysort', 'heapsort.cpp'),
Expand Down
143 changes: 140 additions & 3 deletions numpy/core/src/npysort/heapsort.cpp
Expand Up @@ -47,7 +47,7 @@
*/

template <typename Tag, typename type>
static int
NPY_NO_EXPORT int
heapsort_(type *start, npy_intp n)
{
type tmp, *a;
Expand Down Expand Up @@ -98,7 +98,7 @@ heapsort_(type *start, npy_intp n)
}

template <typename Tag, typename type>
static int
NPY_NO_EXPORT int
aheapsort_(type *vv, npy_intp *tosort, npy_intp n)
{
type *v = vv;
Expand Down Expand Up @@ -382,212 +382,349 @@ npy_aheapsort(void *vv, npy_intp *tosort, npy_intp n, void *varr)
/***************************************
* C > C++ dispatch
***************************************/

template NPY_NO_EXPORT int
heapsort_<npy::bool_tag, npy_bool>(npy_bool *, npy_intp);
NPY_NO_EXPORT int
heapsort_bool(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::bool_tag>((npy_bool *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::byte_tag, npy_byte>(npy_byte *, npy_intp);
NPY_NO_EXPORT int
heapsort_byte(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::byte_tag>((npy_byte *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::ubyte_tag, npy_ubyte>(npy_ubyte *, npy_intp);
NPY_NO_EXPORT int
heapsort_ubyte(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::ubyte_tag>((npy_ubyte *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::short_tag, npy_short>(npy_short *, npy_intp);
NPY_NO_EXPORT int
heapsort_short(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::short_tag>((npy_short *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::ushort_tag, npy_ushort>(npy_ushort *, npy_intp);
NPY_NO_EXPORT int
heapsort_ushort(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::ushort_tag>((npy_ushort *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::int_tag, npy_int>(npy_int *, npy_intp);
NPY_NO_EXPORT int
heapsort_int(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::int_tag>((npy_int *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::uint_tag, npy_uint>(npy_uint *, npy_intp);
NPY_NO_EXPORT int
heapsort_uint(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::uint_tag>((npy_uint *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::long_tag, npy_long>(npy_long *, npy_intp);
NPY_NO_EXPORT int
heapsort_long(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::long_tag>((npy_long *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::ulong_tag, npy_ulong>(npy_ulong *, npy_intp);
NPY_NO_EXPORT int
heapsort_ulong(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::ulong_tag>((npy_ulong *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::longlong_tag, npy_longlong>(npy_longlong *, npy_intp);
NPY_NO_EXPORT int
heapsort_longlong(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::longlong_tag>((npy_longlong *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::ulonglong_tag, npy_ulonglong>(npy_ulonglong *, npy_intp);
NPY_NO_EXPORT int
heapsort_ulonglong(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::ulonglong_tag>((npy_ulonglong *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::half_tag, npy_half>(npy_half *, npy_intp);
NPY_NO_EXPORT int
heapsort_half(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::half_tag>((npy_half *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::float_tag, npy_float>(npy_float *, npy_intp);
NPY_NO_EXPORT int
heapsort_float(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::float_tag>((npy_float *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::double_tag, npy_double>(npy_double *, npy_intp);
NPY_NO_EXPORT int
heapsort_double(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::double_tag>((npy_double *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::longdouble_tag, npy_longdouble>(npy_longdouble *, npy_intp);
NPY_NO_EXPORT int
heapsort_longdouble(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::longdouble_tag>((npy_longdouble *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::cfloat_tag, npy_cfloat>(npy_cfloat *, npy_intp);
NPY_NO_EXPORT int
heapsort_cfloat(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::cfloat_tag>((npy_cfloat *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::cdouble_tag, npy_cdouble>(npy_cdouble *, npy_intp);
NPY_NO_EXPORT int
heapsort_cdouble(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::cdouble_tag>((npy_cdouble *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::clongdouble_tag, npy_clongdouble>(npy_clongdouble *, npy_intp);
NPY_NO_EXPORT int
heapsort_clongdouble(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::clongdouble_tag>((npy_clongdouble *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::datetime_tag, npy_datetime>(npy_datetime *, npy_intp);
NPY_NO_EXPORT int
heapsort_datetime(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::datetime_tag>((npy_datetime *)start, n);
}

template NPY_NO_EXPORT int
heapsort_<npy::timedelta_tag, npy_timedelta>(npy_timedelta *, npy_intp);
NPY_NO_EXPORT int
heapsort_timedelta(void *start, npy_intp n, void *NPY_UNUSED(varr))
{
return heapsort_<npy::timedelta_tag>((npy_timedelta *)start, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::bool_tag, npy_bool>(npy_bool *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_bool(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::bool_tag>((npy_bool *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::byte_tag, npy_byte>(npy_byte *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_byte(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::byte_tag>((npy_byte *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::ubyte_tag, npy_ubyte>(npy_ubyte *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_ubyte(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::ubyte_tag>((npy_ubyte *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::short_tag, npy_short>(npy_short *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_short(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::short_tag>((npy_short *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::ushort_tag, npy_ushort>(npy_ushort *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_ushort(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
{
return aheapsort_<npy::ushort_tag>((npy_ushort *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::int_tag, npy_int>(npy_int *vv, npy_intp *tosort, npy_intp n);
NPY_NO_EXPORT int
aheapsort_int(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::int_tag>((npy_int *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::uint_tag, npy_uint>(npy_uint *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_uint(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::uint_tag>((npy_uint *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::long_tag, npy_long>(npy_long *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_long(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::long_tag>((npy_long *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::ulong_tag, npy_ulong>(npy_ulong *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_ulong(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::ulong_tag>((npy_ulong *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::longlong_tag, npy_longlong>(npy_longlong *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_longlong(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
{
return aheapsort_<npy::longlong_tag>((npy_longlong *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::ulonglong_tag, npy_ulonglong>(npy_ulonglong *vv,
npy_intp *tosort, npy_intp n);
NPY_NO_EXPORT int
aheapsort_ulonglong(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
{
return aheapsort_<npy::ulonglong_tag>((npy_ulonglong *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::half_tag, npy_half>(npy_half *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_half(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::half_tag>((npy_half *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::float_tag, npy_float>(npy_float *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_float(void *vv, npy_intp *tosort, npy_intp n, void *NPY_UNUSED(varr))
{
return aheapsort_<npy::float_tag>((npy_float *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::double_tag, npy_double>(npy_double *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_double(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
{
return aheapsort_<npy::double_tag>((npy_double *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::longdouble_tag, npy_longdouble>(npy_longdouble *vv,
npy_intp *tosort, npy_intp n);
NPY_NO_EXPORT int
aheapsort_longdouble(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
{
return aheapsort_<npy::longdouble_tag>((npy_longdouble *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::cfloat_tag, npy_cfloat>(npy_cfloat *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_cfloat(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
{
return aheapsort_<npy::cfloat_tag>((npy_cfloat *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::cdouble_tag, npy_cdouble>(npy_cdouble *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_cdouble(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
{
return aheapsort_<npy::cdouble_tag>((npy_cdouble *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::clongdouble_tag, npy_clongdouble>(npy_clongdouble *vv,
npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_clongdouble(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
{
return aheapsort_<npy::clongdouble_tag>((npy_clongdouble *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::datetime_tag, npy_datetime>(npy_datetime *vv, npy_intp *tosort,
npy_intp n);
NPY_NO_EXPORT int
aheapsort_datetime(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
{
return aheapsort_<npy::datetime_tag>((npy_datetime *)vv, tosort, n);
}

template NPY_NO_EXPORT int
aheapsort_<npy::timedelta_tag, npy_timedelta>(npy_timedelta *vv,
npy_intp *tosort, npy_intp n);
NPY_NO_EXPORT int
aheapsort_timedelta(void *vv, npy_intp *tosort, npy_intp n,
void *NPY_UNUSED(varr))
Expand Down

0 comments on commit da6fd57

Please sign in to comment.