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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use core::{cmp, fmt, ops};
use super::{Int, OpCode};
#[derive(Copy, Clone, Default, Eq, PartialEq, Hash)]
pub struct OcBuilder {
len: u8,
buf: [u8; 15],
}
impl OcBuilder {
pub fn new(len: usize) -> OcBuilder {
OcBuilder {
len: cmp::min(len, 15) as u8,
buf: [0; 15],
}
}
pub fn write<T: Int>(mut self, offset: usize, val: T) -> OcBuilder {
(*self).write(offset, val); self
}
}
impl<T: AsRef<[u8]>> From<T> for OcBuilder {
#[inline]
fn from(val: T) -> OcBuilder {
let bytes = val.as_ref();
let len = cmp::min(bytes.len(), 15);
let mut builder = OcBuilder::new(len);
builder.buf[..len].copy_from_slice(&bytes[..len]);
builder
}
}
impl ops::Deref for OcBuilder {
type Target = OpCode;
fn deref(&self) -> &OpCode {
(&self.buf[..self.len as usize]).into()
}
}
impl ops::DerefMut for OcBuilder {
fn deref_mut(&mut self) -> &mut OpCode {
(&mut self.buf[..self.len as usize]).into()
}
}
impl fmt::Debug for OcBuilder {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Debug::fmt(&**self, f)
}
}
impl fmt::Display for OcBuilder {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(&**self, f)
}
}
#[test]
fn ocbuilder() {
assert_eq!(*OcBuilder::new(2).write(0, 0x40u8).write(1, 0x55u8), b"\x40\x55");
assert_eq!(*OcBuilder::new(5).write(0, 0xB8u8).write(1, 42), b"\xB8\x2A\x00\x00\x00");
}