summaryrefslogtreecommitdiff
path: root/src/iterator/context.rs
blob: a5c9123e42f671e13059fe00e1fb98f346781699 (plain)
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(),
			}
		}
	}
}