use crate::key_extractor::KeyExtractor;
use restructure::{restructure_in_place_copy, restructure_in_place_permute, should_use_in_place};
use scan::{scan_phase, scan_phase_without_key};
mod constants;
mod restructure;
mod scan;
pub(crate) fn tilesort_impl_with_key_inplace<T, K, E>(
data: &mut [T],
key_extractor: E,
reverse: bool,
) where
T: Clone,
K: Ord,
E: KeyExtractor<T, K>,
{
if data.len() <= 1 {
return;
}
let mut tile_index = scan_phase(data, key_extractor, reverse);
tile_index.finalize_statistics();
if should_use_in_place(&tile_index, data.len()) {
restructure_in_place_permute(data, &tile_index);
} else {
restructure_in_place_copy(data, &tile_index);
}
}
pub(crate) fn tilesort_impl_inplace<T: Ord + Clone>(data: &mut [T], reverse: bool) {
if data.len() <= 1 {
return;
}
let mut tile_index = scan_phase_without_key(data, reverse);
tile_index.finalize_statistics();
if should_use_in_place(&tile_index, data.len()) {
restructure_in_place_permute(data, &tile_index);
} else {
restructure_in_place_copy(data, &tile_index);
}
}
pub(crate) fn tilesort_copy<T: Ord + Clone>(data: &[T], reverse: bool) -> Vec<T> {
if data.len() <= 1 {
return data.to_vec();
}
let tile_index = scan_phase_without_key(data, reverse);
let mut result = Vec::with_capacity(data.len());
for tile in tile_index.iter() {
let start = tile.start_idx();
let end = start + tile.len();
result.extend_from_slice(&data[start..end]);
}
result
}
pub(crate) fn tilesort_copy_with_key<T, K, E>(data: &[T], key_extractor: E, reverse: bool) -> Vec<T>
where
T: Clone,
K: Ord,
E: KeyExtractor<T, K>,
{
if data.len() <= 1 {
return data.to_vec();
}
let tile_index = scan_phase(data, key_extractor, reverse);
let mut result = Vec::with_capacity(data.len());
for tile in tile_index.iter() {
let start = tile.start_idx();
let end = start + tile.len();
result.extend_from_slice(&data[start..end]);
}
result
}