use std::alloc::Allocator;
use std::fmt::{Debug, Formatter};
use std::ops::{Bound, Range, RangeBounds};
pub use conversion::{CloneElFn, VectorFnIter, VectorViewFn};
pub use map::{VectorFnMap, VectorViewMap, VectorViewMapMut};
use step_by::{StepBy, StepByFn};
use crate::ring::*;
mod conversion;
mod map;
pub mod step_by;
pub mod subvector;
pub mod permute;
pub mod sparse;
pub trait VectorView<T: ?Sized> {
fn len(&self) -> usize;
fn is_empty(&self) -> bool { self.len() == 0 }
fn at(&self, i: usize) -> &T;
unsafe fn at_unchecked(&self, i: usize) -> &T { self.at(i) }
fn specialize_sparse<'a, Op: SparseVectorViewOperation<T>>(&'a self, _op: Op) -> Option<Op::Output<'a>> { None }
fn as_iter<'a>(&'a self) -> VectorFnIter<VectorViewFn<'a, Self, T>, &'a T> { VectorFnIter::new(self.as_fn()) }
fn as_fn<'a>(&'a self) -> VectorViewFn<'a, Self, T> { VectorViewFn::new(self) }
fn as_slice(&self) -> Option<&[T]>
where
T: Sized,
{
None
}
fn into_clone_ring_els<R: RingStore>(self, ring: R) -> CloneElFn<Self, T, CloneRingEl<R>>
where
Self: Sized,
T: Sized,
R::Type: RingBase<Element = T>,
{
self.into_clone_els_by(CloneRingEl(ring))
}
fn clone_ring_els<R: RingStore>(&self, ring: R) -> CloneElFn<&Self, T, CloneRingEl<R>>
where
T: Sized,
R::Type: RingBase<Element = T>,
{
self.into_clone_ring_els(ring)
}
fn into_clone_els_by<F>(self, clone_entry: F) -> CloneElFn<Self, T, F>
where
Self: Sized,
T: Sized,
F: Fn(&T) -> T,
{
CloneElFn::new(self, clone_entry)
}
fn clone_els_by<F>(&self, clone_entry: F) -> CloneElFn<&Self, T, F>
where
T: Sized,
F: Fn(&T) -> T,
{
self.into_clone_els_by(clone_entry)
}
fn into_clone_els(self) -> CloneElFn<Self, T, CloneValue>
where
Self: Sized,
T: Sized + Clone,
{
CloneElFn::new(self, CloneValue)
}
fn clone_els(&self) -> CloneElFn<&Self, T, CloneValue>
where
T: Sized + Clone,
{
self.into_clone_els()
}
fn into_copy_els(self) -> CloneElFn<Self, T, CloneValue>
where
Self: Sized,
T: Sized + Copy,
{
CloneElFn::new(self, CloneValue)
}
fn copy_els(&self) -> CloneElFn<&Self, T, CloneValue>
where
T: Sized + Copy,
{
self.into_copy_els()
}
fn map_view<F: for<'a> Fn(&'a T) -> &'a U, U>(self, func: F) -> VectorViewMap<Self, T, U, F>
where
Self: Sized,
{
VectorViewMap::new(self, func)
}
fn step_by_view(self, step_by: usize) -> StepBy<Self, T>
where
Self: Sized,
{
StepBy::new(self, step_by)
}
}
pub trait VectorViewSparse<T: ?Sized>: VectorView<T> {
type Iter<'a>: Iterator<Item = (usize, &'a T)>
where
Self: 'a,
T: 'a;
fn nontrivial_entries<'a>(&'a self) -> Self::Iter<'a>;
}
pub trait SparseVectorViewOperation<T: ?Sized> {
type Output<'a>
where
Self: 'a;
fn execute<'a, V: 'a + VectorViewSparse<T> + Clone>(self, vector: V) -> Self::Output<'a>
where
Self: 'a;
}
fn range_within<R: RangeBounds<usize>>(len: usize, range: R) -> Range<usize> {
let start = match range.start_bound() {
Bound::Unbounded => 0,
Bound::Included(i) => {
assert!(*i <= len);
*i
}
Bound::Excluded(i) => {
assert!(*i <= len);
*i + 1
}
};
let end = match range.end_bound() {
Bound::Unbounded => len,
Bound::Included(i) => {
assert!(*i >= start);
assert!(*i < len);
*i + 1
}
Bound::Excluded(i) => {
assert!(*i >= start);
assert!(*i <= len);
*i
}
};
return start..end;
}
pub trait SelfSubvectorView<T: ?Sized>: Sized + VectorView<T> {
fn restrict_full(self, range: Range<usize>) -> Self;
fn restrict<R: RangeBounds<usize>>(self, range: R) -> Self {
let range_full = range_within(self.len(), range);
self.restrict_full(range_full)
}
}
impl<T: ?Sized, V: ?Sized + VectorView<T>> VectorView<T> for Box<V> {
fn len(&self) -> usize { (**self).len() }
fn at(&self, i: usize) -> &T { (**self).at(i) }
unsafe fn at_unchecked(&self, i: usize) -> &T { unsafe { (**self).at_unchecked(i) } }
fn specialize_sparse<'a, Op: SparseVectorViewOperation<T>>(&'a self, op: Op) -> Option<Op::Output<'a>> {
(**self).specialize_sparse(op)
}
fn as_slice(&self) -> Option<&[T]>
where
T: Sized,
{
(**self).as_slice()
}
}
impl<T: ?Sized, V: ?Sized + VectorViewMut<T>> VectorViewMut<T> for Box<V> {
fn at_mut(&mut self, i: usize) -> &mut T { (**self).at_mut(i) }
unsafe fn at_unchecked_mut<'a>(&mut self, i: usize) -> &mut T { unsafe { (**self).at_unchecked_mut(i) } }
fn as_slice_mut(&mut self) -> Option<&mut [T]>
where
T: Sized,
{
(**self).as_slice_mut()
}
}
impl<T: ?Sized, V: ?Sized + VectorViewSparse<T>> VectorViewSparse<T> for Box<V> {
type Iter<'b>
= V::Iter<'b>
where
Self: 'b,
T: 'b;
fn nontrivial_entries<'b>(&'b self) -> Self::Iter<'b> { (**self).nontrivial_entries() }
}
impl<T: ?Sized, V: ?Sized + VectorView<T>> VectorView<T> for &V {
fn len(&self) -> usize { (**self).len() }
fn at(&self, i: usize) -> &T { (**self).at(i) }
unsafe fn at_unchecked(&self, i: usize) -> &T { unsafe { (**self).at_unchecked(i) } }
fn specialize_sparse<'b, Op: SparseVectorViewOperation<T>>(&'b self, op: Op) -> Option<Op::Output<'b>> {
(**self).specialize_sparse(op)
}
fn as_slice(&self) -> Option<&[T]>
where
T: Sized,
{
(**self).as_slice()
}
}
impl<T: ?Sized, V: ?Sized + VectorViewSparse<T>> VectorViewSparse<T> for &V {
type Iter<'b>
= V::Iter<'b>
where
Self: 'b,
T: 'b;
fn nontrivial_entries<'b>(&'b self) -> Self::Iter<'b> { (**self).nontrivial_entries() }
}
impl<T: ?Sized, V: ?Sized + VectorView<T>> VectorView<T> for &mut V {
fn len(&self) -> usize { (**self).len() }
fn at(&self, i: usize) -> &T { (**self).at(i) }
unsafe fn at_unchecked(&self, i: usize) -> &T { unsafe { (**self).at_unchecked(i) } }
fn specialize_sparse<'b, Op: SparseVectorViewOperation<T>>(&'b self, op: Op) -> Option<Op::Output<'b>> {
(**self).specialize_sparse(op)
}
fn as_slice(&self) -> Option<&[T]>
where
T: Sized,
{
(**self).as_slice()
}
}
impl<T: ?Sized, V: ?Sized + VectorViewMut<T>> VectorViewMut<T> for &mut V {
fn at_mut(&mut self, i: usize) -> &mut T { (**self).at_mut(i) }
unsafe fn at_unchecked_mut(&mut self, i: usize) -> &mut T { unsafe { (**self).at_unchecked_mut(i) } }
fn as_slice_mut(&mut self) -> Option<&mut [T]>
where
T: Sized,
{
(**self).as_slice_mut()
}
}
impl<T: ?Sized, V: ?Sized + VectorViewSparse<T>> VectorViewSparse<T> for &mut V {
type Iter<'b>
= V::Iter<'b>
where
Self: 'b,
T: 'b;
fn nontrivial_entries<'b>(&'b self) -> Self::Iter<'b> { (**self).nontrivial_entries() }
}
impl<T: ?Sized, V: ?Sized + SwappableVectorViewMut<T>> SwappableVectorViewMut<T> for &mut V {
fn swap(&mut self, i: usize, j: usize) { (**self).swap(i, j) }
}
pub trait VectorViewMut<T: ?Sized>: VectorView<T> {
fn at_mut(&mut self, i: usize) -> &mut T;
fn map_mut<F_const: for<'a> Fn(&'a T) -> &'a U, F_mut: for<'a> FnMut(&'a mut T) -> &'a mut U, U>(
self,
map_const: F_const,
map_mut: F_mut,
) -> VectorViewMapMut<Self, T, U, F_const, F_mut>
where
Self: Sized,
{
VectorViewMapMut::new(self, (map_const, map_mut))
}
fn as_slice_mut(&mut self) -> Option<&mut [T]>
where
T: Sized,
{
None
}
unsafe fn at_unchecked_mut(&mut self, i: usize) -> &mut T { self.at_mut(i) }
}
pub trait SwappableVectorViewMut<T: ?Sized>: VectorViewMut<T> {
fn swap(&mut self, i: usize, j: usize);
}
pub trait VectorFn<T> {
fn len(&self) -> usize;
fn is_empty(&self) -> bool { self.len() == 0 }
fn at(&self, i: usize) -> T;
fn into_iter(self) -> VectorFnIter<Self, T>
where
Self: Sized,
{
VectorFnIter::new(self)
}
fn iter(&self) -> VectorFnIter<&Self, T> { self.into_iter() }
fn map_fn<F: Fn(T) -> U, U>(self, func: F) -> VectorFnMap<Self, T, U, F>
where
Self: Sized,
{
VectorFnMap::new(self, func)
}
fn step_by_fn(self, step_by: usize) -> StepByFn<Self, T>
where
Self: Sized,
{
StepByFn::new(self, step_by)
}
}
pub trait SelfSubvectorFn<T>: Sized + VectorFn<T> {
fn restrict_full(self, range: Range<usize>) -> Self;
fn restrict<R: RangeBounds<usize>>(self, range: R) -> Self {
let range_full = range_within(self.len(), range);
self.restrict_full(range_full)
}
}
impl<T, V: ?Sized + VectorFn<T>> VectorFn<T> for &V {
fn len(&self) -> usize { (**self).len() }
fn at(&self, i: usize) -> T { (**self).at(i) }
}
impl<T> VectorView<T> for [T] {
fn len(&self) -> usize { <[T]>::len(self) }
fn at(&self, i: usize) -> &T { &self[i] }
unsafe fn at_unchecked(&self, i: usize) -> &T { unsafe { self.get_unchecked(i) } }
fn as_slice(&self) -> Option<&[T]>
where
T: Sized,
{
Some(self)
}
}
impl<T> SelfSubvectorView<T> for &[T] {
fn restrict_full(self, range: Range<usize>) -> Self { &self[range] }
}
impl<T> SelfSubvectorView<T> for &mut [T] {
fn restrict_full(self, range: Range<usize>) -> Self { &mut self[range] }
}
impl<T> VectorViewMut<T> for [T] {
fn at_mut(&mut self, i: usize) -> &mut T { &mut self[i] }
unsafe fn at_unchecked_mut<'a>(&mut self, i: usize) -> &mut T { unsafe { self.get_unchecked_mut(i) } }
fn as_slice_mut(&mut self) -> Option<&mut [T]>
where
T: Sized,
{
Some(self)
}
}
impl<T> SwappableVectorViewMut<T> for [T] {
fn swap(&mut self, i: usize, j: usize) { <[T]>::swap(self, i, j) }
}
impl<T, A: Allocator> VectorView<T> for Vec<T, A> {
fn len(&self) -> usize { <[T]>::len(self) }
fn at(&self, i: usize) -> &T { &self[i] }
unsafe fn at_unchecked(&self, i: usize) -> &T { unsafe { self.get_unchecked(i) } }
fn as_slice(&self) -> Option<&[T]>
where
T: Sized,
{
Some(self)
}
}
impl<T, A: Allocator> VectorViewMut<T> for Vec<T, A> {
fn at_mut(&mut self, i: usize) -> &mut T { &mut self[i] }
unsafe fn at_unchecked_mut<'a>(&mut self, i: usize) -> &mut T { unsafe { self.get_unchecked_mut(i) } }
fn as_slice_mut(&mut self) -> Option<&mut [T]>
where
T: Sized,
{
Some(&mut *self)
}
}
impl<T, A: Allocator> SwappableVectorViewMut<T> for Vec<T, A> {
fn swap(&mut self, i: usize, j: usize) { <[T]>::swap(self, i, j) }
}
impl<T, const N: usize> VectorView<T> for [T; N] {
fn len(&self) -> usize { N }
fn at(&self, i: usize) -> &T { &self[i] }
unsafe fn at_unchecked(&self, i: usize) -> &T { unsafe { self.get_unchecked(i) } }
fn as_slice(&self) -> Option<&[T]>
where
T: Sized,
{
Some(&self[..])
}
}
impl<T, const N: usize> VectorViewMut<T> for [T; N] {
fn at_mut(&mut self, i: usize) -> &mut T { &mut self[i] }
unsafe fn at_unchecked_mut<'a>(&mut self, i: usize) -> &mut T { unsafe { self.get_unchecked_mut(i) } }
fn as_slice_mut(&mut self) -> Option<&mut [T]>
where
T: Sized,
{
Some(&mut *self)
}
}
impl<T, const N: usize> SwappableVectorViewMut<T> for [T; N] {
fn swap(&mut self, i: usize, j: usize) { <[T]>::swap(self, i, j) }
}
impl VectorFn<usize> for Range<usize> {
fn at(&self, i: usize) -> usize {
assert!(i < <_ as VectorFn<_>>::len(self));
self.start + i
}
fn len(&self) -> usize { self.end - self.start }
}
#[derive(Copy, Clone)]
pub struct CloneRingEl<R: RingStore>(pub R);
impl<'a, R: RingStore> FnOnce<(&'a El<R>,)> for CloneRingEl<R> {
type Output = El<R>;
extern "rust-call" fn call_once(self, args: (&'a El<R>,)) -> Self::Output { self.call(args) }
}
impl<'a, R: RingStore> FnMut<(&'a El<R>,)> for CloneRingEl<R> {
extern "rust-call" fn call_mut(&mut self, args: (&'a El<R>,)) -> Self::Output { self.call(args) }
}
impl<'a, R: RingStore> Fn<(&'a El<R>,)> for CloneRingEl<R> {
extern "rust-call" fn call(&self, args: (&'a El<R>,)) -> Self::Output { self.0.clone_el(args.0) }
}
impl<'a, R: RingStore> FnOnce<(usize, &'a El<R>)> for CloneRingEl<R> {
type Output = El<R>;
extern "rust-call" fn call_once(self, args: (usize, &'a El<R>)) -> Self::Output { self.call(args) }
}
impl<'a, R: RingStore> FnMut<(usize, &'a El<R>)> for CloneRingEl<R> {
extern "rust-call" fn call_mut(&mut self, args: (usize, &'a El<R>)) -> Self::Output { self.call(args) }
}
impl<'a, R: RingStore> Fn<(usize, &'a El<R>)> for CloneRingEl<R> {
extern "rust-call" fn call(&self, args: (usize, &'a El<R>)) -> Self::Output { self.0.clone_el(args.1) }
}
#[derive(Copy, Clone)]
pub struct CloneValue;
impl<'a, T: Clone> FnOnce<(&'a T,)> for CloneValue {
type Output = T;
extern "rust-call" fn call_once(self, args: (&'a T,)) -> Self::Output { self.call(args) }
}
impl<'a, T: Clone> FnMut<(&'a T,)> for CloneValue {
extern "rust-call" fn call_mut(&mut self, args: (&'a T,)) -> Self::Output { self.call(args) }
}
impl<'a, T: Clone> Fn<(&'a T,)> for CloneValue {
extern "rust-call" fn call(&self, args: (&'a T,)) -> Self::Output { args.0.clone() }
}
#[test]
fn test_vector_fn_iter() {
let vec = vec![1, 2, 4, 8, 16];
assert_eq!(vec, vec.as_fn().into_iter().copied().collect::<Vec<_>>());
}