arena_traits/
lib.rs

1#![no_std]
2extern crate alloc;
3use core::ops::IndexMut;
4
5use alloc::boxed::Box;
6
7pub trait IndexAlloc<Idx>: IndexMut<Idx> {
8    fn alloc(&mut self, a: Self::Output) -> Idx;
9}
10pub trait IndexIter<Idx>: IndexMut<Idx> {
11    fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = Idx> + 'a>;
12}
13pub trait Arena<Idx>: IndexAlloc<Idx> + IndexIter<Idx> {}
14impl<Idx, T: IndexAlloc<Idx> + IndexIter<Idx>> Arena<Idx> for T {}
15#[cfg(feature = "id-arena")]
16const _: () = {
17    impl<T> IndexAlloc<id_arena::Id<T>> for id_arena::Arena<T> {
18        fn alloc(&mut self, a: Self::Output) -> id_arena::Id<T> {
19            self.alloc(a)
20        }
21    };
22    impl<T> IndexIter<id_arena::Id<T>> for id_arena::Arena<T> {
23        fn iter<'a>(&'a self) -> Box<(dyn Iterator<Item = id_arena::Id<T>> + 'a)> {
24            Box::new(self.iter().map(|a| a.0))
25        }
26    }
27};
28impl<T> IndexIter<usize> for [T] {
29    fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = usize> + 'a> {
30        Box::new(self.iter().enumerate().map(|a| a.0))
31    }
32}
33impl<T, const N: usize> IndexIter<usize> for [T; N] {
34    fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = usize> + 'a> {
35        Box::new(0..N)
36    }
37}
38#[cfg(feature = "portal-solutions-id-arena")]
39const _: () = {
40    use portal_solutions_id_arena as id_arena;
41    impl<T> IndexAlloc<id_arena::Id<T>> for id_arena::Arena<T> {
42        fn alloc(&mut self, a: Self::Output) -> id_arena::Id<T> {
43            self.alloc(a)
44        }
45    };
46    impl<T> IndexIter<id_arena::Id<T>> for id_arena::Arena<T> {
47        fn iter<'a>(&'a self) -> Box<(dyn Iterator<Item = id_arena::Id<T>> + 'a)> {
48            Box::new(self.iter().map(|a| a.0))
49        }
50    }
51};