blob: 70d477b8be24ec7406dbf0bc34fb10a83bf1bf39 [file] [log] [blame] [edit]
use crate::traits::Sealed;
use core::{
cell::Cell,
ops::{Bound, RangeBounds},
ptr,
};
pub trait Cell_v1_37<T>: Sealed<Cell<T>> {
fn from_mut(t: &mut T) -> &Cell<T>;
}
impl<T> Cell_v1_37<T> for Cell<T> {
#[inline]
fn from_mut(t: &mut T) -> &Cell<T> {
unsafe { &*(t as *mut T as *const Cell<T>) }
}
}
pub trait Cell_v1_37_<T>: Sealed<Cell<[T]>> {
fn as_slice_of_cells(&self) -> &[Cell<T>];
}
impl<T> Cell_v1_37_<T> for Cell<[T]> {
fn as_slice_of_cells(&self) -> &[Cell<T>] {
unsafe { &*(self as *const Cell<[T]> as *const [Cell<T>]) }
}
}
pub trait Option_v1_37<T>: Sealed<Option<T>> {
fn xor(self, optb: Option<T>) -> Option<T>;
}
impl<T> Option_v1_37<T> for Option<T> {
#[inline]
fn xor(self, optb: Option<T>) -> Option<T> {
match (self, optb) {
(Some(a), None) => Some(a),
(None, Some(b)) => Some(b),
_ => None,
}
}
}
pub trait Slice_v1_37<T>: Sealed<[T]> {
fn copy_within<R: RangeBounds<usize>>(&mut self, src: R, dest: usize)
where
T: Copy;
}
impl<T> Slice_v1_37<T> for [T] {
fn copy_within<R: RangeBounds<usize>>(&mut self, src: R, dest: usize)
where
T: Copy,
{
let src_start = match src.start_bound() {
Bound::Included(&n) => n,
Bound::Excluded(&n) => n
.checked_add(1)
.unwrap_or_else(|| slice_index_overflow_fail()),
Bound::Unbounded => 0,
};
let src_end = match src.end_bound() {
Bound::Included(&n) => n
.checked_add(1)
.unwrap_or_else(|| slice_index_overflow_fail()),
Bound::Excluded(&n) => n,
Bound::Unbounded => self.len(),
};
assert!(src_start <= src_end, "src end is before src start");
assert!(src_end <= self.len(), "src is out of bounds");
let count = src_end - src_start;
assert!(dest <= self.len() - count, "dest is out of bounds");
unsafe {
ptr::copy(
self.as_ptr().add(src_start),
self.as_mut_ptr().add(dest),
count,
);
}
}
}
#[inline(never)]
#[cold]
fn slice_index_overflow_fail() -> ! {
panic!("attempted to index slice up to maximum usize");
}
pub trait DoubleEndedIterator_v1_37: DoubleEndedIterator {
fn nth_back(&mut self, n: usize) -> Option<Self::Item>;
}
impl<Iter: DoubleEndedIterator> DoubleEndedIterator_v1_37 for Iter {
#[inline]
fn nth_back(&mut self, mut n: usize) -> Option<Self::Item> {
for x in self.rev() {
if n == 0 {
return Some(x);
}
n -= 1;
}
None
}
}