ttmap 0.3.0

Trivial implementation of type map
Documentation
use ttmap::TypeMap;

use core::mem;

#[test]
fn check_type_sizes() {
    assert_eq!(mem::size_of::<Box<dyn PartialEq<usize>>>(), mem::size_of::<usize>() * 2);
    assert_eq!(mem::size_of::<&'static dyn PartialEq<usize>>(), mem::size_of::<usize>() * 2);
    assert_eq!(mem::size_of::<ttmap::Value<usize>>(), mem::size_of::<usize>() * 2);
}

#[test]
fn check_type_map() {
    let mut map = TypeMap::new();

    assert!(map.is_empty());
    assert_eq!(map.len(), 0);

    assert!(map.insert("test").is_none());
    assert_eq!(*map.insert("lolka").unwrap(), "test");
    assert_eq!(*map.get::<&'static str>().unwrap(), "lolka");

    assert!(map.insert::<fn ()>(check_type_map).is_none());
    assert!(*map.get::<fn ()>().unwrap() == check_type_map);

    assert!(!map.has::<usize>());
    assert_eq!(*map.get_or_default::<usize>(), 0);
    *map.get_or_default::<usize>() = 5;
    assert_eq!(*map.get_or_default::<usize>(), 5);

    assert_eq!(*map.get::<usize>().unwrap(), 5);

    assert!(!map.is_empty());
    assert_eq!(map.len(), 3);

    assert_eq!(*map.remove::<usize>().unwrap(), 5);
    assert_eq!(map.len(), 2);
    assert_eq!(map.remove::<usize>(), None);

    assert_eq!(*map.remove::<&'static str>().unwrap(), "lolka");
    assert_eq!(map.len(), 1);
    assert_eq!(map.remove::<&'static str>(), None);

    assert!(*map.remove::<fn ()>().unwrap() == check_type_map);
    assert_eq!(map.len(), 0);
    assert_eq!(map.remove::<fn ()>(), None);

    assert!(map.is_empty());

    map.clear();
    assert!(map.is_empty());
}

#[test]
fn check_dtor_called() {
    let mut is_called = false;
    struct CustomData<'a>(&'a mut bool);

    impl<'a> Drop for CustomData<'a> {
        fn drop(&mut self) {
            *self.0 = true;
        }
    }

    {
        let is_called: &'static mut bool = unsafe {
            core::mem::transmute(&mut is_called)
        };
        let data = CustomData(is_called);
        let mut map = TypeMap::new();

        assert!(map.insert(data).is_none());
    }

    assert!(is_called);
}