mod lsb;
mod lsb_swc;
mod msb;
mod stash;
mod batched_vec;
pub use lsb::Sorter as LSBRadixSorter;
pub use lsb_swc::Sorter as LSBSWCRadixSorter;
pub use msb::Sorter as MSBRadixSorter;
pub trait Unsigned : Ord {
fn bytes() -> usize;
fn as_u64(&self) -> u64;
}
impl Unsigned for u8 { #[inline]fn bytes() -> usize { 1 } #[inline] fn as_u64(&self) -> u64 { *self as u64 } }
impl Unsigned for u16 { #[inline]fn bytes() -> usize { 2 } #[inline] fn as_u64(&self) -> u64 { *self as u64 } }
impl Unsigned for u32 { #[inline]fn bytes() -> usize { 4 } #[inline] fn as_u64(&self) -> u64 { *self as u64 } }
impl Unsigned for u64 { #[inline]fn bytes() -> usize { 8 } #[inline] fn as_u64(&self) -> u64 { *self as u64 } }
impl Unsigned for usize { #[inline]fn bytes() -> usize { ::std::mem::size_of::<usize>() } #[inline]fn as_u64(&self) -> u64 { *self as u64 } }
pub trait RadixSorter<T, U: Unsigned> : RadixSorterBase<T> {
fn push<F: Fn(&T)->U>(&mut self, element: T, key: &F);
fn push_batch<F: Fn(&T)->U>(&mut self, batch: Vec<T>, key: &F);
fn extend<F: Fn(&T)->U, I: Iterator<Item=T>>(&mut self, iterator: I, key: &F) {
for element in iterator {
self.push(element, key)
}
}
fn finish<F: Fn(&T)->U>(&mut self, key: &F) -> Vec<Vec<T>> {
let mut result = Vec::new();
self.finish_into(&mut result, key);
result
}
fn finish_into<F: Fn(&T)->U>(&mut self, target: &mut Vec<Vec<T>>, key: &F);
fn sort<F: Fn(&T)->U>(&mut self, batches: &mut Vec<Vec<T>>, key: &F) {
for batch in batches.drain(..) {
self.push_batch(batch, key);
}
self.finish_into(batches, key);
}
}
pub trait RadixSorterBase<T> {
fn new() -> Self;
fn recycle(&mut self, buffers: &mut Vec<Vec<T>>) {
self.rebalance(buffers, usize::max_value());
}
fn rebalance(&mut self, buffers: &mut Vec<Vec<T>>, intended: usize);
}