1mod handle;
23mod handle_set;
24mod handlevec;
25mod range;
26mod unique_arena;
27
28pub use handle::{BadHandle, Handle};
29pub(crate) use handle_set::HandleSet;
30pub(crate) use handlevec::HandleVec;
31pub use range::{BadRangeError, Range};
32pub use unique_arena::UniqueArena;
33
34use alloc::vec::Vec;
35use core::{fmt, ops};
36
37use crate::Span;
38
39use handle::Index;
40
41#[derive(Clone)]
48#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
49#[cfg_attr(feature = "serialize", serde(transparent))]
50#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
51#[cfg_attr(test, derive(PartialEq))]
52pub struct Arena<T> {
53 data: Vec<T>,
55 #[cfg_attr(feature = "serialize", serde(skip))]
56 span_info: Vec<Span>,
57}
58
59impl<T> Default for Arena<T> {
60 fn default() -> Self {
61 Self::new()
62 }
63}
64
65impl<T: fmt::Debug> fmt::Debug for Arena<T> {
66 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
67 f.debug_map().entries(self.iter()).finish()
68 }
69}
70
71impl<T> Arena<T> {
72 pub const fn new() -> Self {
74 Arena {
75 data: Vec::new(),
76 span_info: Vec::new(),
77 }
78 }
79
80 pub fn into_inner(self) -> Vec<T> {
82 self.data
83 }
84
85 pub const fn len(&self) -> usize {
87 self.data.len()
88 }
89
90 pub const fn is_empty(&self) -> bool {
92 self.data.is_empty()
93 }
94
95 pub fn iter(&self) -> impl DoubleEndedIterator<Item = (Handle<T>, &T)> + ExactSizeIterator {
98 self.data
99 .iter()
100 .enumerate()
101 .map(|(i, v)| (Handle::from_usize(i), v))
102 }
103
104 pub fn iter_mut_span(
107 &mut self,
108 ) -> impl DoubleEndedIterator<Item = (Handle<T>, &mut T, &Span)> + ExactSizeIterator {
109 self.data
110 .iter_mut()
111 .zip(self.span_info.iter())
112 .enumerate()
113 .map(|(i, (v, span))| (Handle::from_usize(i), v, span))
114 }
115
116 pub fn drain(&mut self) -> impl DoubleEndedIterator<Item = (Handle<T>, T, Span)> {
118 let arena = core::mem::take(self);
119 arena
120 .data
121 .into_iter()
122 .zip(arena.span_info)
123 .enumerate()
124 .map(|(i, (v, span))| (Handle::from_usize(i), v, span))
125 }
126
127 pub fn iter_mut(&mut self) -> impl DoubleEndedIterator<Item = (Handle<T>, &mut T)> {
130 self.data
131 .iter_mut()
132 .enumerate()
133 .map(|(i, v)| (Handle::from_usize(i), v))
134 }
135
136 pub fn append(&mut self, value: T, span: Span) -> Handle<T> {
138 let index = self.data.len();
139 self.data.push(value);
140 self.span_info.push(span);
141 Handle::from_usize(index)
142 }
143
144 pub fn fetch_if<F: Fn(&T) -> bool>(&self, fun: F) -> Option<Handle<T>> {
146 self.data
147 .iter()
148 .position(fun)
149 .map(|index| Handle::from_usize(index))
150 }
151
152 pub fn fetch_if_or_append<F: Fn(&T, &T) -> bool>(
157 &mut self,
158 value: T,
159 span: Span,
160 fun: F,
161 ) -> Handle<T> {
162 if let Some(index) = self.data.iter().position(|d| fun(d, &value)) {
163 Handle::from_usize(index)
164 } else {
165 self.append(value, span)
166 }
167 }
168
169 pub fn fetch_or_append(&mut self, value: T, span: Span) -> Handle<T>
171 where
172 T: PartialEq,
173 {
174 self.fetch_if_or_append(value, span, T::eq)
175 }
176
177 pub fn try_get(&self, handle: Handle<T>) -> Result<&T, BadHandle> {
178 self.data
179 .get(handle.index())
180 .ok_or_else(|| BadHandle::new(handle))
181 }
182
183 pub fn get_mut(&mut self, handle: Handle<T>) -> &mut T {
185 self.data.get_mut(handle.index()).unwrap()
186 }
187
188 pub fn range_from(&self, old_length: usize) -> Range<T> {
190 let range = old_length as u32..self.data.len() as u32;
191 Range::from_index_range(range, self)
192 }
193
194 pub fn clear(&mut self) {
196 self.data.clear()
197 }
198
199 pub fn take(&mut self) -> Self {
201 core::mem::take(self)
202 }
203
204 pub fn get_span(&self, handle: Handle<T>) -> Span {
205 *self
206 .span_info
207 .get(handle.index())
208 .unwrap_or(&Span::default())
209 }
210
211 pub fn check_contains_handle(&self, handle: Handle<T>) -> Result<(), BadHandle> {
213 if handle.index() < self.data.len() {
214 Ok(())
215 } else {
216 Err(BadHandle::new(handle))
217 }
218 }
219
220 pub fn check_contains_range(&self, range: &Range<T>) -> Result<(), BadRangeError> {
222 if range.inner.start > range.inner.end {
225 return Err(BadRangeError::new(range.clone()));
226 }
227
228 if range.inner.start == range.inner.end {
230 return Ok(());
231 }
232
233 let last_handle = Handle::new(Index::new(range.inner.end - 1).unwrap());
234 if self.check_contains_handle(last_handle).is_err() {
235 return Err(BadRangeError::new(range.clone()));
236 }
237
238 Ok(())
239 }
240
241 pub(crate) fn retain_mut<P>(&mut self, mut predicate: P)
242 where
243 P: FnMut(Handle<T>, &mut T) -> bool,
244 {
245 let mut index = 0;
246 let mut retained = 0;
247 self.data.retain_mut(|elt| {
248 let handle = Handle::from_usize(index);
249 let keep = predicate(handle, elt);
250
251 if keep {
255 self.span_info[retained] = self.span_info[index];
256 retained += 1;
257 }
258
259 index += 1;
260 keep
261 });
262
263 self.span_info.truncate(retained);
264 }
265}
266
267#[cfg(feature = "deserialize")]
268impl<'de, T> serde::Deserialize<'de> for Arena<T>
269where
270 T: serde::Deserialize<'de>,
271{
272 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
273 where
274 D: serde::Deserializer<'de>,
275 {
276 let data = Vec::deserialize(deserializer)?;
277 let span_info = core::iter::repeat_n(Span::default(), data.len()).collect();
278
279 Ok(Self { data, span_info })
280 }
281}
282
283impl<T> ops::Index<Handle<T>> for Arena<T> {
284 type Output = T;
285 fn index(&self, handle: Handle<T>) -> &T {
286 &self.data[handle.index()]
287 }
288}
289
290impl<T> ops::IndexMut<Handle<T>> for Arena<T> {
291 fn index_mut(&mut self, handle: Handle<T>) -> &mut T {
292 &mut self.data[handle.index()]
293 }
294}
295
296impl<T> ops::Index<Range<T>> for Arena<T> {
297 type Output = [T];
298 fn index(&self, range: Range<T>) -> &[T] {
299 &self.data[range.inner.start as usize..range.inner.end as usize]
300 }
301}
302
303#[cfg(test)]
304mod tests {
305 use super::*;
306
307 #[test]
308 fn append_non_unique() {
309 let mut arena: Arena<u8> = Arena::new();
310 let t1 = arena.append(0, Default::default());
311 let t2 = arena.append(0, Default::default());
312 assert!(t1 != t2);
313 assert!(arena[t1] == arena[t2]);
314 }
315
316 #[test]
317 fn append_unique() {
318 let mut arena: Arena<u8> = Arena::new();
319 let t1 = arena.append(0, Default::default());
320 let t2 = arena.append(1, Default::default());
321 assert!(t1 != t2);
322 assert!(arena[t1] != arena[t2]);
323 }
324
325 #[test]
326 fn fetch_or_append_non_unique() {
327 let mut arena: Arena<u8> = Arena::new();
328 let t1 = arena.fetch_or_append(0, Default::default());
329 let t2 = arena.fetch_or_append(0, Default::default());
330 assert!(t1 == t2);
331 assert!(arena[t1] == arena[t2])
332 }
333
334 #[test]
335 fn fetch_or_append_unique() {
336 let mut arena: Arena<u8> = Arena::new();
337 let t1 = arena.fetch_or_append(0, Default::default());
338 let t2 = arena.fetch_or_append(1, Default::default());
339 assert!(t1 != t2);
340 assert!(arena[t1] != arena[t2]);
341 }
342}