blob: 8e838a8be3bc1c8a0fa49192eaae357378f9c517 [file] [log] [blame]
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001use std::iter::FromIterator;
2use std::slice;
3use std::vec;
4
5#[derive(Eq, PartialEq, Hash, Debug, Clone)]
6pub struct Delimited<T, D> {
7 inner: Vec<(T, Option<D>)>
8}
9
10impl<T, D> Delimited<T, D> {
11 pub fn new() -> Delimited<T, D> {
12 Delimited {
13 inner: Vec::new(),
14 }
15 }
16
17 pub fn is_empty(&self) -> bool {
18 self.inner.len() == 0
19 }
20
21 pub fn len(&self) -> usize {
22 self.inner.len()
23 }
24
25 pub fn get(&self, idx: usize) -> Element<&T, &D> {
26 let (ref t, ref d) = self.inner[idx];
27 match *d {
28 Some(ref d) => Element::Delimited(t, d),
29 None => Element::End(t),
30 }
31 }
32
33 pub fn get_mut(&mut self, idx: usize) -> Element<&mut T, &mut D> {
34 let (ref mut t, ref mut d) = self.inner[idx];
35 match *d {
36 Some(ref mut d) => Element::Delimited(t, d),
37 None => Element::End(t),
38 }
39 }
40
41 pub fn iter(&self) -> Iter<T, D> {
42 Iter { inner: self.inner.iter() }
43 }
44
45 pub fn into_iter(self) -> IntoIter<T, D> {
46 IntoIter { inner: self.inner.into_iter() }
47 }
48
49 pub fn items(&self) -> Items<T, D> {
50 Items { inner: self.inner.iter() }
51 }
52
53 pub fn push(&mut self, token: Element<T, D>) {
54 assert!(self.len() == 0 || self.trailing_delim());
55 match token {
56 Element::Delimited(t, d) => self.inner.push((t, Some(d))),
57 Element::End(t) => self.inner.push((t, None)),
58 }
59 }
60
61 pub fn push_first(&mut self, token: T) {
62 assert!(self.is_empty());
63 self.inner.push((token, None));
64 }
65
66 pub fn push_next(&mut self, token: T, delimiter: D) {
67 self.push_trailing(delimiter);
68 self.inner.push((token, None));
69 }
70
71 pub fn push_trailing(&mut self, delimiter: D) {
72 let len = self.len();
73 assert!(self.inner[len - 1].1.is_none());
74 self.inner[len - 1].1 = Some(delimiter);
75 }
76
77 pub fn push_default(&mut self, token: T) where D: Default {
78 if self.len() == 0 {
79 self.inner.push((token, None));
80 } else {
81 self.push_next(token, D::default());
82 }
83 }
84
85 pub fn pop(&mut self) -> Option<Element<T, D>> {
86 self.inner.pop().map(|e| {
87 match e {
88 (t, Some(d)) => Element::Delimited(t, d),
89 (t, None) => Element::End(t),
90 }
91 })
92 }
93
94 pub fn into_vec(self) -> Vec<T> {
95 self.inner.into_iter().map(|t| t.0).collect()
96 }
97
98 pub fn trailing_delim(&self) -> bool {
99 self.inner[self.inner.len() - 1].1.is_some()
100 }
101}
102
103impl<T, D> From<Vec<(T, Option<D>)>> for Delimited<T, D> {
104 fn from(v: Vec<(T, Option<D>)>) -> Self {
105 Delimited {
106 inner: v,
107 }
108 }
109}
110
111impl<T, D> From<Vec<T>> for Delimited<T, D>
112 where D: Default,
113{
114 fn from(v: Vec<T>) -> Self {
115 let last = v.len() - 1;
116 Delimited {
117 inner: v.into_iter().enumerate().map(|(i, item)| {
118 (item, if i == last {None} else {Some(D::default())})
119 }).collect(),
120 }
121 }
122}
123
124impl<T, D> FromIterator<Element<T, D>> for Delimited<T, D> {
125 fn from_iter<I: IntoIterator<Item = Element<T, D>>>(i: I) -> Self {
126 let mut ret = Delimited::new();
127 for element in i {
128 match element {
129 Element::Delimited(a, b) => ret.inner.push((a, Some(b))),
130 Element::End(a) => ret.inner.push((a, None)),
131 }
132 }
133 return ret
134 }
135}
136
137impl<T, D> Default for Delimited<T, D> {
138 fn default() -> Self {
139 Delimited::new()
140 }
141}
142
143pub struct Iter<'a, T: 'a, D: 'a> {
144 inner: slice::Iter<'a, (T, Option<D>)>,
145}
146
147impl<'a, T, D> Iterator for Iter<'a, T, D> {
148 type Item = Element<&'a T, &'a D>;
149
150 fn next(&mut self) -> Option<Element<&'a T, &'a D>> {
151 self.inner.next().map(|pair| {
152 match pair.1 {
153 Some(ref delimited) => Element::Delimited(&pair.0, delimited),
154 None => Element::End(&pair.0),
155 }
156 })
157 }
158}
159
160pub struct Items<'a, T: 'a, D: 'a> {
161 inner: slice::Iter<'a, (T, Option<D>)>,
162}
163
164impl<'a, T, D> Iterator for Items<'a, T, D> {
165 type Item = &'a T;
166
167 fn next(&mut self) -> Option<&'a T> {
168 self.inner.next().map(|pair| &pair.0)
169 }
170}
171
172pub struct IntoIter<T, D> {
173 inner: vec::IntoIter<(T, Option<D>)>,
174}
175
176impl<T, D> Iterator for IntoIter<T, D> {
177 type Item = Element<T, D>;
178
179 fn next(&mut self) -> Option<Element<T, D>> {
180 self.inner.next().map(|pair| {
181 match pair.1 {
182 Some(v) => Element::Delimited(pair.0, v),
183 None => Element::End(pair.0)
184 }
185 })
186 }
187}
188
189pub enum Element<T, D> {
190 Delimited(T, D),
191 End(T),
192}
193
194impl<T, D> Element<T, D> {
195 pub fn into_item(self) -> T {
196 match self {
197 Element::Delimited(t, _) |
198 Element::End(t) => t,
199 }
200 }
201
202 pub fn item(&self) -> &T {
203 match *self {
204 Element::Delimited(ref t, _) |
205 Element::End(ref t) => t,
206 }
207 }
208
209 pub fn item_mut(&mut self) -> &mut T {
210 match *self {
211 Element::Delimited(ref mut t, _) |
212 Element::End(ref mut t) => t,
213 }
214 }
215
216 pub fn delimiter(&self) -> Option<&D> {
217 match *self {
218 Element::Delimited(_, ref d) => Some(d),
219 Element::End(_) => None,
220 }
221 }
222}
223
224#[cfg(feature = "printing")]
225mod printing {
226 use super::*;
227 use quote::{Tokens, ToTokens};
228
229
230 impl<T, D> ToTokens for Delimited<T, D>
231 where T: ToTokens,
232 D: ToTokens,
233 {
234 fn to_tokens(&self, tokens: &mut Tokens) {
235 tokens.append_all(self.iter())
236 }
237 }
238
239 impl<T, D> ToTokens for Element<T, D>
240 where T: ToTokens,
241 D: ToTokens,
242 {
243 fn to_tokens(&self, tokens: &mut Tokens) {
244 match *self {
245 Element::Delimited(ref a, ref b) => {
246 a.to_tokens(tokens);
247 b.to_tokens(tokens);
248 }
249 Element::End(ref a) => a.to_tokens(tokens),
250 }
251 }
252 }
253}