use core::fmt;
use core::hash::{Hash, Hasher};
#[cfg(feature = "alloc")]
use crate::boxed_ring_pair::BoxedRingPair;
use crate::inner::RingPairInner;
#[derive(Clone, Copy, Default)]
pub struct RingPair<T> {
pub(crate) inner: RingPairInner<[T; 2]>,
}
impl<T: Clone> RingPair<T> {
pub fn new(initial: T) -> Self {
Self {
inner: RingPairInner {
buffer: [initial.clone(), initial],
newest: false,
},
}
}
}
impl<T> RingPair<T> {
pub fn push(&mut self, value: T) {
self.inner.push(value);
}
pub fn push_with<F: FnOnce(&mut T)>(&mut self, f: F) {
self.inner.push_with(f);
}
pub fn newer(&self) -> &T {
self.inner.newer()
}
pub fn older(&self) -> &T {
self.inner.older()
}
pub fn as_pair(&self) -> (&T, &T) {
(self.inner.older(), self.inner.newer())
}
#[must_use]
pub fn iter(&self) -> crate::Iter<'_, T> {
crate::Iter::new(self.inner.older(), self.inner.newer())
}
}
impl<T: fmt::Debug> fmt::Debug for RingPair<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("RingPair")
.field("older", self.inner.older())
.field("newer", self.inner.newer())
.finish()
}
}
impl<T: PartialEq> PartialEq for RingPair<T> {
fn eq(&self, other: &Self) -> bool {
self.inner == other.inner
}
}
impl<T: Eq> Eq for RingPair<T> {}
impl<T: Hash> Hash for RingPair<T> {
fn hash<H: Hasher>(&self, state: &mut H) {
self.inner.hash(state);
}
}
impl<T> From<[T; 2]> for RingPair<T> {
fn from([older, newer]: [T; 2]) -> Self {
Self {
inner: RingPairInner {
buffer: [newer, older],
newest: false,
},
}
}
}
impl<T> From<(T, T)> for RingPair<T> {
fn from((older, newer): (T, T)) -> Self {
Self {
inner: RingPairInner {
buffer: [newer, older],
newest: false,
},
}
}
}
#[cfg(feature = "alloc")]
impl<T> From<BoxedRingPair<T>> for RingPair<T> {
fn from(pair: BoxedRingPair<T>) -> Self {
Self {
inner: RingPairInner {
buffer: *pair.inner.buffer,
newest: pair.inner.newest,
},
}
}
}