use super::functions::*;
#[allow(dead_code)]
pub struct DList<T: 'static> {
run: Box<dyn Fn(Vec<T>) -> Vec<T>>,
size_hint: usize,
}
impl<T: Clone + 'static> DList<T> {
#[allow(dead_code)]
pub fn empty() -> Self {
Self {
run: Box::new(|rest| rest),
size_hint: 0,
}
}
#[allow(dead_code)]
pub fn singleton(x: T) -> Self {
Self {
run: Box::new(move |mut rest| {
rest.insert(0, x.clone());
rest
}),
size_hint: 1,
}
}
#[allow(dead_code)]
pub fn to_vec(self) -> Vec<T> {
(self.run)(Vec::new())
}
#[allow(dead_code)]
pub fn size_hint(&self) -> usize {
self.size_hint
}
}
#[allow(dead_code)]
pub struct CircularBuffer<T> {
data: Vec<T>,
head: usize,
tail: usize,
len: usize,
capacity: usize,
}
impl<T> CircularBuffer<T> {
#[allow(dead_code)]
pub fn new(capacity: usize) -> Self {
Self {
data: Vec::with_capacity(capacity),
head: 0,
tail: 0,
len: 0,
capacity,
}
}
#[allow(dead_code)]
pub fn len(&self) -> usize {
self.len
}
#[allow(dead_code)]
pub fn is_empty(&self) -> bool {
self.len == 0
}
#[allow(dead_code)]
pub fn capacity(&self) -> usize {
self.capacity
}
#[allow(dead_code)]
pub fn is_full(&self) -> bool {
self.len == self.capacity
}
}
#[allow(dead_code)]
pub struct PrefixScan<T> {
pub values: Vec<T>,
pub inclusive: bool,
pub direction: &'static str,
}
impl<T: Clone> PrefixScan<T> {
#[allow(dead_code)]
pub fn inclusive(values: Vec<T>) -> Self {
Self {
values,
inclusive: true,
direction: "left",
}
}
#[allow(dead_code)]
pub fn exclusive(values: Vec<T>) -> Self {
Self {
values,
inclusive: false,
direction: "left",
}
}
#[allow(dead_code)]
pub fn values(&self) -> &[T] {
&self.values
}
#[allow(dead_code)]
pub fn len(&self) -> usize {
self.values.len()
}
#[allow(dead_code)]
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
}
#[allow(dead_code)]
pub struct FenwickTree {
data: Vec<i64>,
n: usize,
}
impl FenwickTree {
#[allow(dead_code)]
pub fn new(n: usize) -> Self {
Self {
data: vec![0; n + 1],
n,
}
}
#[allow(dead_code)]
pub fn update(&mut self, mut i: usize, delta: i64) {
while i <= self.n {
self.data[i] += delta;
i += i & i.wrapping_neg();
}
}
#[allow(dead_code)]
pub fn query(&self, mut i: usize) -> i64 {
let mut sum = 0i64;
while i > 0 {
sum += self.data[i];
i -= i & i.wrapping_neg();
}
sum
}
#[allow(dead_code)]
pub fn len(&self) -> usize {
self.n
}
#[allow(dead_code)]
pub fn is_empty(&self) -> bool {
self.n == 0
}
}
#[allow(dead_code)]
pub struct SparseVec<T> {
entries: Vec<(usize, T)>,
length: usize,
default_val: T,
}
impl<T: Clone + PartialEq> SparseVec<T> {
#[allow(dead_code)]
pub fn new(length: usize, default_val: T) -> Self {
Self {
entries: Vec::new(),
length,
default_val,
}
}
#[allow(dead_code)]
pub fn set(&mut self, i: usize, value: T) {
if i < self.length {
if let Some(entry) = self.entries.iter_mut().find(|(idx, _)| *idx == i) {
entry.1 = value;
} else {
self.entries.push((i, value));
}
}
}
#[allow(dead_code)]
pub fn get(&self, i: usize) -> &T {
self.entries
.iter()
.find(|(idx, _)| *idx == i)
.map(|(_, v)| v)
.unwrap_or(&self.default_val)
}
#[allow(dead_code)]
pub fn len(&self) -> usize {
self.length
}
#[allow(dead_code)]
pub fn is_empty(&self) -> bool {
self.length == 0
}
#[allow(dead_code)]
pub fn nnz(&self) -> usize {
self.entries.len()
}
}
#[allow(dead_code)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FixedVec<T> {
data: Box<[T]>,
}
impl<T: Clone> FixedVec<T> {
pub fn from_vec(v: Vec<T>) -> Self {
Self {
data: v.into_boxed_slice(),
}
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn get(&self, i: usize) -> Option<&T> {
self.data.get(i)
}
pub fn to_vec(&self) -> Vec<T> {
self.data.to_vec()
}
pub fn iter(&self) -> std::slice::Iter<'_, T> {
self.data.iter()
}
}