1pub trait OperationObject {
5 fn append_to_vec(&self, byte_stream: &mut Vec<u8>);
6
7 fn to_bytes(&self) -> Vec<u8> {
8 let mut byte_stream = Vec::new();
9 self.append_to_vec(&mut byte_stream);
10 byte_stream
11 }
12}
13
14pub struct AndOp {
15 pub operand1: Vec<u8>,
16 pub operand2: Vec<u8>,
17 pub target_name: Vec<u8>,
18}
19
20impl OperationObject for AndOp {
21 fn append_to_vec(&self, byte_stream: &mut Vec<u8>) {
22 byte_stream.push(0x7b);
23 byte_stream.extend_from_slice(&self.operand1);
24 byte_stream.extend_from_slice(&self.operand2);
25 byte_stream.extend_from_slice(&self.target_name);
26 }
27}
28
29pub struct OrOp {
30 pub operand1: Vec<u8>,
31 pub operand2: Vec<u8>,
32 pub target_name: Vec<u8>,
33}
34
35impl OperationObject for OrOp {
36 fn append_to_vec(&self, byte_stream: &mut Vec<u8>) {
37 byte_stream.push(0x7d);
38 byte_stream.extend_from_slice(&self.operand1);
39 byte_stream.extend_from_slice(&self.operand2);
40 byte_stream.extend_from_slice(&self.target_name);
41 }
42}
43
44pub struct ReturnOp {
45 pub result: Vec<u8>,
46}
47
48impl OperationObject for ReturnOp {
49 fn append_to_vec(&self, byte_stream: &mut Vec<u8>) {
50 byte_stream.push(0xa4);
51 byte_stream.extend_from_slice(&self.result);
52 }
53}
54
55#[cfg(test)]
56mod tests {
57 use super::*;
58 use crate::dsdt::encode_integer;
59 use crate::dsdt::tests::verify_expected_bytes;
60
61 #[test]
62 fn verify_and_operation() {
63 let op = AndOp {
64 operand1: vec![b'S', b'T', b'A', b'_'],
65 operand2: encode_integer(13),
66 target_name: vec![b'S', b'T', b'A', b'_'],
67 };
68 let bytes = op.to_bytes();
69 verify_expected_bytes(
70 &bytes,
71 &[
72 0x7b, b'S', b'T', b'A', b'_', 0x0a, 0x0d, b'S', b'T', b'A', b'_',
73 ],
74 );
75 }
76
77 #[test]
78 fn verify_or_operation() {
79 let op = OrOp {
80 operand1: vec![b'S', b'T', b'A', b'_'],
81 operand2: encode_integer(13),
82 target_name: vec![b'S', b'T', b'A', b'_'],
83 };
84 let bytes = op.to_bytes();
85 verify_expected_bytes(
86 &bytes,
87 &[
88 0x7d, b'S', b'T', b'A', b'_', 0x0a, 0x0d, b'S', b'T', b'A', b'_',
89 ],
90 );
91 }
92
93 #[test]
94 fn verify_return_operation() {
95 let op = ReturnOp {
96 result: vec![b'S', b'T', b'A', b'_'],
97 };
98 let bytes = op.to_bytes();
99 verify_expected_bytes(&bytes, &[0xa4, b'S', b'T', b'A', b'_']);
100 }
101}