extern crate bit_vec;
use std::fmt;
use std::ops::{Index, IndexMut};
#[cfg(test)]
mod tests;
pub trait PerfectHash {
type K;
fn hash(&self, k: Self::K) -> usize;
fn size(&self) -> usize;
}
pub trait HashInverse: PerfectHash {
fn invert(&self, hash: usize) -> Self::K;
fn iter(&self) -> KeyIter<Self> {
KeyIter { next: 0, hash: self }
}
}
pub struct KeyIter<'a, H: ?Sized + 'a> {
hash: &'a H,
next: usize,
}
impl<'a, H: HashInverse> Iterator for KeyIter<'a, H> {
type Item = H::K;
fn next(&mut self) -> Option<Self::Item> {
let size = self.hash.size();
if self.next == size {
self.next = 0;
None
} else {
let idx = self.next;
self.next += 1;
Some(self.hash.invert(idx))
}
}
}
pub struct Map<V, H> {
hash: H,
backing: Box<[V]>,
}
impl<V: Default, H: PerfectHash> Map<V, H> {
pub fn new(hash: H) -> Self {
let size = hash.size();
let mut vec: Vec<V> = Vec::with_capacity(size);
for _ in 0..size {
vec.push(V::default());
}
Map {
hash: hash,
backing: vec.into_boxed_slice(),
}
}
}
impl<V: Copy, H: PerfectHash> Map<V, H> {
pub fn from_element(hash: H, value: &V) -> Self {
let size = hash.size();
let mut vec: Vec<V> = Vec::with_capacity(size);
for _ in 0..size {
vec.push(*value);
}
Map {
hash: hash,
backing: vec.into_boxed_slice(),
}
}
}
impl<V, H: HashInverse> Map<V, H> {
pub fn iter(&self) -> MapIter<H, V> {
MapIter {
backing: self.backing.iter(),
hash: &self.hash,
pos: 0,
}
}
pub fn iter_mut(&mut self) -> MapIterMut<H, V> {
MapIterMut {
backing: self.backing.iter_mut(),
hash: &self.hash,
pos: 0,
}
}
}
impl<'a, V, H: HashInverse> IntoIterator for &'a Map<V, H> {
type Item = (H::K, &'a V);
type IntoIter = MapIter<'a, H, V>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<'a, V, H: HashInverse> IntoIterator for &'a mut Map<V, H> {
type Item = (H::K, &'a mut V);
type IntoIter = MapIterMut<'a, H, V>;
fn into_iter(self) -> Self::IntoIter {
self.iter_mut()
}
}
pub struct MapIter<'a, H: 'a, V: 'a> {
backing: std::slice::Iter<'a, V>,
hash: &'a H,
pos: usize,
}
impl<'a, H: HashInverse, V: 'a> Iterator for MapIter<'a, H, V> {
type Item = (H::K, &'a V);
fn next(&mut self) -> Option<Self::Item> {
self.backing.next().map(|value| {
let key = self.hash.invert(self.pos);
self.pos += 1;
(key, value)
})
}
}
pub struct MapIterMut<'a, H: 'a, V: 'a> {
backing: std::slice::IterMut<'a, V>,
hash: &'a H,
pos: usize,
}
impl<'a, H: HashInverse, V: 'a> Iterator for MapIterMut<'a, H, V> {
type Item = (H::K, &'a mut V);
fn next(&mut self) -> Option<Self::Item> {
self.backing.next().map(|value| {
let key = self.hash.invert(self.pos);
self.pos += 1;
(key, value)
})
}
}
impl<V, H: PerfectHash> Map<V, H> {
pub fn from_initial(hash: H, init: Vec<V>) -> Self {
let size = hash.size();
assert_eq!(size, init.len());
Map {
hash: hash,
backing: init.into_boxed_slice(),
}
}
pub fn insert(&mut self, k: H::K, v: V) {
self.backing[self.hash.hash(k)] = v;
}
pub fn swap(&mut self, k: H::K, v: &mut V) {
std::mem::swap(&mut self.backing[self.hash.hash(k)], v);
}
pub fn get(&self, k: H::K) -> &V {
&self.backing[self.hash.hash(k)]
}
pub fn get_mut(&mut self, k: H::K) -> &mut V {
&mut self.backing[self.hash.hash(k)]
}
}
impl<V, H> Map<V, H> {
pub fn is_empty(&self) -> bool {
self.backing.is_empty()
}
pub fn len(&self) -> usize {
self.backing.len()
}
pub fn values(&self) -> std::slice::Iter<V> {
self.backing.iter()
}
pub fn values_mut(&mut self) -> std::slice::IterMut<V> {
self.backing.iter_mut()
}
}
impl<V, H> fmt::Debug for Map<V, H>
where V: fmt::Debug
{
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "{:?}", &*self.backing)
}
}
impl<V, H: PerfectHash> Index<H::K> for Map<V, H> {
type Output = V;
fn index(&self, k: H::K) -> &V {
self.get(k)
}
}
impl<V, H: PerfectHash> IndexMut<H::K> for Map<V, H> {
fn index_mut(&mut self, k: H::K) -> &mut V {
self.get_mut(k)
}
}
pub struct Set<H> {
hash: H,
backing: bit_vec::BitVec,
}
impl<H: PerfectHash> Set<H> {
pub fn new(hash: H) -> Self {
let size = hash.size();
Set {
hash: hash,
backing: bit_vec::BitVec::from_elem(size, false),
}
}
pub fn insert(&mut self, k: H::K) -> bool {
let idx = self.hash.hash(k);
let ret = self.backing.get(idx).unwrap();
self.backing.set(idx, true);
ret
}
pub fn erase(&mut self, k: H::K) -> bool {
let idx = self.hash.hash(k);
let ret = self.backing.get(idx).unwrap();
self.backing.set(idx, false);
ret
}
fn has(&self, index: usize) -> bool {
self.backing.get(index).unwrap()
}
pub fn contains(&self, k: H::K) -> bool {
let idx = self.hash.hash(k);
self.has(idx)
}
}
impl<H: HashInverse> Set<H> {
pub fn iter(&self) -> SetIter<H> {
SetIter {
next: self.backing.len(),
set: self,
}
}
}
impl<'a, H: HashInverse> IntoIterator for &'a Set<H> {
type Item = H::K;
type IntoIter = SetIter<'a, H>;
fn into_iter(self) -> SetIter<'a, H> {
self.iter()
}
}
impl<H: PerfectHash + Default> Default for Set<H> {
fn default() -> Self {
Self::new(H::default())
}
}
pub struct SetIter<'a, H: PerfectHash + 'a> {
next: usize,
set: &'a Set<H>,
}
impl<'a, H: HashInverse> Iterator for SetIter<'a, H> {
type Item = H::K;
fn next(&mut self) -> Option<Self::Item> {
let size = self.set.hash.size();
if self.next == size {
self.next = 0;
} else {
self.next += 1;
}
while self.next < size && !self.set.has(self.next) {
self.next += 1;
}
if self.next == size {
None
} else {
Some(self.set.hash.invert(self.next))
}
}
}