1#![feature(core)]
2#![feature(alloc)]
3#![allow(unused_features)]
4
5use std::rc::{Rc, Weak};
17use std::iter::Iterator;
18use std::ops::Deref;
19
20#[derive(Clone, Debug)]
21enum Link<T> {
22 Weak(Weak<T>),
23 Strong(Rc<T>),
24 None
25}
26
27impl<T> Link<T> {
28 fn downgrade(&self) -> Link<T> {
29 match self {
30 &Link::Weak(ref x) => Link::Weak(x.clone()),
31 &Link::Strong(ref x) => Link::Weak(x.downgrade()),
32 &Link::None => Link::None
33 }
34 }
35}
36
37#[derive(Clone, Debug)]
38pub struct Node<T> {
40 value: T,
41 next: Link<Node<T>>,
42}
43
44impl<T> Deref for Node<T> {
45 type Target = T;
46 fn deref(&self) -> &T {
47 &self.value
48 }
49}
50
51#[derive(Clone, Debug)]
53pub struct RcList<T> {
54 first: Link<Node<T>>,
55}
56
57impl<T> RcList<T> {
58
59 pub fn new() -> RcList<T> {
61 RcList { first: Link::None }
62 }
63
64}
65
66impl<T : Clone> RcList<T> {
67 pub fn new_append(value : T, rest : &RcList<T>) -> RcList<T> {
69 let first = rest.first.clone();
70 RcList {
71 first: Link::Strong(Rc::new(
72 Node {
73 value: value,
74 next: first,
75 }
76 ))
77 }
78 }
79
80 pub fn new_append_weak(value : T, rest : &RcList<T>) -> RcList<T> {
85 let first = rest.first.clone();
86 RcList {
87 first: Link::Strong(Rc::new(
88 Node {
89 value: value,
90 next: first.downgrade(),
91 }
92 ))
93 }
94 }
95
96 pub fn iter(&self) -> RcListIter<T> {
98 RcListIter { iter: self.first.clone() }
99 }
100}
101
102pub struct RcListIter<T: 'static> {
104 iter : Link<Node<T>>,
105}
106
107impl<T : Clone> Iterator for RcListIter< T> {
108
109 type Item = Rc<Node<T>>;
110
111 #[inline]
112 fn next(&mut self) -> Option<Rc<Node<T>>> {
113 let ret = match self.iter {
114 Link::None => None,
115 Link::Strong(ref rc) => Some(rc.clone()),
116 Link::Weak(ref weak) => weak.upgrade(),
117 };
118
119 self.iter = match ret {
120 Some(ref ret) => ret.next.clone(),
121 None => Link::None
122 };
123
124 ret
125 }
126}
127
128#[cfg(test)]
129mod test;
130