1extern crate alloc;
2
3use core::fmt;
4
5use super::UnsafeSeqLock;
6use alloc::sync::Arc;
7
8pub fn arc<T>(value: T) -> (ArcSeqLockWriter<T>, ArcSeqLockReader<T>) {
9 let wt = ArcSeqLockWriter::new(value);
10 let rd = wt.reader();
11 (wt, rd)
12}
13
14#[repr(transparent)]
15pub struct ArcSeqLockWriter<T>(alloc::sync::Arc<UnsafeSeqLock<T>>);
16
17impl<T> ArcSeqLockWriter<T> {
18 pub fn new(value: T) -> Self {
19 Self(Arc::new(UnsafeSeqLock::new(value)))
20 }
21 pub fn reader(&self) -> ArcSeqLockReader<T> {
22 ArcSeqLockReader(self.0.clone())
23 }
24}
25
26impl<T: Copy> ArcSeqLockWriter<T> {
27 pub fn write(&mut self, value: T) {
28 unsafe { self.0.write(value) }
29 }
30 pub fn read(&self) -> T {
31 unsafe { self.0.read() }
32 }
33}
34
35impl<T: fmt::Debug + Copy> fmt::Debug for ArcSeqLockWriter<T> {
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 self.read().fmt(f)
38 }
39}
40
41#[derive(Clone)]
42#[repr(transparent)]
43pub struct ArcSeqLockReader<T>(Arc<UnsafeSeqLock<T>>);
44
45impl<T: Copy> ArcSeqLockReader<T> {
46 pub fn read(&self) -> T {
47 unsafe { self.0.read() }
48 }
49 pub fn read_version(&self) -> (u64, T) {
50 unsafe { self.0.read_version() }
51 }
52 pub fn try_read(&self) -> Option<T> {
53 unsafe { self.0.try_read() }
54 }
55 pub fn try_read_version(&self) -> Option<(u64, T)> {
56 unsafe { self.0.try_read_version() }
57 }
58}
59
60impl<T: fmt::Debug + Copy> fmt::Debug for ArcSeqLockReader<T> {
61 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62 self.read().fmt(f)
63 }
64}