1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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),
        )
    }
}