use std::marker::PhantomData;
use crate::{
iterator::{LockContext, LockingIterator, LockingTuple},
lockable::Lockable,
ThreadKey,
};
impl<'l, L> LockContext<'l, L> {
pub(crate) const fn new(lockable: &'l L) -> Self {
Self {
key: None,
lockable,
}
}
}
impl<L: Lockable> LockContext<'_, L> {
pub fn tuple(&mut self, key: ThreadKey) -> LockingTuple<'_, L, L> {
unsafe {
self.key = Some(key);
LockingTuple {
_lockable: PhantomData,
// safety: we just inserted a key
key: self.key.as_ref().unwrap_unchecked(),
tuple: self.lockable,
}
}
}
}
impl<'l, L> LockContext<'l, L>
where
&'l L: IntoIterator,
{
#[expect(clippy::iter_not_returning_iterator)]
pub fn iter(
&mut self,
key: ThreadKey,
) -> LockingIterator<'_, <&'l L as IntoIterator>::IntoIter> {
unsafe {
self.key = Some(key);
LockingIterator {
// safety: we just inserted a key
key: self.key.as_ref().unwrap_unchecked(),
iterator: self.lockable.into_iter(),
}
}
}
}
|