rsmorphy 0.4.0

Morphological analyzer / inflection engine for Russian and Ukrainian (soon) languages (WIP)
use std::mem;

pub trait DawgValue {
    fn new_in_place<F>(f: F) -> Self
    where
        F: FnOnce(&mut [u8]);
}

#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd, Eq, Ord)]
pub struct HH(pub u16, pub u16);

#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd, Eq, Ord)]
pub struct HHH(pub u16, pub u16, pub u16);

impl DawgValue for HH {
    #[inline(always)]
    fn new_in_place<F>(f: F) -> Self
    where
        F: FnOnce(&mut [u8]),
    {
        let mut buf = [0_u8; 4];
        f(&mut buf);
        let buf: HH = unsafe { mem::transmute(buf) };
        HH(u16::from_be(buf.0), u16::from_be(buf.1))
    }
}

impl DawgValue for HHH {
    #[inline(always)]
    fn new_in_place<F>(f: F) -> Self
    where
        F: FnOnce(&mut [u8]),
    {
        let mut buf = [0_u8; 6];
        f(&mut buf);
        let buf: HHH = unsafe { mem::transmute(buf) };
        HHH(
            u16::from_be(buf.0),
            u16::from_be(buf.1),
            u16::from_be(buf.2),
        )
    }
}