pub mod objects {
pub fn heapsort<T>(array: &mut[T], compare: ::comparison_fn<T>) {
if array.len() == 0 {
return;
}
let mut n = array.len() as usize - 1;
let mut k = n / 2;
k += 1;
while k > 0 {
k -= 1;
downheap(array, n, k, compare);
}
while n > 0 {
array.swap(0usize, n as usize);
n -= 1;
downheap(array, n, 0, compare);
}
}
#[doc(hidden)]
fn downheap<T>(array: &mut[T], n: usize, t_k: usize, compare: ::comparison_fn<T>) {
let mut k = t_k;
while k <= n / 2 {
let mut j = 2 * k;
if j < n && compare(&array[j as usize], &array[j as usize + 1]) < 0 {
j += 1;
}
if compare(&array[k as usize], &array[j as usize]) < 0 {
array.swap(j as usize, k as usize);
} else {
break;
}
k = j;
}
}
pub fn heapsort_index<T>(p: &mut[usize], array: &[T], compare: ::comparison_fn<T>) -> ::Value {
if array.len() == 0 {
return ::Value::Success;
}
for tmp in 0usize..array.len() as usize {
p[tmp as usize] = tmp;
}
let mut n = array.len() as usize - 1;
let mut k = n / 2;
k += 1;
while k > 0 {
k -= 1;
downheap_index(p, array, n, k, compare);
}
while n > 0 {
p.swap(0usize, n as usize);
n -= 1;
downheap_index(p, array, n, 0, compare);
}
::Value::Success
}
#[doc(hidden)]
fn downheap_index<T>(p: &mut[usize], array: &[T], n: usize, t_k: usize, compare: ::comparison_fn<T>) {
let pki = p[t_k as usize];
let mut k = t_k;
while k <= n / 2 {
let mut j = 2 * k;
if j < n && compare(&array[p[j as usize] as usize], &array[p[j as usize + 1] as usize]) < 0 {
j += 1;
}
if compare(&array[pki as usize], &array[p[j as usize] as usize]) >= 0 {
break;
}
p[k as usize] = p[j as usize];
k = j;
}
p[k as usize] = pki;
}
}
pub mod vectors {
use ffi;
use types::{VectorF64, Permutation};
use enums;
pub fn sort(data: &mut [f64], stride: usize, n: usize) {
unsafe { ffi::gsl_sort(data.as_mut_ptr(), stride, n) }
}
pub fn sort2(data1: &mut [f64], stride1: usize, data2: &mut [f64], stride2: usize, n: usize) {
unsafe { ffi::gsl_sort2(data1.as_mut_ptr(), stride1, data2.as_mut_ptr(), stride2, n) }
}
pub fn sort_vector(v: &mut VectorF64) {
unsafe { ffi::gsl_sort_vector(ffi::FFI::unwrap_unique(v)) }
}
pub fn sort_vector2(v1: &mut VectorF64, v2: &mut VectorF64) {
unsafe { ffi::gsl_sort_vector2(ffi::FFI::unwrap_unique(v1), ffi::FFI::unwrap_unique(v2)) }
}
pub fn sort_index(p: &mut [usize], data: &[f64], stride: usize, n: usize) {
unsafe { ffi::gsl_sort_index(p.as_mut_ptr(), data.as_ptr(), stride, n) }
}
pub fn sort_vector_index(p: &mut Permutation, v: &VectorF64) -> enums::Value {
unsafe { ffi::gsl_sort_vector_index(ffi::FFI::unwrap_unique(p), ffi::FFI::unwrap_shared(v)) }
}
}
pub mod select {
use ffi;
use types::VectorF64;
use enums;
pub fn sort_smallest(dest: &mut [f64], k: usize, src: &[f64], stride: usize) -> enums::Value {
unsafe { ffi::gsl_sort_smallest(dest.as_mut_ptr(), k, src.as_ptr(), stride, src.len() as usize) }
}
pub fn sort_largest(dest: &mut [f64], k: usize, src: &[f64], stride: usize) -> enums::Value {
unsafe { ffi::gsl_sort_largest(dest.as_mut_ptr(), k, src.as_ptr(), stride, src.len() as usize) }
}
pub fn sort_vector_smallest(dest: &mut [f64], k: usize, v: &VectorF64) -> enums::Value {
unsafe { ffi::gsl_sort_vector_smallest(dest.as_mut_ptr(), k, ffi::FFI::unwrap_shared(v)) }
}
pub fn sort_vector_largest(dest: &mut [f64], k: usize, v: &VectorF64) -> enums::Value {
unsafe { ffi::gsl_sort_vector_largest(dest.as_mut_ptr(), k, ffi::FFI::unwrap_shared(v)) }
}
pub fn sort_smallest_index(p: &mut [usize], k: usize, src: &[f64], stride: usize) -> enums::Value {
unsafe { ffi::gsl_sort_smallest_index(p.as_mut_ptr(), k, src.as_ptr(), stride, src.len() as usize) }
}
pub fn sort_largest_index(p: &mut [usize], k: usize, src: &[f64], stride: usize) -> enums::Value {
unsafe { ffi::gsl_sort_largest_index(p.as_mut_ptr(), k, src.as_ptr(), stride, src.len() as usize) }
}
pub fn sort_vector_smallest_index(p: &mut [usize], k: usize, v: &VectorF64) -> enums::Value {
unsafe { ffi::gsl_sort_vector_smallest_index(p.as_mut_ptr(), k, ffi::FFI::unwrap_shared(v)) }
}
pub fn sort_vector_largest_index(p: &mut [usize], k: usize, v: &VectorF64) -> enums::Value {
unsafe { ffi::gsl_sort_vector_largest_index(p.as_mut_ptr(), k, ffi::FFI::unwrap_shared(v)) }
}
}