1use crate::Kp;
46use std::sync::{Arc, Mutex};
47
48pub trait LockAccess<Lock, Inner> {
51 fn lock_read(&self, lock: &Lock) -> Option<Inner>;
53
54 fn lock_write(&self, lock: &Lock) -> Option<Inner>;
60}
61
62#[derive(Clone)] pub struct LockKp<
107 R,
108 Lock,
109 Mid,
110 V,
111 Root,
112 LockValue,
113 MidValue,
114 Value,
115 MutRoot,
116 MutLock,
117 MutMid,
118 MutValue,
119 G1,
120 S1,
121 L,
122 G2,
123 S2,
124> where
125 Root: std::borrow::Borrow<R>,
126 LockValue: std::borrow::Borrow<Lock>,
127 MidValue: std::borrow::Borrow<Mid>,
128 Value: std::borrow::Borrow<V>,
129 MutRoot: std::borrow::BorrowMut<R>,
130 MutLock: std::borrow::BorrowMut<Lock>,
131 MutMid: std::borrow::BorrowMut<Mid>,
132 MutValue: std::borrow::BorrowMut<V>,
133 G1: Fn(Root) -> Option<LockValue>,
134 S1: Fn(MutRoot) -> Option<MutLock>,
135 L: LockAccess<Lock, MidValue> + LockAccess<Lock, MutMid>,
136 G2: Fn(MidValue) -> Option<Value>,
137 S2: Fn(MutMid) -> Option<MutValue>,
138{
139 pub(crate) prev: Kp<R, Lock, Root, LockValue, MutRoot, MutLock, G1, S1>,
141
142 pub(crate) mid: L,
144
145 pub(crate) next: Kp<Mid, V, MidValue, Value, MutMid, MutValue, G2, S2>,
147}
148
149impl<
150 R,
151 Lock,
152 Mid,
153 V,
154 Root,
155 LockValue,
156 MidValue,
157 Value,
158 MutRoot,
159 MutLock,
160 MutMid,
161 MutValue,
162 G1,
163 S1,
164 L,
165 G2,
166 S2,
167>
168 LockKp<
169 R,
170 Lock,
171 Mid,
172 V,
173 Root,
174 LockValue,
175 MidValue,
176 Value,
177 MutRoot,
178 MutLock,
179 MutMid,
180 MutValue,
181 G1,
182 S1,
183 L,
184 G2,
185 S2,
186 >
187where
188 Root: std::borrow::Borrow<R>,
189 LockValue: std::borrow::Borrow<Lock>,
190 MidValue: std::borrow::Borrow<Mid>,
191 Value: std::borrow::Borrow<V>,
192 MutRoot: std::borrow::BorrowMut<R>,
193 MutLock: std::borrow::BorrowMut<Lock>,
194 MutMid: std::borrow::BorrowMut<Mid>,
195 MutValue: std::borrow::BorrowMut<V>,
196 G1: Fn(Root) -> Option<LockValue>,
197 S1: Fn(MutRoot) -> Option<MutLock>,
198 L: LockAccess<Lock, MidValue> + LockAccess<Lock, MutMid>,
199 G2: Fn(MidValue) -> Option<Value>,
200 S2: Fn(MutMid) -> Option<MutValue>,
201{
202 pub fn new(
204 prev: Kp<R, Lock, Root, LockValue, MutRoot, MutLock, G1, S1>,
205 mid: L,
206 next: Kp<Mid, V, MidValue, Value, MutMid, MutValue, G2, S2>,
207 ) -> Self {
208 Self { prev, mid, next }
209 }
210
211 #[inline]
246 pub fn get(&self, root: Root) -> Option<Value>
247 where
248 V: Clone,
249 {
250 (self.prev.get)(root).and_then(|lock_value| {
251 let lock: &Lock = lock_value.borrow();
252 self.mid
253 .lock_read(lock)
254 .and_then(|mid_value| (self.next.get)(mid_value))
255 })
256 }
257
258 #[inline]
288 pub fn get_mut(&self, root: MutRoot) -> Option<MutValue> {
289 (self.prev.set)(root).and_then(|mut lock_value| {
290 let lock: &Lock = lock_value.borrow();
291 self.mid
292 .lock_write(lock)
293 .and_then(|mid_value| (self.next.set)(mid_value))
294 })
295 }
296
297 pub fn set<F>(&self, root: Root, updater: F) -> Result<(), String>
306 where
307 F: FnOnce(&mut V),
308 MutValue: std::borrow::BorrowMut<V>,
309 {
310 (self.prev.get)(root)
311 .ok_or_else(|| "Failed to get lock container".to_string())
312 .and_then(|lock_value| {
313 let lock: &Lock = lock_value.borrow();
314 self.mid
316 .lock_write(lock)
317 .ok_or_else(|| "Failed to lock".to_string())
318 .and_then(|mid_value| {
319 (self.next.set)(mid_value)
320 .ok_or_else(|| "Failed to get value".to_string())
321 .map(|mut value| {
322 updater(value.borrow_mut());
323 })
324 })
325 })
326 }
327
328 pub fn then<V2, Value2, MutValue2, G3, S3>(
336 self,
337 next_kp: Kp<V, V2, Value, Value2, MutValue, MutValue2, G3, S3>,
338 ) -> LockKp<
339 R,
340 Lock,
341 Mid,
342 V2,
343 Root,
344 LockValue,
345 MidValue,
346 Value2,
347 MutRoot,
348 MutLock,
349 MutMid,
350 MutValue2,
351 G1,
352 S1,
353 L,
354 impl Fn(MidValue) -> Option<Value2> + use<G1, G2, G3, L, Lock, LockValue, Mid, MidValue, MutLock, MutMid, MutRoot, MutValue, MutValue2, R, Root, S1, S2, S3, Value, Value2, V, V2>,
355 impl Fn(MutMid) -> Option<MutValue2> + use<G1, G2, G3, L, Lock, LockValue, Mid, MidValue, MutLock, MutMid, MutRoot, MutValue, MutValue2, R, Root, S1, S2, S3, Value, Value2, V, V2>,
356 >
357 where
358 V: 'static,
359 V2: 'static,
360 Value: std::borrow::Borrow<V>,
361 Value2: std::borrow::Borrow<V2>,
362 MutValue: std::borrow::BorrowMut<V>,
363 MutValue2: std::borrow::BorrowMut<V2>,
364 G3: Fn(Value) -> Option<Value2> + 'static,
365 S3: Fn(MutValue) -> Option<MutValue2> + 'static,
366 {
367 let next_get = self.next.get;
369 let next_set = self.next.set;
370
371 let chained_kp = Kp::new(
373 move |mid_value: MidValue| next_get(mid_value).and_then(|v| (next_kp.get)(v)),
374 move |mid_value: MutMid| next_set(mid_value).and_then(|v| (next_kp.set)(v)),
375 );
376
377 LockKp::new(self.prev, self.mid, chained_kp)
378 }
379
380 pub fn then_lock<
406 Lock2,
407 Mid2,
408 V2,
409 LockValue2,
410 MidValue2,
411 Value2,
412 MutLock2,
413 MutMid2,
414 MutValue2,
415 G2_1,
416 S2_1,
417 L2,
418 G2_2,
419 S2_2,
420 >(
421 self,
422 other: LockKp<
423 V,
424 Lock2,
425 Mid2,
426 V2,
427 Value,
428 LockValue2,
429 MidValue2,
430 Value2,
431 MutValue,
432 MutLock2,
433 MutMid2,
434 MutValue2,
435 G2_1,
436 S2_1,
437 L2,
438 G2_2,
439 S2_2,
440 >,
441 ) -> LockKp<
442 R,
443 Lock,
444 Mid,
445 V2,
446 Root,
447 LockValue,
448 MidValue,
449 Value2,
450 MutRoot,
451 MutLock,
452 MutMid,
453 MutValue2,
454 G1,
455 S1,
456 L,
457 impl Fn(MidValue) -> Option<Value2> + use<G1, G2, G2_1, G2_2, L, L2, Lock, Lock2, LockValue, LockValue2, Mid, Mid2, MidValue, MidValue2, MutLock, MutLock2, MutMid, MutMid2, MutRoot, MutValue, MutValue2, R, Root, S1, S2, S2_1, S2_2, Value, Value2, V, V2>,
458 impl Fn(MutMid) -> Option<MutValue2> + use<G1, G2, G2_1, G2_2, L, L2, Lock, Lock2, LockValue, LockValue2, Mid, Mid2, MidValue, MidValue2, MutLock, MutLock2, MutMid, MutMid2, MutRoot, MutValue, MutValue2, R, Root, S1, S2, S2_1, S2_2, Value, Value2, V, V2>,
459 >
460 where
461 V: 'static + Clone,
462 V2: 'static,
463 Value: std::borrow::Borrow<V>,
464 LockValue2: std::borrow::Borrow<Lock2>,
465 MidValue2: std::borrow::Borrow<Mid2>,
466 Value2: std::borrow::Borrow<V2>,
467 MutValue: std::borrow::BorrowMut<V>,
468 MutLock2: std::borrow::BorrowMut<Lock2>,
469 MutMid2: std::borrow::BorrowMut<Mid2>,
470 MutValue2: std::borrow::BorrowMut<V2>,
471 G2_1: Fn(Value) -> Option<LockValue2> + 'static,
472 S2_1: Fn(MutValue) -> Option<MutLock2> + 'static,
473 L2: LockAccess<Lock2, MidValue2> + LockAccess<Lock2, MutMid2> + Clone + 'static, G2_2: Fn(MidValue2) -> Option<Value2> + 'static,
475 S2_2: Fn(MutMid2) -> Option<MutValue2> + 'static,
476 {
477 let next_get = self.next.get;
479 let next_set = self.next.set;
480
481 let other_prev_get = other.prev.get;
483 let other_prev_set = other.prev.set;
484
485 let other_mid1 = other.mid.clone();
488 let other_mid2 = other.mid;
489
490 let other_next_get = other.next.get;
491 let other_next_set = other.next.set;
492
493 let composed_kp = Kp::new(
495 move |mid_value: MidValue| {
496 next_get(mid_value).and_then(|value1| {
498 other_prev_get(value1).and_then(|lock2_value| {
500 let lock2: &Lock2 = lock2_value.borrow();
501 other_mid1.lock_read(lock2).and_then(|mid2_value| {
503 other_next_get(mid2_value)
505 })
506 })
507 })
508 },
509 move |mid_value: MutMid| {
510 next_set(mid_value).and_then(|value1| {
512 other_prev_set(value1).and_then(|lock2_value| {
513 let lock2: &Lock2 = lock2_value.borrow();
514 other_mid2
515 .lock_write(lock2)
516 .and_then(|mid2_value| other_next_set(mid2_value))
517 })
518 })
519 },
520 );
521
522 LockKp::new(self.prev, self.mid, composed_kp)
523 }
524
525 pub fn then_async<AsyncKp>(
528 self,
529 async_kp: AsyncKp,
530 ) -> crate::async_lock::KpThenAsyncKeyPath<
531 R,
532 V,
533 <AsyncKp::Value as crate::KeyPathValueTarget>::Target,
534 Root,
535 Value,
536 AsyncKp::Value,
537 MutRoot,
538 MutValue,
539 AsyncKp::MutValue,
540 Self,
541 AsyncKp,
542 >
543 where
544 V: 'static + Clone,
545 Value: std::borrow::Borrow<V>,
546 MutValue: std::borrow::BorrowMut<V>,
547 AsyncKp: crate::async_lock::AsyncKeyPathLike<Value, MutValue>,
548 AsyncKp::Value: crate::KeyPathValueTarget
549 + std::borrow::Borrow<<AsyncKp::Value as crate::KeyPathValueTarget>::Target>,
550 AsyncKp::MutValue: std::borrow::BorrowMut<<AsyncKp::Value as crate::KeyPathValueTarget>::Target>,
551 <AsyncKp::Value as crate::KeyPathValueTarget>::Target: 'static,
552 {
553 crate::async_lock::KpThenAsyncKeyPath {
554 first: self,
555 second: async_kp,
556 _p: std::marker::PhantomData,
557 }
558 }
559}
560
561#[derive(Clone)]
567pub struct KpThenLockKp<R, V, V2, Root, Value, Value2, MutRoot, MutValue, MutValue2, First, Second> {
568 pub(crate) first: First,
569 pub(crate) second: Second,
570 pub(crate) _p: std::marker::PhantomData<(R, V, V2, Root, Value, Value2, MutRoot, MutValue, MutValue2)>,
571}
572
573impl<R, V, V2, Root, Value, Value2, MutRoot, MutValue, MutValue2, First, Second>
574 KpThenLockKp<R, V, V2, Root, Value, Value2, MutRoot, MutValue, MutValue2, First, Second>
575where
576 First: crate::async_lock::SyncKeyPathLike<Root, Value, MutRoot, MutValue>,
577 Second: crate::async_lock::SyncKeyPathLike<Value, Value2, MutValue, MutValue2>,
578{
579 #[inline]
581 pub fn get(&self, root: Root) -> Option<Value2>
582 where
583 Value2: Clone,
584 {
585 let v = self.first.sync_get(root)?;
586 self.second.sync_get(v)
587 }
588 #[inline]
590 pub fn get_mut(&self, root: MutRoot) -> Option<MutValue2> {
591 let mut_v = self.first.sync_get_mut(root)?;
592 self.second.sync_get_mut(mut_v)
593 }
594}
595
596#[derive(Clone)] pub struct ArcMutexAccess<T> {
611 _phantom: std::marker::PhantomData<T>, }
613
614impl<T> ArcMutexAccess<T> {
615 pub fn new() -> Self {
616 Self {
617 _phantom: std::marker::PhantomData,
618 }
619 }
620}
621
622impl<T> Default for ArcMutexAccess<T> {
623 fn default() -> Self {
624 Self::new()
625 }
626}
627
628impl<'a, T: 'static> LockAccess<Arc<Mutex<T>>, &'a T> for ArcMutexAccess<T> {
630 #[inline]
631 fn lock_read(&self, lock: &Arc<Mutex<T>>) -> Option<&'a T> {
632 lock.lock().ok().map(|guard| {
636 let ptr = &*guard as *const T;
637 unsafe { &*ptr }
638 })
639 }
640
641 #[inline]
642 fn lock_write(&self, lock: &Arc<Mutex<T>>) -> Option<&'a T> {
643 lock.lock().ok().map(|guard| {
644 let ptr = &*guard as *const T;
645 unsafe { &*ptr }
646 })
647 }
648}
649
650impl<'a, T: 'static> LockAccess<Arc<Mutex<T>>, &'a mut T> for ArcMutexAccess<T> {
652 #[inline]
653 fn lock_read(&self, lock: &Arc<Mutex<T>>) -> Option<&'a mut T> {
654 lock.lock().ok().map(|mut guard| {
655 let ptr = &mut *guard as *mut T;
656 unsafe { &mut *ptr }
657 })
658 }
659
660 #[inline]
661 fn lock_write(&self, lock: &Arc<Mutex<T>>) -> Option<&'a mut T> {
662 lock.lock().ok().map(|mut guard| {
663 let ptr = &mut *guard as *mut T;
664 unsafe { &mut *ptr }
665 })
666 }
667}
668
669#[derive(Clone)] pub struct ArcRwLockAccess<T> {
695 _phantom: std::marker::PhantomData<T>, }
697
698impl<T> ArcRwLockAccess<T> {
699 pub fn new() -> Self {
700 Self {
701 _phantom: std::marker::PhantomData,
702 }
703 }
704}
705
706impl<T> Default for ArcRwLockAccess<T> {
707 fn default() -> Self {
708 Self::new()
709 }
710}
711
712impl<'a, T: 'static> LockAccess<Arc<std::sync::RwLock<T>>, &'a T> for ArcRwLockAccess<T> {
714 fn lock_read(&self, lock: &Arc<std::sync::RwLock<T>>) -> Option<&'a T> {
715 lock.read().ok().map(|guard| {
717 let ptr = &*guard as *const T;
718 unsafe { &*ptr }
719 })
720 }
721
722 fn lock_write(&self, lock: &Arc<std::sync::RwLock<T>>) -> Option<&'a T> {
723 lock.read().ok().map(|guard| {
725 let ptr = &*guard as *const T;
726 unsafe { &*ptr }
727 })
728 }
729}
730
731impl<'a, T: 'static> LockAccess<Arc<std::sync::RwLock<T>>, &'a mut T> for ArcRwLockAccess<T> {
733 fn lock_read(&self, lock: &Arc<std::sync::RwLock<T>>) -> Option<&'a mut T> {
734 lock.write().ok().map(|mut guard| {
736 let ptr = &mut *guard as *mut T;
737 unsafe { &mut *ptr }
738 })
739 }
740
741 fn lock_write(&self, lock: &Arc<std::sync::RwLock<T>>) -> Option<&'a mut T> {
742 lock.write().ok().map(|mut guard| {
744 let ptr = &mut *guard as *mut T;
745 unsafe { &mut *ptr }
746 })
747 }
748}
749
750#[derive(Clone)]
769pub struct StdMutexAccess<T> {
770 _phantom: std::marker::PhantomData<T>,
771}
772
773impl<T> StdMutexAccess<T> {
774 pub fn new() -> Self {
775 Self {
776 _phantom: std::marker::PhantomData,
777 }
778 }
779}
780
781impl<T> Default for StdMutexAccess<T> {
782 fn default() -> Self {
783 Self::new()
784 }
785}
786
787impl<'a, T: 'static> LockAccess<Mutex<T>, &'a T> for StdMutexAccess<T> {
789 fn lock_read(&self, lock: &Mutex<T>) -> Option<&'a T> {
790 lock.lock().ok().map(|guard| {
791 let ptr = &*guard as *const T;
792 unsafe { &*ptr }
793 })
794 }
795
796 fn lock_write(&self, lock: &Mutex<T>) -> Option<&'a T> {
797 lock.lock().ok().map(|guard| {
798 let ptr = &*guard as *const T;
799 unsafe { &*ptr }
800 })
801 }
802}
803
804impl<'a, T: 'static> LockAccess<Mutex<T>, &'a mut T> for StdMutexAccess<T> {
806 fn lock_read(&self, lock: &Mutex<T>) -> Option<&'a mut T> {
807 lock.lock().ok().map(|mut guard| {
808 let ptr = &mut *guard as *mut T;
809 unsafe { &mut *ptr }
810 })
811 }
812
813 fn lock_write(&self, lock: &Mutex<T>) -> Option<&'a mut T> {
814 lock.lock().ok().map(|mut guard| {
815 let ptr = &mut *guard as *mut T;
816 unsafe { &mut *ptr }
817 })
818 }
819}
820
821#[derive(Clone)]
837pub struct StdRwLockAccess<T> {
838 _phantom: std::marker::PhantomData<T>,
839}
840
841impl<T> StdRwLockAccess<T> {
842 pub fn new() -> Self {
843 Self {
844 _phantom: std::marker::PhantomData,
845 }
846 }
847}
848
849impl<T> Default for StdRwLockAccess<T> {
850 fn default() -> Self {
851 Self::new()
852 }
853}
854
855impl<'a, T: 'static> LockAccess<std::sync::RwLock<T>, &'a T> for StdRwLockAccess<T> {
857 fn lock_read(&self, lock: &std::sync::RwLock<T>) -> Option<&'a T> {
858 lock.read().ok().map(|guard| {
859 let ptr = &*guard as *const T;
860 unsafe { &*ptr }
861 })
862 }
863
864 fn lock_write(&self, lock: &std::sync::RwLock<T>) -> Option<&'a T> {
865 lock.read().ok().map(|guard| {
866 let ptr = &*guard as *const T;
867 unsafe { &*ptr }
868 })
869 }
870}
871
872impl<'a, T: 'static> LockAccess<std::sync::RwLock<T>, &'a mut T> for StdRwLockAccess<T> {
874 fn lock_read(&self, lock: &std::sync::RwLock<T>) -> Option<&'a mut T> {
875 lock.write().ok().map(|mut guard| {
876 let ptr = &mut *guard as *mut T;
877 unsafe { &mut *ptr }
878 })
879 }
880
881 fn lock_write(&self, lock: &std::sync::RwLock<T>) -> Option<&'a mut T> {
882 lock.write().ok().map(|mut guard| {
883 let ptr = &mut *guard as *mut T;
884 unsafe { &mut *ptr }
885 })
886 }
887}
888
889#[cfg(feature = "parking_lot")]
894#[derive(Clone)] pub struct ParkingLotMutexAccess<T> {
922 _phantom: std::marker::PhantomData<T>,
923}
924
925#[cfg(feature = "parking_lot")]
926impl<T> ParkingLotMutexAccess<T> {
927 pub fn new() -> Self {
928 Self {
929 _phantom: std::marker::PhantomData,
930 }
931 }
932}
933
934#[cfg(feature = "parking_lot")]
935impl<T> Default for ParkingLotMutexAccess<T> {
936 fn default() -> Self {
937 Self::new()
938 }
939}
940
941#[cfg(feature = "parking_lot")]
943impl<'a, T: 'static> LockAccess<Arc<parking_lot::Mutex<T>>, &'a T> for ParkingLotMutexAccess<T> {
944 fn lock_read(&self, lock: &Arc<parking_lot::Mutex<T>>) -> Option<&'a T> {
945 let guard = lock.lock();
946 let ptr = &*guard as *const T;
947 unsafe { Some(&*ptr) }
948 }
949
950 fn lock_write(&self, lock: &Arc<parking_lot::Mutex<T>>) -> Option<&'a T> {
951 let guard = lock.lock();
952 let ptr = &*guard as *const T;
953 unsafe { Some(&*ptr) }
954 }
955}
956
957#[cfg(feature = "parking_lot")]
959impl<'a, T: 'static> LockAccess<Arc<parking_lot::Mutex<T>>, &'a mut T>
960 for ParkingLotMutexAccess<T>
961{
962 fn lock_read(&self, lock: &Arc<parking_lot::Mutex<T>>) -> Option<&'a mut T> {
963 let mut guard = lock.lock();
964 let ptr = &mut *guard as *mut T;
965 unsafe { Some(&mut *ptr) }
966 }
967
968 fn lock_write(&self, lock: &Arc<parking_lot::Mutex<T>>) -> Option<&'a mut T> {
969 let mut guard = lock.lock();
970 let ptr = &mut *guard as *mut T;
971 unsafe { Some(&mut *ptr) }
972 }
973}
974
975#[cfg(feature = "parking_lot")]
980#[derive(Clone)] pub struct ParkingLotRwLockAccess<T> {
1017 _phantom: std::marker::PhantomData<T>,
1018}
1019
1020#[cfg(feature = "parking_lot")]
1021impl<T> ParkingLotRwLockAccess<T> {
1022 pub fn new() -> Self {
1023 Self {
1024 _phantom: std::marker::PhantomData,
1025 }
1026 }
1027}
1028
1029#[cfg(feature = "parking_lot")]
1030impl<T> Default for ParkingLotRwLockAccess<T> {
1031 fn default() -> Self {
1032 Self::new()
1033 }
1034}
1035
1036#[cfg(feature = "parking_lot")]
1038impl<'a, T: 'static> LockAccess<Arc<parking_lot::RwLock<T>>, &'a T> for ParkingLotRwLockAccess<T> {
1039 fn lock_read(&self, lock: &Arc<parking_lot::RwLock<T>>) -> Option<&'a T> {
1040 let guard = lock.read();
1041 let ptr = &*guard as *const T;
1042 unsafe { Some(&*ptr) }
1043 }
1044
1045 fn lock_write(&self, lock: &Arc<parking_lot::RwLock<T>>) -> Option<&'a T> {
1046 let guard = lock.read();
1048 let ptr = &*guard as *const T;
1049 unsafe { Some(&*ptr) }
1050 }
1051}
1052
1053#[cfg(feature = "parking_lot")]
1055impl<'a, T: 'static> LockAccess<Arc<parking_lot::RwLock<T>>, &'a mut T>
1056 for ParkingLotRwLockAccess<T>
1057{
1058 fn lock_read(&self, lock: &Arc<parking_lot::RwLock<T>>) -> Option<&'a mut T> {
1059 let mut guard = lock.write();
1061 let ptr = &mut *guard as *mut T;
1062 unsafe { Some(&mut *ptr) }
1063 }
1064
1065 fn lock_write(&self, lock: &Arc<parking_lot::RwLock<T>>) -> Option<&'a mut T> {
1066 let mut guard = lock.write();
1067 let ptr = &mut *guard as *mut T;
1068 unsafe { Some(&mut *ptr) }
1069 }
1070}
1071
1072#[cfg(feature = "parking_lot")]
1077#[derive(Clone)]
1090pub struct DirectParkingLotMutexAccess<T> {
1091 _phantom: std::marker::PhantomData<T>,
1092}
1093
1094#[cfg(feature = "parking_lot")]
1095impl<T> DirectParkingLotMutexAccess<T> {
1096 pub fn new() -> Self {
1097 Self {
1098 _phantom: std::marker::PhantomData,
1099 }
1100 }
1101}
1102
1103#[cfg(feature = "parking_lot")]
1104impl<T> Default for DirectParkingLotMutexAccess<T> {
1105 fn default() -> Self {
1106 Self::new()
1107 }
1108}
1109
1110#[cfg(feature = "parking_lot")]
1111impl<'a, T: 'static> LockAccess<parking_lot::Mutex<T>, &'a T> for DirectParkingLotMutexAccess<T> {
1112 fn lock_read(&self, lock: &parking_lot::Mutex<T>) -> Option<&'a T> {
1113 let guard = lock.lock();
1114 let ptr = &*guard as *const T;
1115 unsafe { Some(&*ptr) }
1116 }
1117
1118 fn lock_write(&self, lock: &parking_lot::Mutex<T>) -> Option<&'a T> {
1119 let guard = lock.lock();
1120 let ptr = &*guard as *const T;
1121 unsafe { Some(&*ptr) }
1122 }
1123}
1124
1125#[cfg(feature = "parking_lot")]
1126impl<'a, T: 'static> LockAccess<parking_lot::Mutex<T>, &'a mut T>
1127 for DirectParkingLotMutexAccess<T>
1128{
1129 fn lock_read(&self, lock: &parking_lot::Mutex<T>) -> Option<&'a mut T> {
1130 let mut guard = lock.lock();
1131 let ptr = &mut *guard as *mut T;
1132 unsafe { Some(&mut *ptr) }
1133 }
1134
1135 fn lock_write(&self, lock: &parking_lot::Mutex<T>) -> Option<&'a mut T> {
1136 let mut guard = lock.lock();
1137 let ptr = &mut *guard as *mut T;
1138 unsafe { Some(&mut *ptr) }
1139 }
1140}
1141
1142#[cfg(feature = "parking_lot")]
1147#[derive(Clone)]
1161pub struct DirectParkingLotRwLockAccess<T> {
1162 _phantom: std::marker::PhantomData<T>,
1163}
1164
1165#[cfg(feature = "parking_lot")]
1166impl<T> DirectParkingLotRwLockAccess<T> {
1167 pub fn new() -> Self {
1168 Self {
1169 _phantom: std::marker::PhantomData,
1170 }
1171 }
1172}
1173
1174#[cfg(feature = "parking_lot")]
1175impl<T> Default for DirectParkingLotRwLockAccess<T> {
1176 fn default() -> Self {
1177 Self::new()
1178 }
1179}
1180
1181#[cfg(feature = "parking_lot")]
1182impl<'a, T: 'static> LockAccess<parking_lot::RwLock<T>, &'a T> for DirectParkingLotRwLockAccess<T> {
1183 fn lock_read(&self, lock: &parking_lot::RwLock<T>) -> Option<&'a T> {
1184 let guard = lock.read();
1185 let ptr = &*guard as *const T;
1186 unsafe { Some(&*ptr) }
1187 }
1188
1189 fn lock_write(&self, lock: &parking_lot::RwLock<T>) -> Option<&'a T> {
1190 let guard = lock.read();
1191 let ptr = &*guard as *const T;
1192 unsafe { Some(&*ptr) }
1193 }
1194}
1195
1196#[cfg(feature = "parking_lot")]
1197impl<'a, T: 'static> LockAccess<parking_lot::RwLock<T>, &'a mut T>
1198 for DirectParkingLotRwLockAccess<T>
1199{
1200 fn lock_read(&self, lock: &parking_lot::RwLock<T>) -> Option<&'a mut T> {
1201 let mut guard = lock.write();
1202 let ptr = &mut *guard as *mut T;
1203 unsafe { Some(&mut *ptr) }
1204 }
1205
1206 fn lock_write(&self, lock: &parking_lot::RwLock<T>) -> Option<&'a mut T> {
1207 let mut guard = lock.write();
1208 let ptr = &mut *guard as *mut T;
1209 unsafe { Some(&mut *ptr) }
1210 }
1211}
1212
1213#[derive(Clone)] pub struct RcRefCellAccess<T> {
1267 _phantom: std::marker::PhantomData<T>, }
1269
1270impl<T> RcRefCellAccess<T> {
1271 pub fn new() -> Self {
1272 Self {
1273 _phantom: std::marker::PhantomData,
1274 }
1275 }
1276}
1277
1278impl<T> Default for RcRefCellAccess<T> {
1279 fn default() -> Self {
1280 Self::new()
1281 }
1282}
1283
1284impl<'a, T: 'static> LockAccess<std::rc::Rc<std::cell::RefCell<T>>, &'a T> for RcRefCellAccess<T> {
1286 fn lock_read(&self, lock: &std::rc::Rc<std::cell::RefCell<T>>) -> Option<&'a T> {
1287 let guard = lock.borrow();
1291 let ptr = &*guard as *const T;
1292 unsafe { Some(&*ptr) }
1293 }
1294
1295 fn lock_write(&self, lock: &std::rc::Rc<std::cell::RefCell<T>>) -> Option<&'a T> {
1296 let guard = lock.borrow();
1298 let ptr = &*guard as *const T;
1299 unsafe { Some(&*ptr) }
1300 }
1301}
1302
1303impl<'a, T: 'static> LockAccess<std::rc::Rc<std::cell::RefCell<T>>, &'a mut T>
1305 for RcRefCellAccess<T>
1306{
1307 fn lock_read(&self, lock: &std::rc::Rc<std::cell::RefCell<T>>) -> Option<&'a mut T> {
1308 let mut guard = lock.borrow_mut();
1311 let ptr = &mut *guard as *mut T;
1312 unsafe { Some(&mut *ptr) }
1313 }
1314
1315 fn lock_write(&self, lock: &std::rc::Rc<std::cell::RefCell<T>>) -> Option<&'a mut T> {
1316 let mut guard = lock.borrow_mut();
1318 let ptr = &mut *guard as *mut T;
1319 unsafe { Some(&mut *ptr) }
1320 }
1321}
1322
1323pub type LockKpArcMutexFor<Root, Lock, Inner> = LockKp<
1329 Root,
1330 Lock,
1331 Inner,
1332 Inner,
1333 &'static Root,
1334 &'static Lock,
1335 &'static Inner,
1336 &'static Inner,
1337 &'static mut Root,
1338 &'static mut Lock,
1339 &'static mut Inner,
1340 &'static mut Inner,
1341 for<'b> fn(&'b Root) -> Option<&'b Lock>,
1342 for<'b> fn(&'b mut Root) -> Option<&'b mut Lock>,
1343 ArcMutexAccess<Inner>,
1344 for<'b> fn(&'b Inner) -> Option<&'b Inner>,
1345 for<'b> fn(&'b mut Inner) -> Option<&'b mut Inner>,
1346>;
1347
1348pub type LockKpArcRwLockFor<Root, Lock, Inner> = LockKp<
1350 Root,
1351 Lock,
1352 Inner,
1353 Inner,
1354 &'static Root,
1355 &'static Lock,
1356 &'static Inner,
1357 &'static Inner,
1358 &'static mut Root,
1359 &'static mut Lock,
1360 &'static mut Inner,
1361 &'static mut Inner,
1362 for<'b> fn(&'b Root) -> Option<&'b Lock>,
1363 for<'b> fn(&'b mut Root) -> Option<&'b mut Lock>,
1364 ArcRwLockAccess<Inner>,
1365 for<'b> fn(&'b Inner) -> Option<&'b Inner>,
1366 for<'b> fn(&'b mut Inner) -> Option<&'b mut Inner>,
1367>;
1368
1369#[cfg(feature = "parking_lot")]
1370pub type LockKpParkingLotMutexFor<Root, Lock, Inner> = LockKp<
1372 Root,
1373 Lock,
1374 Inner,
1375 Inner,
1376 &'static Root,
1377 &'static Lock,
1378 &'static Inner,
1379 &'static Inner,
1380 &'static mut Root,
1381 &'static mut Lock,
1382 &'static mut Inner,
1383 &'static mut Inner,
1384 for<'b> fn(&'b Root) -> Option<&'b Lock>,
1385 for<'b> fn(&'b mut Root) -> Option<&'b mut Lock>,
1386 ParkingLotMutexAccess<Inner>,
1387 for<'b> fn(&'b Inner) -> Option<&'b Inner>,
1388 for<'b> fn(&'b mut Inner) -> Option<&'b mut Inner>,
1389>;
1390
1391#[cfg(feature = "parking_lot")]
1392pub type LockKpParkingLotRwLockFor<Root, Lock, Inner> = LockKp<
1394 Root,
1395 Lock,
1396 Inner,
1397 Inner,
1398 &'static Root,
1399 &'static Lock,
1400 &'static Inner,
1401 &'static Inner,
1402 &'static mut Root,
1403 &'static mut Lock,
1404 &'static mut Inner,
1405 &'static mut Inner,
1406 for<'b> fn(&'b Root) -> Option<&'b Lock>,
1407 for<'b> fn(&'b mut Root) -> Option<&'b mut Lock>,
1408 ParkingLotRwLockAccess<Inner>,
1409 for<'b> fn(&'b Inner) -> Option<&'b Inner>,
1410 for<'b> fn(&'b mut Inner) -> Option<&'b mut Inner>,
1411>;
1412
1413pub type LockKpType<'a, R, Mid, V> = LockKp<
1415 R,
1416 Arc<Mutex<Mid>>,
1417 Mid,
1418 V,
1419 &'a R,
1420 &'a Arc<Mutex<Mid>>,
1421 &'a Mid,
1422 &'a V,
1423 &'a mut R,
1424 &'a mut Arc<Mutex<Mid>>,
1425 &'a mut Mid,
1426 &'a mut V,
1427 for<'b> fn(&'b R) -> Option<&'b Arc<Mutex<Mid>>>,
1428 for<'b> fn(&'b mut R) -> Option<&'b mut Arc<Mutex<Mid>>>,
1429 ArcMutexAccess<Mid>,
1430 for<'b> fn(&'b Mid) -> Option<&'b V>,
1431 for<'b> fn(&'b mut Mid) -> Option<&'b mut V>,
1432>;
1433
1434#[cfg(test)]
1435mod tests {
1436 use super::*;
1437 use crate::KpType;
1438
1439 #[test]
1440 fn test_lock_kp_basic() {
1441 #[derive(Debug, Clone)]
1442 struct Root {
1443 locked_data: Arc<Mutex<Inner>>,
1444 }
1445
1446 #[derive(Debug, Clone)]
1447 struct Inner {
1448 value: String,
1449 }
1450
1451 let root = Root {
1452 locked_data: Arc::new(Mutex::new(Inner {
1453 value: "hello".to_string(),
1454 })),
1455 };
1456
1457 let prev_kp: KpType<Root, Arc<Mutex<Inner>>> = Kp::new(
1459 |r: &Root| Some(&r.locked_data),
1460 |r: &mut Root| Some(&mut r.locked_data),
1461 );
1462
1463 let next_kp: KpType<Inner, String> = Kp::new(
1465 |i: &Inner| Some(&i.value),
1466 |i: &mut Inner| Some(&mut i.value),
1467 );
1468
1469 let lock_kp = LockKp::new(prev_kp, ArcMutexAccess::new(), next_kp);
1471
1472 let value = lock_kp.get(&root);
1474 assert!(value.is_some());
1475 }
1477
1478 #[test]
1479 fn test_lock_kp_structure() {
1480 #[derive(Debug, Clone)]
1482 struct Root {
1483 data: Arc<Mutex<Mid>>,
1484 }
1485
1486 #[derive(Debug, Clone)]
1487 struct Mid {
1488 value: i32,
1489 }
1490
1491 let prev: KpType<Root, Arc<Mutex<Mid>>> =
1492 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
1493
1494 let mid = ArcMutexAccess::<Mid>::new();
1495
1496 let next: KpType<Mid, i32> =
1497 Kp::new(|m: &Mid| Some(&m.value), |m: &mut Mid| Some(&mut m.value));
1498
1499 let lock_kp = LockKp::new(prev, mid, next);
1500
1501 let _prev_field = &lock_kp.prev;
1503 let _mid_field = &lock_kp.mid;
1504 let _next_field = &lock_kp.next;
1505 }
1506
1507 #[test]
1508 fn test_lock_kp_then_chaining() {
1509 #[derive(Debug, Clone)]
1510 struct Root {
1511 data: Arc<Mutex<Mid>>,
1512 }
1513
1514 #[derive(Debug, Clone)]
1515 struct Mid {
1516 inner: Inner2,
1517 }
1518
1519 #[derive(Debug, Clone)]
1520 struct Inner2 {
1521 value: String,
1522 }
1523
1524 let root = Root {
1525 data: Arc::new(Mutex::new(Mid {
1526 inner: Inner2 {
1527 value: "chained".to_string(),
1528 },
1529 })),
1530 };
1531
1532 let prev: KpType<Root, Arc<Mutex<Mid>>> =
1534 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
1535
1536 let to_inner: KpType<Mid, Inner2> =
1538 Kp::new(|m: &Mid| Some(&m.inner), |m: &mut Mid| Some(&mut m.inner));
1539
1540 let to_value: KpType<Inner2, String> = Kp::new(
1542 |i: &Inner2| Some(&i.value),
1543 |i: &mut Inner2| Some(&mut i.value),
1544 );
1545
1546 let lock_kp = LockKp::new(prev, ArcMutexAccess::new(), to_inner);
1548
1549 let chained = lock_kp.then(to_value);
1551
1552 let _result = chained;
1555 }
1556
1557 #[test]
1558 fn test_lock_kp_compose_single_level() {
1559 #[derive(Debug, Clone)]
1561 struct Root {
1562 data: Arc<Mutex<Mid1>>,
1563 }
1564
1565 #[derive(Debug, Clone)]
1566 struct Mid1 {
1567 nested: Arc<Mutex<Mid2>>,
1568 }
1569
1570 #[derive(Debug, Clone)]
1571 struct Mid2 {
1572 value: String,
1573 }
1574
1575 let root = Root {
1576 data: Arc::new(Mutex::new(Mid1 {
1577 nested: Arc::new(Mutex::new(Mid2 {
1578 value: "nested-lock".to_string(),
1579 })),
1580 })),
1581 };
1582
1583 let lock_kp1 = {
1585 let prev: KpType<Root, Arc<Mutex<Mid1>>> =
1586 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
1587 let next: KpType<Mid1, Mid1> = Kp::new(|m: &Mid1| Some(m), |m: &mut Mid1| Some(m));
1588 LockKp::new(prev, ArcMutexAccess::new(), next)
1589 };
1590
1591 let lock_kp2 = {
1593 let prev: KpType<Mid1, Arc<Mutex<Mid2>>> = Kp::new(
1594 |m: &Mid1| Some(&m.nested),
1595 |m: &mut Mid1| Some(&mut m.nested),
1596 );
1597 let next: KpType<Mid2, String> =
1598 Kp::new(|m: &Mid2| Some(&m.value), |m: &mut Mid2| Some(&mut m.value));
1599 LockKp::new(prev, ArcMutexAccess::new(), next)
1600 };
1601
1602 let composed = lock_kp1.then_lock(lock_kp2);
1604
1605 let value = composed.get(&root);
1607 assert!(value.is_some());
1608 }
1609
1610 #[test]
1611 fn test_lock_kp_compose_two_levels() {
1612 #[derive(Debug, Clone)]
1614 struct Root {
1615 level1: Arc<Mutex<Level1>>,
1616 }
1617
1618 #[derive(Debug, Clone)]
1619 struct Level1 {
1620 data: String,
1621 level2: Arc<Mutex<Level2>>,
1622 }
1623
1624 #[derive(Debug, Clone)]
1625 struct Level2 {
1626 value: i32,
1627 }
1628
1629 let root = Root {
1630 level1: Arc::new(Mutex::new(Level1 {
1631 data: "level1".to_string(),
1632 level2: Arc::new(Mutex::new(Level2 { value: 42 })),
1633 })),
1634 };
1635
1636 let lock1 = {
1638 let prev: KpType<Root, Arc<Mutex<Level1>>> = Kp::new(
1639 |r: &Root| Some(&r.level1),
1640 |r: &mut Root| Some(&mut r.level1),
1641 );
1642 let next: KpType<Level1, Level1> =
1643 Kp::new(|l: &Level1| Some(l), |l: &mut Level1| Some(l));
1644 LockKp::new(prev, ArcMutexAccess::new(), next)
1645 };
1646
1647 let lock2 = {
1649 let prev: KpType<Level1, Arc<Mutex<Level2>>> = Kp::new(
1650 |l: &Level1| Some(&l.level2),
1651 |l: &mut Level1| Some(&mut l.level2),
1652 );
1653 let next: KpType<Level2, i32> = Kp::new(
1654 |l: &Level2| Some(&l.value),
1655 |l: &mut Level2| Some(&mut l.value),
1656 );
1657 LockKp::new(prev, ArcMutexAccess::new(), next)
1658 };
1659
1660 let composed = lock1.then_lock(lock2);
1662
1663 let value = composed.get(&root);
1665 assert!(value.is_some());
1666 }
1667
1668 #[test]
1669 fn test_lock_kp_compose_three_levels() {
1670 #[derive(Debug, Clone)]
1672 struct Root {
1673 lock1: Arc<Mutex<L1>>,
1674 }
1675
1676 #[derive(Debug, Clone)]
1677 struct L1 {
1678 lock2: Arc<Mutex<L2>>,
1679 }
1680
1681 #[derive(Debug, Clone)]
1682 struct L2 {
1683 lock3: Arc<Mutex<L3>>,
1684 }
1685
1686 #[derive(Debug, Clone)]
1687 struct L3 {
1688 final_value: String,
1689 }
1690
1691 let root = Root {
1692 lock1: Arc::new(Mutex::new(L1 {
1693 lock2: Arc::new(Mutex::new(L2 {
1694 lock3: Arc::new(Mutex::new(L3 {
1695 final_value: "deeply-nested".to_string(),
1696 })),
1697 })),
1698 })),
1699 };
1700
1701 let lock_kp1 = {
1703 let prev: KpType<Root, Arc<Mutex<L1>>> =
1704 Kp::new(|r: &Root| Some(&r.lock1), |r: &mut Root| Some(&mut r.lock1));
1705 let next: KpType<L1, L1> = Kp::new(|l: &L1| Some(l), |l: &mut L1| Some(l));
1706 LockKp::new(prev, ArcMutexAccess::new(), next)
1707 };
1708
1709 let lock_kp2 = {
1711 let prev: KpType<L1, Arc<Mutex<L2>>> =
1712 Kp::new(|l: &L1| Some(&l.lock2), |l: &mut L1| Some(&mut l.lock2));
1713 let next: KpType<L2, L2> = Kp::new(|l: &L2| Some(l), |l: &mut L2| Some(l));
1714 LockKp::new(prev, ArcMutexAccess::new(), next)
1715 };
1716
1717 let lock_kp3 = {
1719 let prev: KpType<L2, Arc<Mutex<L3>>> =
1720 Kp::new(|l: &L2| Some(&l.lock3), |l: &mut L2| Some(&mut l.lock3));
1721 let next: KpType<L3, String> = Kp::new(
1722 |l: &L3| Some(&l.final_value),
1723 |l: &mut L3| Some(&mut l.final_value),
1724 );
1725 LockKp::new(prev, ArcMutexAccess::new(), next)
1726 };
1727
1728 let composed_1_2 = lock_kp1.then_lock(lock_kp2);
1730 let composed_all = composed_1_2.then_lock(lock_kp3);
1731
1732 let value = composed_all.get(&root);
1734 assert!(value.is_some());
1735 }
1736
1737 #[test]
1738 fn test_lock_kp_compose_with_then() {
1739 #[derive(Debug, Clone)]
1741 struct Root {
1742 lock1: Arc<Mutex<Mid>>,
1743 }
1744
1745 #[derive(Debug, Clone)]
1746 struct Mid {
1747 lock2: Arc<Mutex<Inner>>,
1748 }
1749
1750 #[derive(Debug, Clone)]
1751 struct Inner {
1752 data: Data,
1753 }
1754
1755 #[derive(Debug, Clone)]
1756 struct Data {
1757 value: i32,
1758 }
1759
1760 let root = Root {
1761 lock1: Arc::new(Mutex::new(Mid {
1762 lock2: Arc::new(Mutex::new(Inner {
1763 data: Data { value: 100 },
1764 })),
1765 })),
1766 };
1767
1768 let lock1 = {
1770 let prev: KpType<Root, Arc<Mutex<Mid>>> =
1771 Kp::new(|r: &Root| Some(&r.lock1), |r: &mut Root| Some(&mut r.lock1));
1772 let next: KpType<Mid, Mid> = Kp::new(|m: &Mid| Some(m), |m: &mut Mid| Some(m));
1773 LockKp::new(prev, ArcMutexAccess::new(), next)
1774 };
1775
1776 let lock2 = {
1778 let prev: KpType<Mid, Arc<Mutex<Inner>>> =
1779 Kp::new(|m: &Mid| Some(&m.lock2), |m: &mut Mid| Some(&mut m.lock2));
1780 let next: KpType<Inner, Inner> = Kp::new(|i: &Inner| Some(i), |i: &mut Inner| Some(i));
1781 LockKp::new(prev, ArcMutexAccess::new(), next)
1782 };
1783
1784 let to_data: KpType<Inner, Data> =
1786 Kp::new(|i: &Inner| Some(&i.data), |i: &mut Inner| Some(&mut i.data));
1787
1788 let to_value: KpType<Data, i32> =
1789 Kp::new(|d: &Data| Some(&d.value), |d: &mut Data| Some(&mut d.value));
1790
1791 let composed = lock1.then_lock(lock2);
1793 let with_data = composed.then(to_data);
1794 let with_value = with_data.then(to_value);
1795
1796 let value = with_value.get(&root);
1798 assert!(value.is_some());
1799 }
1800
1801 #[test]
1806 fn test_rwlock_basic() {
1807 use std::sync::RwLock;
1808
1809 #[derive(Debug, Clone)]
1810 struct Root {
1811 data: Arc<RwLock<Inner>>,
1812 }
1813
1814 #[derive(Debug, Clone)]
1815 struct Inner {
1816 value: String,
1817 }
1818
1819 let root = Root {
1820 data: Arc::new(RwLock::new(Inner {
1821 value: "rwlock_value".to_string(),
1822 })),
1823 };
1824
1825 let prev: KpType<Root, Arc<RwLock<Inner>>> =
1827 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
1828
1829 let next: KpType<Inner, String> = Kp::new(
1830 |i: &Inner| Some(&i.value),
1831 |i: &mut Inner| Some(&mut i.value),
1832 );
1833
1834 let rwlock_kp = LockKp::new(prev, ArcRwLockAccess::new(), next);
1835
1836 let value = rwlock_kp.get(&root);
1838 assert!(value.is_some());
1839 }
1840
1841 #[test]
1842 fn test_rwlock_compose_two_levels() {
1843 use std::sync::RwLock;
1844
1845 #[derive(Debug, Clone)]
1846 struct Root {
1847 level1: Arc<RwLock<Level1>>,
1848 }
1849
1850 #[derive(Debug, Clone)]
1851 struct Level1 {
1852 level2: Arc<RwLock<Level2>>,
1853 }
1854
1855 #[derive(Debug, Clone)]
1856 struct Level2 {
1857 value: i32,
1858 }
1859
1860 let root = Root {
1861 level1: Arc::new(RwLock::new(Level1 {
1862 level2: Arc::new(RwLock::new(Level2 { value: 100 })),
1863 })),
1864 };
1865
1866 let lock1 = {
1868 let prev: KpType<Root, Arc<RwLock<Level1>>> = Kp::new(
1869 |r: &Root| Some(&r.level1),
1870 |r: &mut Root| Some(&mut r.level1),
1871 );
1872 let next: KpType<Level1, Level1> =
1873 Kp::new(|l: &Level1| Some(l), |l: &mut Level1| Some(l));
1874 LockKp::new(prev, ArcRwLockAccess::new(), next)
1875 };
1876
1877 let lock2 = {
1879 let prev: KpType<Level1, Arc<RwLock<Level2>>> = Kp::new(
1880 |l: &Level1| Some(&l.level2),
1881 |l: &mut Level1| Some(&mut l.level2),
1882 );
1883 let next: KpType<Level2, i32> = Kp::new(
1884 |l: &Level2| Some(&l.value),
1885 |l: &mut Level2| Some(&mut l.value),
1886 );
1887 LockKp::new(prev, ArcRwLockAccess::new(), next)
1888 };
1889
1890 let composed = lock1.then_lock(lock2);
1892
1893 let value = composed.get(&root);
1895 assert!(value.is_some());
1896 }
1897
1898 #[test]
1899 fn test_rwlock_mixed_with_mutex() {
1900 use std::sync::RwLock;
1901
1902 #[derive(Debug, Clone)]
1903 struct Root {
1904 rwlock_data: Arc<RwLock<Mid>>,
1905 }
1906
1907 #[derive(Debug, Clone)]
1908 struct Mid {
1909 mutex_data: Arc<Mutex<Inner>>,
1910 }
1911
1912 #[derive(Debug, Clone)]
1913 struct Inner {
1914 value: String,
1915 }
1916
1917 let root = Root {
1918 rwlock_data: Arc::new(RwLock::new(Mid {
1919 mutex_data: Arc::new(Mutex::new(Inner {
1920 value: "mixed".to_string(),
1921 })),
1922 })),
1923 };
1924
1925 let rwlock_kp = {
1927 let prev: KpType<Root, Arc<RwLock<Mid>>> = Kp::new(
1928 |r: &Root| Some(&r.rwlock_data),
1929 |r: &mut Root| Some(&mut r.rwlock_data),
1930 );
1931 let next: KpType<Mid, Mid> = Kp::new(|m: &Mid| Some(m), |m: &mut Mid| Some(m));
1932 LockKp::new(prev, ArcRwLockAccess::new(), next)
1933 };
1934
1935 let mutex_kp = {
1937 let prev: KpType<Mid, Arc<Mutex<Inner>>> = Kp::new(
1938 |m: &Mid| Some(&m.mutex_data),
1939 |m: &mut Mid| Some(&mut m.mutex_data),
1940 );
1941 let next: KpType<Inner, String> = Kp::new(
1942 |i: &Inner| Some(&i.value),
1943 |i: &mut Inner| Some(&mut i.value),
1944 );
1945 LockKp::new(prev, ArcMutexAccess::new(), next)
1946 };
1947
1948 let composed = rwlock_kp.then_lock(mutex_kp);
1950
1951 let value = composed.get(&root);
1953 assert!(value.is_some());
1954 }
1955
1956 #[test]
1957 fn test_rwlock_structure() {
1958 use std::sync::RwLock;
1959
1960 #[derive(Debug, Clone)]
1962 struct Root {
1963 data: Arc<RwLock<Inner>>,
1964 }
1965
1966 #[derive(Debug, Clone)]
1967 struct Inner {
1968 value: i32,
1969 }
1970
1971 let root = Root {
1972 data: Arc::new(RwLock::new(Inner { value: 42 })),
1973 };
1974
1975 let prev: KpType<Root, Arc<RwLock<Inner>>> =
1976 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
1977
1978 let mid = ArcRwLockAccess::<Inner>::new();
1979
1980 let next: KpType<Inner, i32> = Kp::new(
1981 |i: &Inner| Some(&i.value),
1982 |i: &mut Inner| Some(&mut i.value),
1983 );
1984
1985 let rwlock_kp = LockKp::new(prev, mid, next);
1986
1987 let _prev_field = &rwlock_kp.prev;
1989 let _mid_field = &rwlock_kp.mid;
1990 let _next_field = &rwlock_kp.next;
1991
1992 let value = rwlock_kp.get(&root);
1994 assert!(value.is_some());
1995 }
1996
1997 #[test]
1998 fn test_rwlock_three_levels() {
1999 use std::sync::RwLock;
2000
2001 #[derive(Debug, Clone)]
2002 struct Root {
2003 lock1: Arc<RwLock<L1>>,
2004 }
2005
2006 #[derive(Debug, Clone)]
2007 struct L1 {
2008 lock2: Arc<RwLock<L2>>,
2009 }
2010
2011 #[derive(Debug, Clone)]
2012 struct L2 {
2013 lock3: Arc<RwLock<L3>>,
2014 }
2015
2016 #[derive(Debug, Clone)]
2017 struct L3 {
2018 value: String,
2019 }
2020
2021 let root = Root {
2022 lock1: Arc::new(RwLock::new(L1 {
2023 lock2: Arc::new(RwLock::new(L2 {
2024 lock3: Arc::new(RwLock::new(L3 {
2025 value: "deep_rwlock".to_string(),
2026 })),
2027 })),
2028 })),
2029 };
2030
2031 let lock1 = {
2033 let prev: KpType<Root, Arc<RwLock<L1>>> =
2034 Kp::new(|r: &Root| Some(&r.lock1), |r: &mut Root| Some(&mut r.lock1));
2035 let next: KpType<L1, L1> = Kp::new(|l: &L1| Some(l), |l: &mut L1| Some(l));
2036 LockKp::new(prev, ArcRwLockAccess::new(), next)
2037 };
2038
2039 let lock2 = {
2040 let prev: KpType<L1, Arc<RwLock<L2>>> =
2041 Kp::new(|l: &L1| Some(&l.lock2), |l: &mut L1| Some(&mut l.lock2));
2042 let next: KpType<L2, L2> = Kp::new(|l: &L2| Some(l), |l: &mut L2| Some(l));
2043 LockKp::new(prev, ArcRwLockAccess::new(), next)
2044 };
2045
2046 let lock3 = {
2047 let prev: KpType<L2, Arc<RwLock<L3>>> =
2048 Kp::new(|l: &L2| Some(&l.lock3), |l: &mut L2| Some(&mut l.lock3));
2049 let next: KpType<L3, String> =
2050 Kp::new(|l: &L3| Some(&l.value), |l: &mut L3| Some(&mut l.value));
2051 LockKp::new(prev, ArcRwLockAccess::new(), next)
2052 };
2053
2054 let composed = lock1.then_lock(lock2).then_lock(lock3);
2056
2057 let value = composed.get(&root);
2059 assert!(value.is_some());
2060 }
2061
2062 #[test]
2063 fn test_rwlock_panic_on_clone_proof() {
2064 use std::sync::RwLock;
2065
2066 struct PanicOnClone {
2068 data: String,
2069 }
2070
2071 impl PanicOnClone {
2072 fn new(s: &str) -> Self {
2073 Self {
2074 data: s.to_string(),
2075 }
2076 }
2077
2078 fn get_data(&self) -> &String {
2079 &self.data
2080 }
2081 }
2082
2083 impl Clone for PanicOnClone {
2084 fn clone(&self) -> Self {
2085 panic!(
2086 "❌ DEEP CLONE DETECTED! PanicOnClone was cloned! This should NEVER happen!"
2087 );
2088 }
2089 }
2090
2091 #[derive(Clone)]
2092 struct Root {
2093 lock1: Arc<RwLock<Level1>>,
2094 }
2095
2096 struct Level1 {
2098 panic_data: PanicOnClone,
2099 lock2: Arc<RwLock<Level2>>,
2100 }
2101
2102 impl Clone for Level1 {
2104 fn clone(&self) -> Self {
2105 panic!("❌ Level1 was deeply cloned! This should NEVER happen!");
2108 }
2109 }
2110
2111 struct Level2 {
2113 panic_data2: PanicOnClone,
2114 value: i32,
2115 }
2116
2117 impl Clone for Level2 {
2118 fn clone(&self) -> Self {
2119 panic!("❌ Level2 was deeply cloned! This should NEVER happen!");
2120 }
2121 }
2122
2123 let root = Root {
2125 lock1: Arc::new(RwLock::new(Level1 {
2126 panic_data: PanicOnClone::new("level1_data"),
2127 lock2: Arc::new(RwLock::new(Level2 {
2128 panic_data2: PanicOnClone::new("level2_data"),
2129 value: 42,
2130 })),
2131 })),
2132 };
2133
2134 let lock1 = {
2136 let prev: KpType<Root, Arc<RwLock<Level1>>> =
2137 Kp::new(|r: &Root| Some(&r.lock1), |r: &mut Root| Some(&mut r.lock1));
2138 let next: KpType<Level1, Level1> =
2139 Kp::new(|l: &Level1| Some(l), |l: &mut Level1| Some(l));
2140 LockKp::new(prev, ArcRwLockAccess::new(), next)
2141 };
2142
2143 let lock2 = {
2145 let prev: KpType<Level1, Arc<RwLock<Level2>>> = Kp::new(
2146 |l: &Level1| Some(&l.lock2),
2147 |l: &mut Level1| Some(&mut l.lock2),
2148 );
2149 let next: KpType<Level2, i32> = Kp::new(
2150 |l: &Level2| Some(&l.value),
2151 |l: &mut Level2| Some(&mut l.value),
2152 );
2153 LockKp::new(prev, ArcRwLockAccess::new(), next)
2154 };
2155
2156 let composed = lock1.then_lock(lock2);
2159
2160 let value = composed.get(&root);
2163
2164 assert!(value.is_some());
2167 }
2168
2169 #[test]
2170 fn test_mutex_panic_on_clone_proof() {
2171 struct PanicOnClone {
2173 data: Vec<u8>,
2174 }
2175
2176 impl PanicOnClone {
2177 fn new(size: usize) -> Self {
2178 Self {
2179 data: vec![0u8; size],
2180 }
2181 }
2182 }
2183
2184 impl Clone for PanicOnClone {
2185 fn clone(&self) -> Self {
2186 panic!("❌ DEEP CLONE DETECTED! PanicOnClone was cloned!");
2187 }
2188 }
2189
2190 #[derive(Clone)]
2191 struct Root {
2192 lock1: Arc<Mutex<Mid>>,
2193 }
2194
2195 struct Mid {
2196 panic_data: PanicOnClone,
2197 lock2: Arc<Mutex<Inner>>,
2198 }
2199
2200 impl Clone for Mid {
2201 fn clone(&self) -> Self {
2202 panic!("❌ Mid was deeply cloned! This should NEVER happen!");
2203 }
2204 }
2205
2206 struct Inner {
2207 panic_data: PanicOnClone,
2208 value: String,
2209 }
2210
2211 impl Clone for Inner {
2212 fn clone(&self) -> Self {
2213 panic!("❌ Inner was deeply cloned! This should NEVER happen!");
2214 }
2215 }
2216
2217 let root = Root {
2219 lock1: Arc::new(Mutex::new(Mid {
2220 panic_data: PanicOnClone::new(1_000_000), lock2: Arc::new(Mutex::new(Inner {
2222 panic_data: PanicOnClone::new(1_000_000), value: "test".to_string(),
2224 })),
2225 })),
2226 };
2227
2228 let lock1 = {
2230 let prev: KpType<Root, Arc<Mutex<Mid>>> =
2231 Kp::new(|r: &Root| Some(&r.lock1), |r: &mut Root| Some(&mut r.lock1));
2232 let next: KpType<Mid, Mid> = Kp::new(|m: &Mid| Some(m), |m: &mut Mid| Some(m));
2233 LockKp::new(prev, ArcMutexAccess::new(), next)
2234 };
2235
2236 let lock2 = {
2238 let prev: KpType<Mid, Arc<Mutex<Inner>>> =
2239 Kp::new(|m: &Mid| Some(&m.lock2), |m: &mut Mid| Some(&mut m.lock2));
2240 let next: KpType<Inner, String> = Kp::new(
2241 |i: &Inner| Some(&i.value),
2242 |i: &mut Inner| Some(&mut i.value),
2243 );
2244 LockKp::new(prev, ArcMutexAccess::new(), next)
2245 };
2246
2247 let composed = lock1.then_lock(lock2);
2250
2251 let value = composed.get(&root);
2253 assert!(value.is_some());
2254 }
2255
2256 #[test]
2257 fn test_mixed_locks_panic_on_clone_proof() {
2258 use std::sync::RwLock;
2259
2260 struct NeverClone {
2262 id: usize,
2263 large_data: Vec<u8>,
2264 }
2265
2266 impl NeverClone {
2267 fn new(id: usize) -> Self {
2268 Self {
2269 id,
2270 large_data: vec![0u8; 10_000],
2271 }
2272 }
2273 }
2274
2275 impl Clone for NeverClone {
2276 fn clone(&self) -> Self {
2277 panic!("❌ NeverClone with id {} was cloned!", self.id);
2278 }
2279 }
2280
2281 #[derive(Clone)]
2282 struct Root {
2283 rwlock: Arc<RwLock<Mid>>,
2284 }
2285
2286 struct Mid {
2287 never_clone1: NeverClone,
2288 mutex: Arc<Mutex<Inner>>,
2289 }
2290
2291 impl Clone for Mid {
2292 fn clone(&self) -> Self {
2293 panic!("❌ Mid was deeply cloned!");
2294 }
2295 }
2296
2297 struct Inner {
2298 never_clone2: NeverClone,
2299 value: i32,
2300 }
2301
2302 impl Clone for Inner {
2303 fn clone(&self) -> Self {
2304 panic!("❌ Inner was deeply cloned!");
2305 }
2306 }
2307
2308 let root = Root {
2310 rwlock: Arc::new(RwLock::new(Mid {
2311 never_clone1: NeverClone::new(1),
2312 mutex: Arc::new(Mutex::new(Inner {
2313 never_clone2: NeverClone::new(2),
2314 value: 999,
2315 })),
2316 })),
2317 };
2318
2319 let rwlock_kp = {
2321 let prev: KpType<Root, Arc<RwLock<Mid>>> = Kp::new(
2322 |r: &Root| Some(&r.rwlock),
2323 |r: &mut Root| Some(&mut r.rwlock),
2324 );
2325 let next: KpType<Mid, Mid> = Kp::new(|m: &Mid| Some(m), |m: &mut Mid| Some(m));
2326 LockKp::new(prev, ArcRwLockAccess::new(), next)
2327 };
2328
2329 let mutex_kp = {
2331 let prev: KpType<Mid, Arc<Mutex<Inner>>> =
2332 Kp::new(|m: &Mid| Some(&m.mutex), |m: &mut Mid| Some(&mut m.mutex));
2333 let next: KpType<Inner, i32> = Kp::new(
2334 |i: &Inner| Some(&i.value),
2335 |i: &mut Inner| Some(&mut i.value),
2336 );
2337 LockKp::new(prev, ArcMutexAccess::new(), next)
2338 };
2339
2340 let composed = rwlock_kp.then_lock(mutex_kp);
2343
2344 let value = composed.get(&root);
2347 assert!(value.is_some());
2348
2349 let value2 = composed.get(&root);
2351 assert!(value2.is_some());
2352
2353 }
2355
2356 #[test]
2361 fn test_rc_refcell_basic() {
2362 use std::cell::RefCell;
2363 use std::rc::Rc;
2364
2365 #[derive(Clone)]
2366 struct Root {
2367 data: Rc<RefCell<Inner>>,
2368 }
2369
2370 #[derive(Clone)]
2371 struct Inner {
2372 value: String,
2373 }
2374
2375 let root = Root {
2376 data: Rc::new(RefCell::new(Inner {
2377 value: "hello".to_string(),
2378 })),
2379 };
2380
2381 let lock_kp = {
2383 let prev: KpType<Root, Rc<RefCell<Inner>>> =
2384 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
2385 let next: KpType<Inner, String> = Kp::new(
2386 |i: &Inner| Some(&i.value),
2387 |i: &mut Inner| Some(&mut i.value),
2388 );
2389 LockKp::new(prev, RcRefCellAccess::new(), next)
2390 };
2391
2392 let value = lock_kp.get(&root);
2394 assert!(value.is_some());
2395 assert_eq!(value.unwrap(), "hello");
2396
2397 let result = lock_kp.set(&root, |s| {
2399 *s = "world".to_string();
2400 });
2401 assert!(result.is_ok());
2402
2403 let value = lock_kp.get(&root);
2405 assert_eq!(value.unwrap(), "world");
2406 }
2407
2408 #[test]
2409 fn test_rc_refcell_compose_two_levels() {
2410 use std::cell::RefCell;
2411 use std::rc::Rc;
2412
2413 #[derive(Clone)]
2414 struct Root {
2415 level1: Rc<RefCell<Level1>>,
2416 }
2417
2418 #[derive(Clone)]
2419 struct Level1 {
2420 level2: Rc<RefCell<Level2>>,
2421 }
2422
2423 #[derive(Clone)]
2424 struct Level2 {
2425 value: i32,
2426 }
2427
2428 let root = Root {
2429 level1: Rc::new(RefCell::new(Level1 {
2430 level2: Rc::new(RefCell::new(Level2 { value: 42 })),
2431 })),
2432 };
2433
2434 let lock1 = {
2436 let prev: KpType<Root, Rc<RefCell<Level1>>> = Kp::new(
2437 |r: &Root| Some(&r.level1),
2438 |r: &mut Root| Some(&mut r.level1),
2439 );
2440 let next: KpType<Level1, Level1> =
2441 Kp::new(|l: &Level1| Some(l), |l: &mut Level1| Some(l));
2442 LockKp::new(prev, RcRefCellAccess::new(), next)
2443 };
2444
2445 let lock2 = {
2447 let prev: KpType<Level1, Rc<RefCell<Level2>>> = Kp::new(
2448 |l: &Level1| Some(&l.level2),
2449 |l: &mut Level1| Some(&mut l.level2),
2450 );
2451 let next: KpType<Level2, i32> = Kp::new(
2452 |l: &Level2| Some(&l.value),
2453 |l: &mut Level2| Some(&mut l.value),
2454 );
2455 LockKp::new(prev, RcRefCellAccess::new(), next)
2456 };
2457
2458 let composed = lock1.then_lock(lock2);
2460
2461 let value = composed.get(&root);
2463 assert!(value.is_some());
2464 assert_eq!(*value.unwrap(), 42);
2465
2466 let result = composed.set(&root, |v| {
2468 *v = 100;
2469 });
2470 assert!(result.is_ok());
2471
2472 let value = composed.get(&root);
2474 assert_eq!(*value.unwrap(), 100);
2475 }
2476
2477 #[test]
2478 fn test_rc_refcell_three_levels() {
2479 use std::cell::RefCell;
2480 use std::rc::Rc;
2481
2482 #[derive(Clone)]
2483 struct Root {
2484 l1: Rc<RefCell<L1>>,
2485 }
2486
2487 #[derive(Clone)]
2488 struct L1 {
2489 l2: Rc<RefCell<L2>>,
2490 }
2491
2492 #[derive(Clone)]
2493 struct L2 {
2494 l3: Rc<RefCell<L3>>,
2495 }
2496
2497 #[derive(Clone)]
2498 struct L3 {
2499 value: String,
2500 }
2501
2502 let root = Root {
2503 l1: Rc::new(RefCell::new(L1 {
2504 l2: Rc::new(RefCell::new(L2 {
2505 l3: Rc::new(RefCell::new(L3 {
2506 value: "deep".to_string(),
2507 })),
2508 })),
2509 })),
2510 };
2511
2512 let lock1 = {
2514 let prev: KpType<Root, Rc<RefCell<L1>>> =
2515 Kp::new(|r: &Root| Some(&r.l1), |r: &mut Root| Some(&mut r.l1));
2516 let next: KpType<L1, L1> = Kp::new(|l: &L1| Some(l), |l: &mut L1| Some(l));
2517 LockKp::new(prev, RcRefCellAccess::new(), next)
2518 };
2519
2520 let lock2 = {
2522 let prev: KpType<L1, Rc<RefCell<L2>>> =
2523 Kp::new(|l: &L1| Some(&l.l2), |l: &mut L1| Some(&mut l.l2));
2524 let next: KpType<L2, L2> = Kp::new(|l: &L2| Some(l), |l: &mut L2| Some(l));
2525 LockKp::new(prev, RcRefCellAccess::new(), next)
2526 };
2527
2528 let lock3 = {
2530 let prev: KpType<L2, Rc<RefCell<L3>>> =
2531 Kp::new(|l: &L2| Some(&l.l3), |l: &mut L2| Some(&mut l.l3));
2532 let next: KpType<L3, String> =
2533 Kp::new(|l: &L3| Some(&l.value), |l: &mut L3| Some(&mut l.value));
2534 LockKp::new(prev, RcRefCellAccess::new(), next)
2535 };
2536
2537 let composed_1_2 = lock1.then_lock(lock2);
2539 let composed_all = composed_1_2.then_lock(lock3);
2540
2541 let value = composed_all.get(&root);
2543 assert!(value.is_some());
2544 assert_eq!(value.unwrap(), "deep");
2545 }
2546
2547 #[test]
2548 fn test_rc_refcell_panic_on_clone_proof() {
2549 use std::cell::RefCell;
2550 use std::rc::Rc;
2551
2552 struct PanicOnClone {
2554 data: String,
2555 }
2556
2557 impl Clone for PanicOnClone {
2558 fn clone(&self) -> Self {
2559 panic!("❌ DEEP CLONE DETECTED! PanicOnClone was cloned in Rc<RefCell>!");
2560 }
2561 }
2562
2563 #[derive(Clone)]
2564 struct Root {
2565 level1: Rc<RefCell<Level1>>,
2566 }
2567
2568 struct Level1 {
2569 panic_data: PanicOnClone,
2570 level2: Rc<RefCell<Level2>>,
2571 }
2572
2573 impl Clone for Level1 {
2574 fn clone(&self) -> Self {
2575 panic!("❌ Level1 was deeply cloned in Rc<RefCell>!");
2576 }
2577 }
2578
2579 struct Level2 {
2580 panic_data2: PanicOnClone,
2581 value: i32,
2582 }
2583
2584 impl Clone for Level2 {
2585 fn clone(&self) -> Self {
2586 panic!("❌ Level2 was deeply cloned in Rc<RefCell>!");
2587 }
2588 }
2589
2590 let root = Root {
2592 level1: Rc::new(RefCell::new(Level1 {
2593 panic_data: PanicOnClone {
2594 data: "level1".to_string(),
2595 },
2596 level2: Rc::new(RefCell::new(Level2 {
2597 panic_data2: PanicOnClone {
2598 data: "level2".to_string(),
2599 },
2600 value: 123,
2601 })),
2602 })),
2603 };
2604
2605 let lock1 = {
2607 let prev: KpType<Root, Rc<RefCell<Level1>>> = Kp::new(
2608 |r: &Root| Some(&r.level1),
2609 |r: &mut Root| Some(&mut r.level1),
2610 );
2611 let next: KpType<Level1, Level1> =
2612 Kp::new(|l: &Level1| Some(l), |l: &mut Level1| Some(l));
2613 LockKp::new(prev, RcRefCellAccess::new(), next)
2614 };
2615
2616 let lock2 = {
2618 let prev: KpType<Level1, Rc<RefCell<Level2>>> = Kp::new(
2619 |l: &Level1| Some(&l.level2),
2620 |l: &mut Level1| Some(&mut l.level2),
2621 );
2622 let next: KpType<Level2, i32> = Kp::new(
2623 |l: &Level2| Some(&l.value),
2624 |l: &mut Level2| Some(&mut l.value),
2625 );
2626 LockKp::new(prev, RcRefCellAccess::new(), next)
2627 };
2628
2629 let composed = lock1.then_lock(lock2);
2632
2633 let value = composed.get(&root);
2636 assert!(value.is_some());
2637 assert_eq!(*value.unwrap(), 123);
2638
2639 let value2 = composed.get(&root);
2641 assert!(value2.is_some());
2642 }
2643
2644 #[test]
2645 fn test_rc_refcell_vs_arc_mutex() {
2646 use std::cell::RefCell;
2647 use std::rc::Rc;
2648
2649 #[derive(Clone)]
2652 struct RcRoot {
2653 data: Rc<RefCell<String>>,
2654 }
2655
2656 #[derive(Clone)]
2657 struct ArcRoot {
2658 data: Arc<Mutex<String>>,
2659 }
2660
2661 let rc_root = RcRoot {
2663 data: Rc::new(RefCell::new("rc_value".to_string())),
2664 };
2665
2666 let rc_kp = {
2667 let prev: KpType<RcRoot, Rc<RefCell<String>>> = Kp::new(
2668 |r: &RcRoot| Some(&r.data),
2669 |r: &mut RcRoot| Some(&mut r.data),
2670 );
2671 let next: KpType<String, String> =
2672 Kp::new(|s: &String| Some(s), |s: &mut String| Some(s));
2673 LockKp::new(prev, RcRefCellAccess::new(), next)
2674 };
2675
2676 let arc_root = ArcRoot {
2678 data: Arc::new(Mutex::new("arc_value".to_string())),
2679 };
2680
2681 let arc_kp = {
2682 let prev: KpType<ArcRoot, Arc<Mutex<String>>> = Kp::new(
2683 |r: &ArcRoot| Some(&r.data),
2684 |r: &mut ArcRoot| Some(&mut r.data),
2685 );
2686 let next: KpType<String, String> =
2687 Kp::new(|s: &String| Some(s), |s: &mut String| Some(s));
2688 LockKp::new(prev, ArcMutexAccess::new(), next)
2689 };
2690
2691 let rc_value = rc_kp.get(&rc_root);
2693 let arc_value = arc_kp.get(&arc_root);
2694
2695 assert_eq!(rc_value.unwrap(), "rc_value");
2696 assert_eq!(arc_value.unwrap(), "arc_value");
2697 }
2698
2699 #[cfg(feature = "parking_lot")]
2704 #[test]
2705 fn test_parking_lot_mutex_basic() {
2706 use parking_lot::Mutex;
2707
2708 #[derive(Clone)]
2709 struct Root {
2710 data: Arc<Mutex<String>>,
2711 }
2712
2713 let root = Root {
2714 data: Arc::new(Mutex::new("parking_lot_mutex".to_string())),
2715 };
2716
2717 let lock_kp = {
2718 let prev: KpType<Root, Arc<Mutex<String>>> =
2719 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
2720 let next: KpType<String, String> =
2721 Kp::new(|s: &String| Some(s), |s: &mut String| Some(s));
2722 LockKp::new(prev, ParkingLotMutexAccess::new(), next)
2723 };
2724
2725 let value = lock_kp.get(&root);
2726 assert_eq!(value.unwrap(), &"parking_lot_mutex".to_string());
2727 }
2728
2729 #[cfg(feature = "parking_lot")]
2730 #[test]
2731 fn test_parking_lot_rwlock_basic() {
2732 use parking_lot::RwLock;
2733
2734 #[derive(Clone)]
2735 struct Root {
2736 data: Arc<RwLock<Vec<i32>>>,
2737 }
2738
2739 let root = Root {
2740 data: Arc::new(RwLock::new(vec![1, 2, 3, 4, 5])),
2741 };
2742
2743 let lock_kp = {
2744 let prev: KpType<Root, Arc<RwLock<Vec<i32>>>> =
2745 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
2746 let next: KpType<Vec<i32>, Vec<i32>> =
2747 Kp::new(|v: &Vec<i32>| Some(v), |v: &mut Vec<i32>| Some(v));
2748 LockKp::new(prev, ParkingLotRwLockAccess::new(), next)
2749 };
2750
2751 let value = lock_kp.get(&root);
2752 assert_eq!(value.unwrap().len(), 5);
2753 assert_eq!(value.unwrap()[2], 3);
2754 }
2755
2756 #[cfg(feature = "parking_lot")]
2757 #[test]
2758 fn test_parking_lot_mutex_compose() {
2759 use parking_lot::Mutex;
2760
2761 #[derive(Clone)]
2762 struct Root {
2763 level1: Arc<Mutex<Level1>>,
2764 }
2765
2766 #[derive(Clone)]
2767 struct Level1 {
2768 level2: Arc<Mutex<i32>>,
2769 }
2770
2771 let root = Root {
2772 level1: Arc::new(Mutex::new(Level1 {
2773 level2: Arc::new(Mutex::new(42)),
2774 })),
2775 };
2776
2777 let lock1 = {
2779 let prev: KpType<Root, Arc<Mutex<Level1>>> = Kp::new(
2780 |r: &Root| Some(&r.level1),
2781 |r: &mut Root| Some(&mut r.level1),
2782 );
2783 let next: KpType<Level1, Level1> =
2784 Kp::new(|l: &Level1| Some(l), |l: &mut Level1| Some(l));
2785 LockKp::new(prev, ParkingLotMutexAccess::new(), next)
2786 };
2787
2788 let lock2 = {
2790 let prev: KpType<Level1, Arc<Mutex<i32>>> = Kp::new(
2791 |l: &Level1| Some(&l.level2),
2792 |l: &mut Level1| Some(&mut l.level2),
2793 );
2794 let next: KpType<i32, i32> = Kp::new(|n: &i32| Some(n), |n: &mut i32| Some(n));
2795 LockKp::new(prev, ParkingLotMutexAccess::new(), next)
2796 };
2797
2798 let composed = lock1.then_lock(lock2);
2800 let value = composed.get(&root);
2801 assert_eq!(value.unwrap(), &42);
2802 }
2803
2804 #[cfg(feature = "parking_lot")]
2805 #[test]
2806 fn test_parking_lot_rwlock_write() {
2807 use parking_lot::RwLock;
2808
2809 #[derive(Clone)]
2810 struct Root {
2811 data: Arc<RwLock<i32>>,
2812 }
2813
2814 let mut root = Root {
2815 data: Arc::new(RwLock::new(100)),
2816 };
2817
2818 let lock_kp = {
2819 let prev: KpType<Root, Arc<RwLock<i32>>> =
2820 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
2821 let next: KpType<i32, i32> = Kp::new(|n: &i32| Some(n), |n: &mut i32| Some(n));
2822 LockKp::new(prev, ParkingLotRwLockAccess::new(), next)
2823 };
2824
2825 let value = lock_kp.get(&root);
2827 assert_eq!(value.unwrap(), &100);
2828
2829 let mut_value = lock_kp.get_mut(&mut root);
2831 assert!(mut_value.is_some());
2832 if let Some(v) = mut_value {
2833 *v = 200;
2834 }
2835
2836 let new_value = lock_kp.get(&root);
2838 assert_eq!(new_value.unwrap(), &200);
2839 }
2840
2841 #[cfg(feature = "parking_lot")]
2842 #[test]
2843 fn test_parking_lot_panic_on_clone_proof() {
2844 use parking_lot::Mutex;
2845
2846 struct PanicOnClone {
2848 data: String,
2849 }
2850
2851 impl Clone for PanicOnClone {
2852 fn clone(&self) -> Self {
2853 panic!("❌ PARKING_LOT DEEP CLONE DETECTED! PanicOnClone was cloned!");
2854 }
2855 }
2856
2857 #[derive(Clone)]
2858 struct Root {
2859 level1: Arc<Mutex<Level1>>,
2860 }
2861
2862 struct Level1 {
2863 panic_data: PanicOnClone,
2864 value: i32,
2865 }
2866
2867 impl Clone for Level1 {
2868 fn clone(&self) -> Self {
2869 panic!("❌ Level1 was deeply cloned in parking_lot context!");
2870 }
2871 }
2872
2873 let root = Root {
2874 level1: Arc::new(Mutex::new(Level1 {
2875 panic_data: PanicOnClone {
2876 data: "test".to_string(),
2877 },
2878 value: 123,
2879 })),
2880 };
2881
2882 let lock_kp = {
2883 let prev: KpType<Root, Arc<Mutex<Level1>>> = Kp::new(
2884 |r: &Root| Some(&r.level1),
2885 |r: &mut Root| Some(&mut r.level1),
2886 );
2887 let next: KpType<Level1, i32> = Kp::new(
2888 |l: &Level1| Some(&l.value),
2889 |l: &mut Level1| Some(&mut l.value),
2890 );
2891 LockKp::new(prev, ParkingLotMutexAccess::new(), next)
2892 };
2893
2894 let value = lock_kp.get(&root);
2896
2897 assert_eq!(value.unwrap(), &123);
2899 }
2900
2901 #[test]
2902 fn test_std_mutex_direct() {
2903 use std::sync::Mutex;
2904
2905 struct Root {
2906 data: Mutex<Inner>,
2907 }
2908
2909 struct Inner {
2910 value: i32,
2911 }
2912
2913 let mut root = Root {
2914 data: Mutex::new(Inner { value: 42 }),
2915 };
2916
2917 let lock_kp = {
2918 let prev: KpType<Root, Mutex<Inner>> =
2919 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
2920 let next: KpType<Inner, i32> = Kp::new(
2921 |i: &Inner| Some(&i.value),
2922 |i: &mut Inner| Some(&mut i.value),
2923 );
2924 LockKp::new(prev, StdMutexAccess::new(), next)
2925 };
2926
2927 let value = lock_kp.get(&root);
2929 assert_eq!(value, Some(&42));
2930
2931 lock_kp.get_mut(&mut root).map(|v| *v = 100);
2933 let value = lock_kp.get(&root);
2934 assert_eq!(value, Some(&100));
2935 }
2936
2937 #[test]
2938 fn test_std_rwlock_direct() {
2939 use std::sync::RwLock;
2940
2941 struct Root {
2942 data: RwLock<Inner>,
2943 }
2944
2945 struct Inner {
2946 value: String,
2947 }
2948
2949 let mut root = Root {
2950 data: RwLock::new(Inner {
2951 value: "hello".to_string(),
2952 }),
2953 };
2954
2955 let lock_kp = {
2956 let prev: KpType<Root, RwLock<Inner>> =
2957 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
2958 let next: KpType<Inner, String> = Kp::new(
2959 |i: &Inner| Some(&i.value),
2960 |i: &mut Inner| Some(&mut i.value),
2961 );
2962 LockKp::new(prev, StdRwLockAccess::new(), next)
2963 };
2964
2965 let value = lock_kp.get(&root);
2967 assert_eq!(value.as_ref().map(|s| s.as_str()), Some("hello"));
2968
2969 lock_kp.get_mut(&mut root).map(|v| *v = "world".to_string());
2971 let value = lock_kp.get(&root);
2972 assert_eq!(value.as_ref().map(|s| s.as_str()), Some("world"));
2973 }
2974
2975 #[cfg(feature = "parking_lot")]
2976 #[test]
2977 fn test_parking_lot_mutex_direct() {
2978 use parking_lot::Mutex;
2979
2980 struct Root {
2981 data: Mutex<Inner>,
2982 }
2983
2984 struct Inner {
2985 value: i32,
2986 }
2987
2988 let mut root = Root {
2989 data: Mutex::new(Inner { value: 42 }),
2990 };
2991
2992 let lock_kp = {
2993 let prev: KpType<Root, Mutex<Inner>> =
2994 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
2995 let next: KpType<Inner, i32> = Kp::new(
2996 |i: &Inner| Some(&i.value),
2997 |i: &mut Inner| Some(&mut i.value),
2998 );
2999 LockKp::new(prev, DirectParkingLotMutexAccess::new(), next)
3000 };
3001
3002 let value = lock_kp.get(&root);
3004 assert_eq!(value, Some(&42));
3005
3006 lock_kp.get_mut(&mut root).map(|v| *v = 100);
3008 let value = lock_kp.get(&root);
3009 assert_eq!(value, Some(&100));
3010 }
3011
3012 #[cfg(feature = "parking_lot")]
3013 #[test]
3014 fn test_parking_lot_rwlock_direct() {
3015 use parking_lot::RwLock;
3016
3017 struct Root {
3018 data: RwLock<Inner>,
3019 }
3020
3021 struct Inner {
3022 value: String,
3023 }
3024
3025 let mut root = Root {
3026 data: RwLock::new(Inner {
3027 value: "hello".to_string(),
3028 }),
3029 };
3030
3031 let lock_kp = {
3032 let prev: KpType<Root, RwLock<Inner>> =
3033 Kp::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
3034 let next: KpType<Inner, String> = Kp::new(
3035 |i: &Inner| Some(&i.value),
3036 |i: &mut Inner| Some(&mut i.value),
3037 );
3038 LockKp::new(prev, DirectParkingLotRwLockAccess::new(), next)
3039 };
3040
3041 let value = lock_kp.get(&root);
3043 assert_eq!(value.as_ref().map(|s| s.as_str()), Some("hello"));
3044
3045 lock_kp.get_mut(&mut root).map(|v| *v = "world".to_string());
3047 let value = lock_kp.get(&root);
3048 assert_eq!(value.as_ref().map(|s| s.as_str()), Some("world"));
3049 }
3050}