1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
use std::{ any::Any, collections::HashMap, }; #[derive(Default)] pub struct PolymorphicContainer { data: HashMap<usize, Box<dyn Any>>, } impl PolymorphicContainer { pub fn store(&mut self, value: impl Any) -> usize { let key = self.data.len(); self.data.insert(key, Box::new(value)); key } pub fn store_at(&mut self, key: usize, value: Box<dyn Any>) { self.data.insert(key, value); } pub fn try_remove_boxed(&mut self, key: usize) -> Option<Box<dyn Any>> { self.data.remove(&key) } pub fn remove_boxed(&mut self, key: usize) -> Box<dyn Any> { self.try_remove_boxed(key).unwrap() } pub fn try_remove<T: 'static>(&mut self, key: usize) -> Option<Box<T>> { self.data .remove(&key)? .downcast() .ok() } pub fn remove<T: 'static>(&mut self, key: usize) -> Box<T> { self.try_remove(key).unwrap() } }