X-Git-Url: https://git.chrismorgan.info/anymap/blobdiff_plain/77a6bf4569767278f23ecee7d91f82aff8576027..8cc1b0c9f0211c68301d02cff9a490984a6638b9:/src/lib.rs diff --git a/src/lib.rs b/src/lib.rs index aec6445..0e92822 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,6 @@ //! This crate provides the `AnyMap` type, a safe and convenient store for one value of each type. -#![crate_name = "anymap"] -#![crate_type = "lib"] -#![feature(default_type_params, tuple_indexing)] +#![feature(default_type_params)] #![warn(unused_qualifications, non_upper_case_globals, variant_size_differences, unused_typecasts, missing_docs, unused_results)] @@ -15,11 +13,9 @@ use std::intrinsics::{forget, TypeId}; use std::collections::HashMap; use std::collections::hash_map; use std::hash::{Hash, Hasher, Writer}; -use std::mem::{transmute, transmute_copy}; +use std::mem::transmute; use std::raw::TraitObject; -pub use Entry::{Vacant, Occupied}; - struct TypeIdHasher; struct TypeIdState { @@ -56,11 +52,11 @@ trait UncheckedAnyRefExt<'a> { unsafe fn downcast_ref_unchecked(self) -> &'a T; } -impl<'a> UncheckedAnyRefExt<'a> for &'a (Any + 'a) { +impl<'a> UncheckedAnyRefExt<'a> for &'a Any { #[inline] unsafe fn downcast_ref_unchecked(self) -> &'a T { // Get the raw representation of the trait object - let to: TraitObject = transmute_copy(&self); + let to: TraitObject = transmute(self); // Extract the data pointer transmute(to.data) @@ -74,11 +70,11 @@ trait UncheckedAnyMutRefExt<'a> { unsafe fn downcast_mut_unchecked(self) -> &'a mut T; } -impl<'a> UncheckedAnyMutRefExt<'a> for &'a mut (Any + 'a) { +impl<'a> UncheckedAnyMutRefExt<'a> for &'a mut Any { #[inline] unsafe fn downcast_mut_unchecked(self) -> &'a mut T { // Get the raw representation of the trait object - let to: TraitObject = transmute_copy(&self); + let to: TraitObject = transmute(self); // Extract the data pointer transmute(to.data) @@ -190,8 +186,8 @@ impl AnyMap { /// Gets the given key's corresponding entry in the map for in-place manipulation pub fn entry(&mut self) -> Entry { match self.data.entry(TypeId::of::()) { - hash_map::Occupied(e) => Occupied(OccupiedEntry { entry: e }), - hash_map::Vacant(e) => Vacant(VacantEntry { entry: e }), + hash_map::Entry::Occupied(e) => Entry::Occupied(OccupiedEntry { entry: e }), + hash_map::Entry::Vacant(e) => Entry::Vacant(VacantEntry { entry: e }), } } @@ -211,12 +207,12 @@ impl AnyMap { } } -/// A view into a single occupied location in a HashMap +/// A view into a single occupied location in an AnyMap pub struct OccupiedEntry<'a, V: 'a> { entry: hash_map::OccupiedEntry<'a, TypeId, Box>, } -/// A view into a single empty location in a HashMap +/// A view into a single empty location in an AnyMap pub struct VacantEntry<'a, V: 'a> { entry: hash_map::VacantEntry<'a, TypeId, Box>, } @@ -317,8 +313,8 @@ fn test_entry() { // Existing key (insert) match map.entry::() { - Vacant(_) => unreachable!(), - Occupied(mut view) => { + Entry::Vacant(_) => unreachable!(), + Entry::Occupied(mut view) => { assert_eq!(view.get(), &A(10)); assert_eq!(view.set(A(100)), A(10)); } @@ -329,8 +325,8 @@ fn test_entry() { // Existing key (update) match map.entry::() { - Vacant(_) => unreachable!(), - Occupied(mut view) => { + Entry::Vacant(_) => unreachable!(), + Entry::Occupied(mut view) => { let v = view.get_mut(); let new_v = B(v.0 * 10); *v = new_v; @@ -342,8 +338,8 @@ fn test_entry() { // Existing key (take) match map.entry::() { - Vacant(_) => unreachable!(), - Occupied(view) => { + Entry::Vacant(_) => unreachable!(), + Entry::Occupied(view) => { assert_eq!(view.take(), C(30)); } } @@ -353,8 +349,8 @@ fn test_entry() { // Inexistent key (insert) match map.entry::() { - Occupied(_) => unreachable!(), - Vacant(view) => { + Entry::Occupied(_) => unreachable!(), + Entry::Vacant(view) => { assert_eq!(*view.set(J(1000)), J(1000)); } }