#![cfg_attr(not(feature = "std"), no_std)]
#![cfg_attr(feature = "nightly", feature(generic_associated_types))]
#![doc = include_str!("../README.md")]
use core::cmp::Ordering;
use raw::{ElementCtor, EntwineCore, PtrMut, RefMut};
pub mod index;
pub mod raw;
mod slice_impl;
mod sort;
mod zip_impl;
pub type RefT<'a, E> = <<E as EntwineCore>::ElementCtor as ElementCtor>::Ref<'a>;
pub type RefMutT<'a, E> = <<E as EntwineCore>::ElementCtor as ElementCtor>::RefMut<'a>;
pub type PtrT<E> = <<E as EntwineCore>::ElementCtor as ElementCtor>::Ptr;
pub type PtrMutT<E> = <<E as EntwineCore>::ElementCtor as ElementCtor>::PtrMut;
pub trait Entwine: EntwineCore {
fn get(&self, n: usize) -> Option<RefT<'_, Self>> {
(n < self.len()).then(|| unsafe { self.get_unchecked(n) })
}
fn get_mut(&mut self, n: usize) -> Option<RefMutT<'_, Self>> {
(n < self.len()).then(|| unsafe { self.get_unchecked_mut(n) })
}
fn as_mut_ptr(&mut self) -> PtrMutT<Self> {
unsafe { self.get_unchecked_mut(0).to_mut_ptr() }
}
fn swap(&mut self, a: usize, b: usize) {
let len = self.len();
assert!(a < len && b < len);
unsafe {
let pa = self.get_unchecked_mut(a).to_mut_ptr();
let pb = self.get_unchecked_mut(b).to_mut_ptr();
PtrMut::swap(&pa, &pb);
}
}
fn sort_unstable(&mut self)
where
for<'a, 'b> RefT<'a, Self>: PartialOrd<RefT<'b, Self>>,
{
sort::quicksort(self, |a, b| a.lt(b));
}
fn sort_unstable_by<F>(&mut self, mut compare: F)
where
F: FnMut(&RefT<'_, Self>, &RefT<'_, Self>) -> Ordering,
{
sort::quicksort(self, |a, b| compare(a, b) == Ordering::Less);
}
fn sort_unstable_by_key<K, F>(&mut self, mut f: F)
where
F: FnMut(&RefT<'_, Self>) -> K,
K: Ord,
{
sort::quicksort(self, |a, b| f(a).lt(&f(b)));
}
}
impl<E: EntwineCore + ?Sized> Entwine for E {}