midi_vlq/
lib.rs

1use local_vec::CopyLocalVec;
2
3mod from;
4mod ux;
5mod as_ref;
6mod eq;
7
8type VlqBuf = CopyLocalVec<u8, 4>; 
9
10// Test the README file as well
11#[doc = include_str!("../README.md")]
12#[cfg(doctest)]
13struct ReadmeDoctests;
14
15/// A VLQ-encoded integer for the Standard MIDI file format
16/// # Examples
17/// ```
18/// use midi_vlq::MidiVlq;
19/// // encode 0x4000 as VLQ
20/// let vlq = MidiVlq::from(0x4000_u16);
21/// assert_eq!(vlq, [0b10000001, 0b10000000, 0]);
22/// ```
23#[derive(Copy, Clone, Debug)]
24pub struct MidiVlq(VlqBuf);
25
26impl MidiVlq {
27    /// length in bytes
28    pub fn len(&self) -> usize {
29        self.0.len()
30    }
31
32    pub fn to_u32(&self) -> u32 {
33        <Self as Into<u32>>::into(*self)
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::MidiVlq;
40    #[test]
41    fn it_works() {
42        let vlq = MidiVlq::from(0u8);
43        assert_eq!(vlq, [0]);
44        assert_eq!(vlq.to_u32(), 0);
45
46        let vlq = MidiVlq::from(0x40u8);
47        assert_eq!(vlq, [0x40]);
48        assert_eq!(vlq.to_u32(), 0x40);
49
50        let vlq = MidiVlq::from(0x7fu8);
51        assert_eq!(vlq, [0x7f]);
52        assert_eq!(vlq.to_u32(), 0x7f);
53
54        let vlq = MidiVlq::from(0x80u8);
55        assert_eq!(vlq, [0x81, 0x00]);
56        assert_eq!(vlq.to_u32(), 0x80);
57
58        let vlq = MidiVlq::from(0x2000u16);
59        assert_eq!(vlq, [0xC0, 0x00]);
60        assert_eq!(vlq.to_u32(), 0x2000);
61
62        let vlq = MidiVlq::from(0x3fffu16);
63        assert_eq!(vlq, [0xff, 0x7f]);
64        assert_eq!(vlq.to_u32(), 0x3fff);
65
66        let vlq = MidiVlq::from(0x4000u16);
67        assert_eq!(vlq, [0x81, 0x80, 0x00]);
68        assert_eq!(vlq.to_u32(), 0x4000);
69
70        let vlq = MidiVlq::try_from(0x10_0000u32);
71        assert!(vlq.is_ok());
72        let vlq = vlq.unwrap();
73        assert_eq!(vlq, [0xc0, 0x80, 0x00]);
74        assert_eq!(vlq.to_u32(), 0x10_0000);
75
76        let vlq = MidiVlq::try_from(0x1f_ffffu32);
77        assert!(vlq.is_ok());
78        let vlq = vlq.unwrap();
79        assert_eq!(vlq, [0xff, 0xff, 0x7f]);
80        assert_eq!(vlq.to_u32(), 0x1f_ffff);
81
82        let vlq = MidiVlq::try_from(0x20_0000u32);
83        assert!(vlq.is_ok());
84        let vlq = vlq.unwrap();
85        assert_eq!(vlq, [0x81, 0x80, 0x80, 0x00]);
86        assert_eq!(vlq.to_u32(), 0x20_0000);
87
88        let vlq = MidiVlq::try_from(0x800_0000u32);
89        assert!(vlq.is_ok());
90        let vlq = vlq.unwrap();
91        assert_eq!(vlq, [0xc0, 0x80, 0x80, 0x00]);
92        assert_eq!(vlq.to_u32(), 0x800_0000);
93
94        let vlq = MidiVlq::try_from(0x0fff_ffffu32);
95        assert!(vlq.is_ok());
96        let vlq = vlq.unwrap();
97        assert_eq!(vlq, [0xff, 0xff, 0xff, 0x7f]);
98        assert_eq!(vlq.to_u32(), 0x0fff_ffff);
99    }
100}