rudy 0.0.1

Judy array implementation in pure Rust
Documentation
use ::Key;
use super::innerptr::{InnerPtr, IntoPtr};
use super::traits::JpmNode;
use ::rudymap::results::InsertResult;
use super::branch_uncompressed::BranchUncompressed;
use std::iter::FromIterator;

struct Subexpanse<K: Key, V> {
    pub bitmap: u32,
    pub ptr: Option<Box<[InnerPtr<K, V>; 32]>>
}

impl<K: Key, V> Default for Subexpanse<K, V> {
    fn default() -> Subexpanse<K, V> {
        Subexpanse {
            bitmap: 0,
            ptr: None
        }
    }
}

impl<K: Key, V> Subexpanse<K, V> {
    fn is_set(&self, sub_byte: u8) -> bool {
        self.bitmap & (1 << sub_byte as u32) != 0
    }

    pub fn get(&self, sub_byte: u8, subkey: &[u8]) -> Option<&V> {
        if self.is_set(sub_byte) {
            self.ptr.as_ref()
                .unwrap()[sub_byte as usize]
                .get(subkey)
        } else {
            None
        }
    }

    pub fn get_mut(&mut self, sub_byte: u8, subkey: &[u8]) -> Option<&mut V> {
        if self.is_set(sub_byte) {
            self.ptr.as_mut()
                .unwrap()[sub_byte as usize]
                .get_mut(subkey)
        } else {
            None
        }
    }

    pub fn insert(&mut self, sub_byte: u8, subkey: &[u8], value: V) -> InsertResult<V> {
        if self.ptr.is_none() {
            self.ptr = Some(Default::default());
        }
        let evicted = self.ptr.as_mut()
            .unwrap()[sub_byte as usize]
            .insert(subkey, value);
        self.bitmap |= 1 << sub_byte as u32;
        InsertResult::Success(evicted)
    }

    pub fn insert_ptr(&mut self, sub_byte: u8, ptr: InnerPtr<K, V>) {
        if self.ptr.is_none() {
            self.ptr = Some(Default::default());
        }
        self.ptr.as_mut().unwrap()[sub_byte as usize] = ptr;
        self.bitmap |= 1 << sub_byte as u32;
    }
}

pub struct BranchBitmap<K: Key, V> {
    subexpanses: [Subexpanse<K, V>; 8]
}

impl<K: Key, V> BranchBitmap<K, V> {
    pub fn new() -> BranchBitmap<K, V> {
        BranchBitmap {
            subexpanses: Default::default()
        }
    }
}

impl<K: Key, V> JpmNode<K, V> for BranchBitmap<K, V> {
    fn get(&self, key: &[u8]) -> Option<&V> {
        let (&byte, subkey) = key.split_first().unwrap();
        self.subexpanses[byte as usize / 32].get(byte % 32, subkey)
    }
    fn get_mut(&mut self, key: &[u8]) -> Option<&mut V> {
        let (&byte, subkey) = key.split_first().unwrap();
        self.subexpanses[byte as usize / 32].get_mut(byte % 32, subkey)
    }
    fn insert(&mut self, key: &[u8], value: V) -> InsertResult<V> {
        let (&byte, subkey) = key.split_first().unwrap();
        self.subexpanses[byte as usize / 32].insert(byte % 32, subkey, value)
    }
    fn expand(self, pop: usize, key: &[u8], value: V) -> InnerPtr<K, V> {
        unreachable!()
    }
}

impl<K: Key, V> FromIterator<(u8, InnerPtr<K, V>)> for BranchBitmap<K, V> {
    fn from_iter<I>(iter: I) -> BranchBitmap<K, V>
        where I: IntoIterator<Item=(u8, InnerPtr<K, V>)> {
        let mut node = BranchBitmap::new();
        for (k, v) in iter {
            node.subexpanses[k as usize / 32].insert_ptr(k % 32, v);
        }
        node
    }
}