+
+ /// Construct a map from a collection of raw values.
+ ///
+ /// You know what? I can’t immediately think of any legitimate use for this, especially because
+ /// of the requirement of the `BuildHasherDefault<TypeIdHasher>` generic in the map.
+ ///
+ /// Perhaps this will be most practical as `unsafe { Map::from_raw(iter.collect()) }`, iter
+ /// being an iterator over `(TypeId, Box<A>)` pairs. Eh, this method provides symmetry with
+ /// `into_raw`, so I don’t care if literally no one ever uses it. I’m not even going to write a
+ /// test for it, it’s so trivial.
+ ///
+ /// To improve compatibility with Cargo features, interact with this map through the names
+ /// [`anymap::RawMap`][RawMap] and [`anymap::raw_hash_map`][raw_hash_map], rather than through
+ /// `std::collections::{HashMap, hash_map}` or `hashbrown::{HashMap, hash_map}`, for anything
+ /// beyond self methods. Otherwise, if you use std and another crate in the tree enables
+ /// hashbrown, your code will break.
+ ///
+ /// # Safety
+ ///
+ /// For all entries in the raw map, the key (a `TypeId`) must match the value’s type,
+ /// or *undefined behaviour* will occur when you access that entry.
+ #[inline]
+ pub unsafe fn from_raw(raw: RawMap<A>) -> Map<A> {
+ Self { raw }
+ }
+}
+
+impl<A: ?Sized + UncheckedAnyExt> Extend<Box<A>> for Map<A> {
+ #[inline]
+ fn extend<T: IntoIterator<Item = Box<A>>>(&mut self, iter: T) {
+ for item in iter {
+ let _ = self.raw.insert(item.type_id(), item);
+ }
+ }