use std::num::NonZeroUsize;
use std::ops::{Index, IndexMut};
use std::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
use std::{slice, vec};
#[derive(Clone, Default, Debug, Eq, Hash, PartialEq)]
pub struct OneVec<T>(Vec<T>);
impl<T> OneVec<T> {
pub fn new() -> OneVec<T> {
OneVec(Vec::new())
}
pub fn with_capacity(capacity: usize) -> OneVec<T> {
OneVec(Vec::with_capacity(capacity))
}
pub fn from_vec(vec: Vec<T>) -> OneVec<T> {
OneVec(vec)
}
pub fn capacity(&self) -> usize {
self.0.capacity()
}
pub fn reserve(&mut self, additional: usize) {
self.0.reserve(additional)
}
pub fn reserve_exact(&mut self, additional: usize) {
self.0.reserve_exact(additional)
}
pub fn shrink_to_fit(&mut self) {
self.0.shrink_to_fit()
}
pub fn truncate(&mut self, len: usize) {
self.0.truncate(len)
}
pub fn as_slice(&self) -> &[T] {
self.0.as_slice()
}
pub fn as_mut_slice(&mut self) -> &mut [T] {
self.0.as_mut_slice()
}
pub fn into_vec(self) -> Vec<T> {
self.0
}
pub fn swap_remove(&mut self, index: NonZeroUsize) -> T {
self.0.swap_remove(index.get() - 1)
}
pub fn insert(&mut self, index: NonZeroUsize, element: T) {
self.0.insert(index.get() - 1, element)
}
pub fn remove(&mut self, index: NonZeroUsize) -> T {
self.0.remove(index.get() - 1)
}
pub fn retain<F>(&mut self, f: F)
where
F: FnMut(&T) -> bool,
{
self.0.retain(f)
}
pub fn dedup_by_key<F, K>(&mut self, key: F)
where
F: FnMut(&mut T) -> K,
K: PartialEq,
{
self.0.dedup_by_key(key)
}
pub fn dedup_by<F>(&mut self, same_bucket: F)
where
F: FnMut(&mut T, &mut T) -> bool,
{
self.0.dedup_by(same_bucket)
}
pub fn push(&mut self, value: T) {
self.0.push(value)
}
pub fn pop(&mut self) -> Option<T> {
self.0.pop()
}
pub fn append(&mut self, other: &mut OneVec<T>) {
self.0.append(&mut other.0)
}
pub fn clear(&mut self) {
self.0.clear()
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn split_off(&mut self, at: NonZeroUsize) -> OneVec<T> {
OneVec(self.0.split_off(at.get() - 1))
}
pub fn iter(&self) -> slice::Iter<T> {
self.as_slice().iter()
}
pub fn iter_mut(&mut self) -> slice::IterMut<T> {
self.as_mut_slice().iter_mut()
}
}
impl<T> IntoIterator for OneVec<T> {
type Item = T;
type IntoIter = vec::IntoIter<T>;
fn into_iter(self) -> vec::IntoIter<T> {
self.0.into_iter()
}
}
impl<T> Index<RangeFull> for OneVec<T> {
type Output = [T];
fn index(&self, _index: RangeFull) -> &[T] {
self.as_slice()
}
}
impl<T> IndexMut<RangeFull> for OneVec<T> {
fn index_mut(&mut self, _index: RangeFull) -> &mut [T] {
self.as_mut_slice()
}
}
impl<T> Index<Range<NonZeroUsize>> for OneVec<T> {
type Output = [T];
fn index(&self, index: Range<NonZeroUsize>) -> &[T] {
self.as_slice()
.index((index.start.get() - 1)..(index.end.get() - 1))
}
}
impl<T> IndexMut<Range<NonZeroUsize>> for OneVec<T> {
fn index_mut(&mut self, index: Range<NonZeroUsize>) -> &mut [T] {
self.as_mut_slice()
.index_mut((index.start.get() - 1)..(index.end.get() - 1))
}
}
impl<T> Index<RangeInclusive<NonZeroUsize>> for OneVec<T> {
type Output = [T];
fn index(&self, index: RangeInclusive<NonZeroUsize>) -> &[T] {
self.as_slice()
.index((index.start().get() - 1)..=(index.end().get() - 1))
}
}
impl<T> IndexMut<RangeInclusive<NonZeroUsize>> for OneVec<T> {
fn index_mut(&mut self, index: RangeInclusive<NonZeroUsize>) -> &mut [T] {
self.as_mut_slice()
.index_mut((index.start().get() - 1)..=(index.end().get() - 1))
}
}
impl<T> Index<RangeTo<NonZeroUsize>> for OneVec<T> {
type Output = [T];
fn index(&self, index: RangeTo<NonZeroUsize>) -> &[T] {
self.as_slice().index(..(index.end.get() - 1))
}
}
impl<T> IndexMut<RangeTo<NonZeroUsize>> for OneVec<T> {
fn index_mut(&mut self, index: RangeTo<NonZeroUsize>) -> &mut [T] {
self.as_mut_slice().index_mut(..(index.end.get() - 1))
}
}
impl<T> Index<RangeToInclusive<NonZeroUsize>> for OneVec<T> {
type Output = [T];
fn index(&self, index: RangeToInclusive<NonZeroUsize>) -> &[T] {
self.as_slice().index(..=(index.end.get() - 1))
}
}
impl<T> IndexMut<RangeToInclusive<NonZeroUsize>> for OneVec<T> {
fn index_mut(&mut self, index: RangeToInclusive<NonZeroUsize>) -> &mut [T] {
self.as_mut_slice().index_mut(..=(index.end.get() - 1))
}
}
impl<T> Index<RangeFrom<NonZeroUsize>> for OneVec<T> {
type Output = [T];
fn index(&self, index: RangeFrom<NonZeroUsize>) -> &[T] {
self.as_slice().index((index.start.get() - 1)..)
}
}
impl<T> IndexMut<RangeFrom<NonZeroUsize>> for OneVec<T> {
fn index_mut(&mut self, index: RangeFrom<NonZeroUsize>) -> &mut [T] {
self.as_mut_slice().index_mut((index.start.get() - 1)..)
}
}
impl<T> Index<NonZeroUsize> for OneVec<T> {
type Output = T;
fn index(&self, index: NonZeroUsize) -> &T {
&self.0[index.get() - 1]
}
}
impl<T> IndexMut<NonZeroUsize> for OneVec<T> {
fn index_mut(&mut self, index: NonZeroUsize) -> &mut T {
&mut self.0[index.get() - 1]
}
}