summaryrefslogtreecommitdiff
path: root/src/iterator/context.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/iterator/context.rs')
-rw-r--r--src/iterator/context.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/iterator/context.rs b/src/iterator/context.rs
new file mode 100644
index 0000000..a5c9123
--- /dev/null
+++ b/src/iterator/context.rs
@@ -0,0 +1,52 @@
+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(),
+ }
+ }
+ }
+}