sfo_split/
split.rs

1use std::ops::{Deref, DerefMut};
2use std::sync::Arc;
3
4pub struct Splittable<R, W> {
5    r: R,
6    w: W,
7}
8
9impl<R, W> Splittable<R, W> {
10    pub fn new(r: R, w: W) -> Self {
11        Self {
12            r,
13            w,
14        }
15    }
16
17    pub fn split(self) -> (RHalf<R, W>, WHalf<R, W>) {
18        let key = Arc::new(0);
19        (
20            RHalf::new(self.r, key.clone()),
21            WHalf::new(self.w, key),
22        )
23    }
24
25    pub fn get_r(&self) -> &R {
26        &self.r
27    }
28
29    pub fn get_w(&self) -> &W {
30        &self.w
31    }
32
33    pub fn get_r_mut(&mut self) -> &mut R {
34        &mut self.r
35    }
36
37    pub fn get_w_mut(&mut self) -> &mut W {
38        &mut self.w
39    }
40}
41
42impl <R, W> Deref for Splittable<R, W> {
43    type Target = R;
44    fn deref(&self) -> &Self::Target {
45        &self.r
46    }
47}
48
49impl <R, W> DerefMut for Splittable<R, W> {
50    fn deref_mut(&mut self) -> &mut Self::Target {
51        &mut self.r
52    }
53}
54
55pub struct RHalf<R, W> {
56    k: Arc<u8>,
57    r: R,
58    _p: std::marker::PhantomData<W>,
59}
60
61impl<R, W> RHalf<R, W> {
62    pub(crate) fn new(r: R, k: Arc<u8>) -> Self {
63        Self {
64            k,
65            r,
66            _p: Default::default(),
67        }
68    }
69
70    pub fn is_pair_of(&self, w: &WHalf<R, W>) -> bool {
71        Arc::ptr_eq(&self.k, &w.k)
72    }
73
74    pub fn unsplit(self, w: WHalf<R, W>) -> Splittable<R, W> {
75        if !self.is_pair_of(&w) {
76            panic!("not a pair");
77        }
78
79        Splittable::new(self.r, w.w)
80    }
81}
82
83impl<R, W> Deref for RHalf<R, W> {
84    type Target = R;
85    fn deref(&self) -> &Self::Target {
86        &self.r
87    }
88}
89
90impl<R, W> DerefMut for RHalf<R, W> {
91    fn deref_mut(&mut self) -> &mut Self::Target {
92        &mut self.r
93    }
94}
95
96pub struct WHalf<R, W> {
97    k: Arc<u8>,
98    w: W,
99    _p: std::marker::PhantomData<R>,
100}
101
102impl<R, W> WHalf<R, W> {
103    pub(crate) fn new(w: W, k: Arc<u8>) -> Self {
104        Self {
105            k,
106            w,
107            _p: Default::default(),
108        }
109    }
110
111    pub fn is_pair_of(&self, r: &RHalf<R, W>) -> bool {
112        r.is_pair_of(self)
113    }
114
115    pub fn unsplit(self, r: RHalf<R, W>) -> Splittable<R, W> {
116        r.unsplit(self)
117    }
118}
119
120impl<R, W> DerefMut for WHalf<R, W> {
121    fn deref_mut(&mut self) -> &mut Self::Target {
122        &mut self.w
123    }
124}
125
126impl<R, W> Deref for WHalf<R, W> {
127    type Target = W;
128    fn deref(&self) -> &Self::Target {
129        &self.w
130    }
131}
132
133#[cfg(test)]
134mod Test {
135    #[test]
136    fn test() {
137        pub struct TestRead {
138
139        }
140
141        pub struct TestWrite {
142
143        }
144
145        let s1 = super::Splittable::new(TestRead{}, TestWrite{});
146        let (r1, w1) = s1.split();
147        let s2 = super::Splittable::new(TestRead{}, TestWrite{});
148        let (r2, w2) = s2.split();
149        assert!(r1.is_pair_of(&w1));
150        assert!(w1.is_pair_of(&r1));
151        assert!(r2.is_pair_of(&w2));
152        assert!(w2.is_pair_of(&r2));
153        assert!(!w1.is_pair_of(&r2));
154        assert!(!w2.is_pair_of(&r1));
155
156        let s1 = r1.unsplit(w1);
157        let s2 = r2.unsplit(w2);
158    }
159}