lento 0.1.1

Cross platform ui framework
use std::any::{Any, TypeId};
use std::collections::HashMap;
use std::ops::{Deref, DerefMut};
use crate::mrc::Mrc;

#[derive(Clone)]
pub struct ResourceTable {
    inner: Mrc<ResourceTableInner>,
}

impl ResourceTable {
    pub fn new() -> Self {
        Self {
            inner: Mrc::new(ResourceTableInner::new()),
        }
    }
}

impl Deref for ResourceTable {
    type Target = ResourceTableInner;

    fn deref(&self) -> &Self::Target {
        &self.inner
    }
}

impl DerefMut for ResourceTable {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.inner
    }
}

pub struct ResourceTableInner {
    resources: HashMap<i32, Box<dyn Any>>,
    type_resources: HashMap<TypeId, Box<dyn Any>>,
    next_resource_id: i32,
}

impl ResourceTableInner {
    pub fn new() -> Self {
        Self {
            resources: HashMap::new(),
            next_resource_id: 1,
            type_resources: HashMap::new(),
        }
    }

    pub fn put<T: 'static>(&mut self, value: T) {
        self.next_resource_id += 1;
        self.type_resources.insert(value.type_id(), Box::new(value));
    }

    pub fn get<T: 'static>(&self) -> Option<&T> {
        if let Some(v) = self.type_resources.get(&TypeId::of::<T>()) {
            v.downcast_ref::<T>()
        } else {
            None
        }
    }

}