blob: d99a4db6d4d7388b921a23dace6dec9d20faf7db [file] [log] [blame]
use crate::traits::Sealed;
use core::{
cell::RefCell,
hash::{Hash, Hasher},
mem,
ops::{Bound, RangeBounds},
};
pub trait RefCell_v1_35<T>: Sealed<RefCell<T>> {
fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T;
}
impl<T> RefCell_v1_35<T> for RefCell<T> {
#[inline]
fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T {
let mut_borrow = &mut *self.borrow_mut();
let replacement = f(mut_borrow);
mem::replace(mut_borrow, replacement)
}
}
pub trait Option_v1_35<'a, T: Copy + 'a>: Sealed<Option<&'a T>> {
fn copied(self) -> Option<T>;
}
impl<'a, T: Copy + 'a> Option_v1_35<'a, T> for Option<&'a T> {
fn copied(self) -> Option<T> {
self.map(|&t| t)
}
}
pub fn hash<T: ?Sized, S: Hasher>(hashee: *const T, into: &mut S) {
hashee.hash(into);
}
pub trait RangeBounds_v1_35<T>: RangeBounds<T> {
fn contains<U>(&self, item: &U) -> bool
where
T: PartialOrd<U>,
U: ?Sized + PartialOrd<T>;
}
impl<T: PartialOrd<T>, RB: RangeBounds<T>> RangeBounds_v1_35<T> for RB {
fn contains<U>(&self, item: &U) -> bool
where
T: PartialOrd<U>,
U: ?Sized + PartialOrd<T>,
{
contains(self, item)
}
}
fn contains<T, U>(range: &impl RangeBounds<T>, item: &U) -> bool
where
T: ?Sized + PartialOrd<U>,
U: ?Sized + PartialOrd<T>,
{
(match range.start_bound() {
Bound::Included(ref start) => *start <= item,
Bound::Excluded(ref start) => *start < item,
Bound::Unbounded => true,
}) && (match range.end_bound() {
Bound::Included(ref end) => item <= *end,
Bound::Excluded(ref end) => item < *end,
Bound::Unbounded => true,
})
}