#![cfg_attr(not(feature = "std"), no_std)]
extern crate alloc;
mod collections;
#[cfg(feature = "std")]
mod arc_mutex;
#[cfg(feature = "std")]
mod arc_rw_lock;
use core::cmp::Ordering;
#[cfg(feature = "std")]
pub use arc_mutex::*;
#[cfg(feature = "std")]
pub use arc_rw_lock::*;
#[doc(hidden)]
pub trait SortedInsertBasic<T> {
#[doc(hidden)]
fn insert_element(&mut self, index: usize, element: T);
}
pub trait SortedInsertBy<T>: SortedInsertBasic<T> {
#[inline]
fn sorted_insert_by<F: FnMut(&T, &T) -> bool>(&mut self, element: T, mut f: F) -> usize {
let index = self.get_sorted_insert_index_by(|e| f(e, &element));
self.insert_element(index, element);
index
}
#[doc(hidden)]
fn get_sorted_insert_index_by<F: FnMut(&T) -> bool>(&self, f: F) -> usize;
}
pub trait SortedInsertByKey<T>: SortedInsertBy<T> {
#[inline]
fn sorted_insert_asc_by_key<A: Ord, F: FnMut(&T) -> &A>(
&mut self,
element: T,
mut f: F,
) -> usize {
self.sorted_insert_by(element, |e, element| f(e) <= f(element))
}
#[inline]
fn sorted_insert_desc_by_key<A: Ord, F: FnMut(&T) -> &A>(
&mut self,
element: T,
mut f: F,
) -> usize {
self.sorted_insert_by(element, |e, element| f(e) >= f(element))
}
}
pub trait SortedInsert<T: Ord>: SortedInsertByKey<T> {
#[inline]
fn sorted_insert_asc(&mut self, element: T) -> usize {
self.sorted_insert_asc_by_key(element, |element| element)
}
fn sorted_insert_desc(&mut self, element: T) -> usize {
self.sorted_insert_desc_by_key(element, |element| element)
}
}
pub trait SortedInsertBinaryBy<T>: SortedInsertBy<T> {
fn sorted_insert_binary_by<F: FnMut(&T, &T) -> Ordering>(
&mut self,
element: T,
mut f: F,
) -> usize {
let index = self.get_sorted_insert_index_binary_by(|e| f(e, &element));
self.insert_element(index, element);
index
}
#[doc(hidden)]
fn get_sorted_insert_index_binary_by<F: FnMut(&T) -> Ordering>(&mut self, f: F) -> usize;
}
pub trait SortedInsertBinaryByKey<T>: SortedInsertBinaryBy<T> {
#[inline]
fn sorted_insert_binary_asc_by_key<A: Ord, F: FnMut(&T) -> &A>(
&mut self,
element: T,
mut f: F,
) -> usize {
self.sorted_insert_binary_by(element, |e, element| f(e).cmp(f(element)))
}
#[inline]
fn sorted_insert_binary_desc_by_key<A: Ord, F: FnMut(&T) -> &A>(
&mut self,
element: T,
mut f: F,
) -> usize {
self.sorted_insert_binary_by(element, |e, element| f(element).cmp(f(e)))
}
}
pub trait SortedInsertBinary<T: Ord>: SortedInsertBinaryByKey<T> {
#[inline]
fn sorted_insert_asc_binary(&mut self, element: T) -> usize {
self.sorted_insert_binary_asc_by_key(element, |element| element)
}
#[inline]
fn sorted_insert_desc_binary(&mut self, element: T) -> usize {
self.sorted_insert_binary_desc_by_key(element, |element| element)
}
}