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};