//! An order-preserving immutable map constructed at compile time. use core::fmt; use core::iter::FusedIterator; use core::iter::IntoIterator; use core::ops::Index; use core::slice; use phf_shared::{self, HashKey, PhfBorrow, PhfHash};
/// An order-preserving immutable map constructed at compile time. /// /// Unlike a `Map`, iteration order is guaranteed to match the definition /// order. /// /// ## Note /// /// The fields of this struct are public so that they may be initialized by the /// `phf_ordered_map!` macro and code generation. They are subject to change at /// any time and should never be accessed directly. pubstruct OrderedMap<K: 'static, V: 'static> { #[doc(hidden)] pub key: HashKey, #[doc(hidden)] pub disps: &'static [(u32, u32)], #[doc(hidden)] pub idxs: &'static [usize], #[doc(hidden)] pub entries: &'static [(K, V)],
}
impl<K, V> OrderedMap<K, V> { /// Returns the number of entries in the `OrderedMap`. #[inline] pubconstfn len(&self) -> usize { self.entries.len()
}
/// Returns true if the `OrderedMap` is empty. #[inline] pubconstfn is_empty(&self) -> bool { self.len() == 0
}
/// Returns a reference to the value that `key` maps to. pubfn get<T: ?Sized>(&self, key: &T) -> Option<&V> where
T: Eq + PhfHash,
K: PhfBorrow<T>,
{ self.get_entry(key).map(|e| e.1)
}
/// Returns a reference to the map's internal static instance of the given /// key. /// /// This can be useful for interning schemes. pubfn get_key<T: ?Sized>(&self, key: &T) -> Option<&K> where
T: Eq + PhfHash,
K: PhfBorrow<T>,
{ self.get_entry(key).map(|e| e.0)
}
/// Determines if `key` is in the `OrderedMap`. pubfn contains_key<T: ?Sized>(&self, key: &T) -> bool where
T: Eq + PhfHash,
K: PhfBorrow<T>,
{ self.get(key).is_some()
}
/// Returns the index of the key within the list used to initialize /// the ordered map. pubfn get_index<T: ?Sized>(&self, key: &T) -> Option<usize> where
T: Eq + PhfHash,
K: PhfBorrow<T>,
{ self.get_internal(key).map(|(i, _)| i)
}
/// Returns references to both the key and values at an index /// within the list used to initialize the ordered map. See `.get_index(key)`. pubfn index(&self, index: usize) -> Option<(&K, &V)> { self.entries.get(index).map(|&(ref k, ref v)| (k, v))
}
/// Like `get`, but returns both the key and the value. pubfn get_entry<T: ?Sized>(&self, key: &T) -> Option<(&K, &V)> where
T: Eq + PhfHash,
K: PhfBorrow<T>,
{ self.get_internal(key).map(|(_, e)| e)
}
fn get_internal<T: ?Sized>(&self, key: &T) -> Option<(usize, (&K, &V))> where
T: Eq + PhfHash,
K: PhfBorrow<T>,
{ ifself.disps.is_empty() { return None;
} //Prevent panic on empty map let hashes = phf_shared::hash(key, &self.key); let idx_index = phf_shared::get_index(&hashes, self.disps, self.idxs.len()); let idx = self.idxs[idx_index as usize]; let entry = &self.entries[idx];
let b: &T = entry.0.borrow(); if b == key {
Some((idx, (&entry.0, &entry.1)))
} else {
None
}
}
/// Returns an iterator over the key/value pairs in the map. /// /// Entries are returned in the same order in which they were defined. pubfn entries(&self) -> Entries<'_, K, V> {
Entries {
iter: self.entries.iter(),
}
}
/// Returns an iterator over the keys in the map. /// /// Keys are returned in the same order in which they were defined. pubfn keys(&self) -> Keys<'_, K, V> {
Keys {
iter: self.entries(),
}
}
/// Returns an iterator over the values in the map. /// /// Values are returned in the same order in which they were defined. pubfn values(&self) -> Values<'_, K, V> {
Values {
iter: self.entries(),
}
}
}
impl<'a, K, V> IntoIterator for &'a OrderedMap<K, V> { type Item = (&'a K, &'a V); type IntoIter = Entries<'a, K, V>;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.