1use std::ops::{Deref, DerefMut};
5use std::borrow::Cow;
6use std::convert::Infallible;
7use std::sync::{Arc, Weak};
8use std::fmt::{self, Debug, Display, Formatter};
9use std::hash::{Hash, Hasher};
10use either::Either;
11use parking_lot::{RwLock, RwLockReadGuard, RwLockUpgradableReadGuard, RwLockWriteGuard};
12use super::cons::CacheAcceptor;
13
14#[derive(Debug)]
16pub struct Node<T: ?Sized> {
17 data: Arc<RwLock<T>>
19}
20
21impl<T: ?Sized> Node<T> {
22 pub fn data(&self) -> View<RwLockReadGuard<T>> { View::new(self.data.read()) }
24 pub fn try_data(&self) -> Option<View<RwLockReadGuard<T>>> {
42 self.data.try_read().map(View::new)
43 }
44 pub fn data_mut(&self) -> View<RwLockWriteGuard<T>> { View::new(self.data.write()) }
47 pub fn try_data_mut(&self) -> Option<View<RwLockWriteGuard<T>>> {
64 self.data.try_write().map(View::new)
65 }
66 pub fn downgrade(&self) -> WeakNode<T> { WeakNode { data: Arc::downgrade(&self.data) } }
68}
69
70impl<T: ?Sized> Clone for Node<T> {
71 #[inline(always)] fn clone(&self) -> Node<T> { Node { data: self.data.clone() } }
72}
73
74impl<T: ?Sized> PartialEq for Node<T> {
75 #[inline] fn eq(&self, other: &Node<T>) -> bool { Arc::ptr_eq(&self.data, &other.data) }
76}
77
78impl<T: ?Sized> Eq for Node<T> {}
79
80impl<T: ?Sized> Hash for Node<T> {
81 #[inline] fn hash<H: Hasher>(&self, hasher: &mut H) {
82 (self.data.deref() as *const RwLock<_>).hash(hasher)
83 }
84}
85
86#[derive(Debug, Clone)]
88pub struct NotBacklinked<T>(Node<T>);
89
90impl<T: NodeData> NotBacklinked<T> {
91 pub fn backlink(self) -> Result<Node<T>, T::Error> {
93 {
94 let mut data = self.0.data.write();
95 data.backlink(Backlink(&self.0))?;
96 }
97 Ok(self.0)
98 }
99}
100
101#[derive(Debug, Clone)]
103pub struct Backlink<'a, T>(&'a Node<T>);
104
105impl<T> Deref for Backlink<'_, T> {
106 type Target = Node<T>;
107 #[inline(always)] fn deref(&self) -> &Node<T> { self.0 }
108}
109
110pub trait NodeData: Sized {
112 type Error;
114 type CacheAcceptor: CacheAcceptor<Self>;
116 fn backlink(&mut self, _backlink: Backlink<Self>) -> Result<(), Self::Error> { Ok(()) }
121 fn dedup(&mut self) -> Either<Node<Self>, Self::CacheAcceptor>;
124}
125
126#[derive(Debug, PartialEq)]
128pub struct View<R>(pub(crate) R);
129
130impl<R> Deref for View<R> where R: Deref {
131 type Target = R::Target;
132 fn deref(&self) -> &R::Target { self.0.deref() }
133}
134
135impl<R> View<R> where R: Deref {
136 pub fn new(r: R) -> View<R> { View(r) }
138}
139
140impl<'a, T> View<RwLockWriteGuard<'a, T>> {
141 pub fn downgrade(self) -> View<RwLockReadGuard<'a, T>> {
143 View::new(RwLockWriteGuard::downgrade(self.0))
144 }
145 pub fn downgrade_to_upgradeable(self) -> View<RwLockUpgradableReadGuard<'a, T>> {
147 View::new(RwLockWriteGuard::downgrade_to_upgradable(self.0))
148 }
149}
150
151impl<'a, T> View<RwLockUpgradableReadGuard<'a, T>> {
152 pub fn upgrade(self) -> View<RwLockWriteGuard<'a, T>> {
154 View::new(RwLockUpgradableReadGuard::upgrade(self.0))
155 }
156 pub fn try_upgrade(self) -> Result<View<RwLockWriteGuard<'a, T>>, Self> {
158 match RwLockUpgradableReadGuard::try_upgrade(self.0) {
159 Ok(up) => Ok(View::new(up)),
160 Err(s) => Err(View::new(s))
161 }
162 }
163}
164
165impl<T: NodeData> Node<T> {
166 fn not_backlinked(data: T) -> NotBacklinked<T> {
168 NotBacklinked(Node { data : Arc::new(RwLock::new(data)) })
169 }
170 pub fn try_new(mut data: T) -> Result<Node<T>, T::Error> {
172 match data.dedup() {
173 Either::Left(node) => Ok(node),
174 Either::Right(acceptor) => {
175 let node = Node::not_backlinked(data).backlink()?;
176 acceptor.accept(node.downgrade());
177 Ok(node)
178 }
179 }
180 }
181}
182
183impl<T: NodeData<Error=Infallible>> Node<T> {
184 pub fn new(data: T) -> Node<T> {
186 Node::try_new(data).unwrap_or_else(|err| match err {})
187 }
188}
189
190impl<T: Display> Display for Node<T> {
191 fn fmt(&self, fmt: &mut Formatter) -> Result<(), fmt::Error> {
192 write!(fmt, "{}", self.data().deref())
193 }
194}
195
196#[derive(Debug)]
198pub struct WeakNode<T: ?Sized> {
199 data: Weak<RwLock<T>>
201}
202
203impl<T: ?Sized> Clone for WeakNode<T> {
204 #[inline(always)] fn clone(&self) -> WeakNode<T> { WeakNode { data: self.data.clone() } }
205}
206
207impl<T> Default for WeakNode<T> {
208 #[inline(always)] fn default() -> WeakNode<T> { WeakNode { data: Weak::default() } }
209}
210
211impl<T: ?Sized> WeakNode<T> {
212 pub fn upgrade(&self) -> Option<Node<T>> { self.data.upgrade().map(|data| Node { data }) }
214}
215
216impl<T: ?Sized> PartialEq for WeakNode<T> {
217 fn eq(&self, other: &WeakNode<T>) -> bool { self.data.ptr_eq(&other.data) }
218}
219
220impl<T: ?Sized> Eq for WeakNode<T> {}
221
222impl<T> Hash for WeakNode<T> {
223 #[inline] fn hash<H: Hasher>(&self, hasher: &mut H) {
224 self.data.as_ptr().hash(hasher)
225 }
226}
227
228impl<T> WeakNode<T> {
229 pub fn is_null(&self) -> bool { self == &WeakNode::default() }
231}
232
233impl<T> WeakNode<T> {
234 pub fn new() -> WeakNode<T> { WeakNode { data: Weak::default() } }
236 pub fn alloc_eq(&self, other: &WeakNode<T>) -> bool {
239 !self.data.ptr_eq(&Weak::new()) && self == other
240 }
241}
242
243pub trait HasThis<T=Self> {
245 fn this(&self) -> Cow<WeakNode<T>>;
248}
249
250impl<T> HasThis<T> for WeakNode<T> {
251 fn this(&self) -> Cow<WeakNode<T>> { Cow::Borrowed(&self) }
252}
253
254pub trait HasAddr<T=Self> {
256 fn addr(&self) -> Cow<Node<T>>;
258}
259
260impl<T> HasAddr<T> for Node<T> {
261 #[inline(always)] fn addr(&self) -> Cow<Node<T>> { Cow::Borrowed(&self) }
262}
263
264impl<T> HasThis<T> for Node<T> {
265 #[inline(always)] fn this(&self) -> Cow<WeakNode<T>> { Cow::Owned(self.downgrade()) }
266}
267
268#[derive(Debug, Copy, Clone, Eq, PartialEq)]
270pub struct ToWeak<I>(pub I);
271
272impl<'a, T: 'a, I> Iterator for ToWeak<I> where I: Iterator<Item=&'a Node<T>> {
273 type Item = WeakNode<T>;
274 fn next(&mut self) -> Option<WeakNode<T>> { self.0.next().map(Node::downgrade) }
275 fn size_hint(&self) -> (usize, Option<usize>) { self.0.size_hint() }
276 fn count(self) -> usize { self.0.count() }
277 fn last(self) -> Option<WeakNode<T>> { self.0.last().map(Node::downgrade) }
278 fn nth(&mut self, n: usize) -> Option<WeakNode<T>> { self.0.nth(n).map(Node::downgrade) }
279}
280
281impl<'a, T: 'a, I> ExactSizeIterator for ToWeak<I> where I: ExactSizeIterator<Item=&'a Node<T>> {
282 fn len(&self) -> usize { self.0.len() }
283}
284
285impl<'a, T: 'a, I> DoubleEndedIterator for ToWeak<I> where I: DoubleEndedIterator<Item=&'a Node<T>>
286{
287 fn next_back(&mut self) -> Option<WeakNode<T>> { self.0.next_back().map(Node::downgrade) }
288}
289
290#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Default)]
292pub struct Data<T>(pub T);
293
294impl<T> Deref for Data<T> {
295 type Target = T;
296 fn deref(&self) -> &T { &self.0 }
297}
298
299impl<T> DerefMut for Data<T> {
300 fn deref_mut(&mut self) -> &mut T { &mut self.0 }
301}
302
303impl<T> NodeData for Data<T> {
304 type Error = Infallible;
305 type CacheAcceptor = ();
306 fn dedup(&mut self) -> Either<Node<Data<T>>, ()> { Either::Right(()) }
307}
308
309impl<R, T> DerefMut for View<R> where R: DerefMut<Target=Data<T>> {
310 fn deref_mut(&mut self) -> &mut Data<T> { self.0.deref_mut() }
311}