#pragma once
#include <luna/Types.h>

typedef int (*compar_t)(const void*, const void*);

void c_quicksort(void* base, usize nmemb, usize size, compar_t compar);

template <typename T> void sort(T* base, usize nmemb, int (*compar)(const T*, const T*))
{
    return c_quicksort(base, nmemb, sizeof(T), (compar_t)compar);
}

template <typename T> void sort(T* base, usize nmemb, compar_t compar)
{
    return c_quicksort(base, nmemb, sizeof(T), compar);
}

template <typename T> void sort(T* begin, T* end, int (*compar)(const T*, const T*))
{
    return c_quicksort(begin, end - begin, sizeof(T), (compar_t)compar);
}

template <typename T> void sort(T* begin, T* end, compar_t compar)
{
    return c_quicksort(begin, end - begin, sizeof(T), compar);
}