1use crate::{BoolPacker, I8Packer, I16Packer, I32Packer, U8Packer, U16Packer, U32Packer};
2
3macro_rules! impl_bool_packer_for_num {
4 ($t:ty) => {
5 impl BoolPacker for $t {
6 fn pack_bool(first: bool, second: bool) -> Self {
7 ((first as $t) << 1) | (second as $t)
8 }
9
10 fn unpack_bool(&self) -> (bool, bool) {
11 ((self & 0b10) != 0, (self & 0b01) != 0)
12 }
13 }
14 };
15}
16
17impl_bool_packer_for_num!(u8);
18impl_bool_packer_for_num!(u16);
19impl_bool_packer_for_num!(u32);
20impl_bool_packer_for_num!(u64);
21impl_bool_packer_for_num!(usize);
22impl_bool_packer_for_num!(i8);
23impl_bool_packer_for_num!(i16);
24impl_bool_packer_for_num!(i32);
25impl_bool_packer_for_num!(i64);
26impl_bool_packer_for_num!(isize);
27
28macro_rules! impl_u8_packer_for_num {
30 ($t:ty) => {
31 impl U8Packer for $t {
32 fn pack_u8(first: u8, second: u8) -> Self {
33 ((first as $t) << 8) | (second as $t)
34 }
35
36 fn unpack_u8(&self) -> (u8, u8) {
37 (((self >> 8) & 0xFF) as u8, (self & 0xFF) as u8)
38 }
39 }
40 };
41}
42
43impl_u8_packer_for_num!(u16);
44impl_u8_packer_for_num!(u32);
45impl_u8_packer_for_num!(u64);
46impl_u8_packer_for_num!(usize);
47impl_u8_packer_for_num!(i16);
48impl_u8_packer_for_num!(i32);
49impl_u8_packer_for_num!(i64);
50impl_u8_packer_for_num!(isize);
51
52macro_rules! impl_u16_packer_for_num {
54 ($t:ty) => {
55 impl U16Packer for $t {
56 fn pack_u16(first: u16, second: u16) -> Self {
57 ((first as $t) << 16) | (second as $t)
58 }
59
60 fn unpack_u16(&self) -> (u16, u16) {
61 (((self >> 16) & 0xFFFF) as u16, (self & 0xFFFF) as u16)
62 }
63 }
64 };
65}
66
67impl_u16_packer_for_num!(u32);
68impl_u16_packer_for_num!(u64);
69#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
70impl_u16_packer_for_num!(usize);
71impl_u16_packer_for_num!(i32);
72impl_u16_packer_for_num!(i64);
73#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
74impl_u16_packer_for_num!(isize);
75
76macro_rules! impl_u32_packer_for_num {
78 ($t:ty) => {
79 impl U32Packer for $t {
80 fn pack_u32(first: u32, second: u32) -> Self {
81 ((first as $t) << 32) | (second as $t)
82 }
83
84 fn unpack_u32(&self) -> (u32, u32) {
85 (
86 ((self >> 32) & 0xFFFFFFFF) as u32,
87 (self & 0xFFFFFFFF) as u32,
88 )
89 }
90 }
91 };
92}
93
94impl_u32_packer_for_num!(u64);
95#[cfg(target_pointer_width = "64")]
96impl_u32_packer_for_num!(usize);
97impl_u32_packer_for_num!(i64);
98#[cfg(target_pointer_width = "64")]
99impl_u32_packer_for_num!(isize);
100
101macro_rules! impl_i8_packer_for_num {
102 ($t:ty) => {
103 impl I8Packer for $t {
104 fn pack_i8(first: i8, second: i8) -> Self {
105 let first_u = first as u8 as $t;
106 let second_u = second as u8 as $t;
107 (first_u << 8) | second_u
108 }
109
110 fn unpack_i8(&self) -> (i8, i8) {
111 let first = ((self >> 8) & 0xFF) as u8 as i8;
112 let second = (self & 0xFF) as u8 as i8;
113 (first, second)
114 }
115 }
116 };
117}
118
119impl_i8_packer_for_num!(i16);
120impl_i8_packer_for_num!(i32);
121impl_i8_packer_for_num!(i64);
122impl_i8_packer_for_num!(isize);
123impl_i8_packer_for_num!(u16);
124impl_i8_packer_for_num!(u32);
125impl_i8_packer_for_num!(u64);
126impl_i8_packer_for_num!(usize);
127
128macro_rules! impl_i16_packer_for_num {
129 ($t:ty) => {
130 impl I16Packer for $t {
131 fn pack_i16(first: i16, second: i16) -> Self {
132 let first_u = first as u16 as $t;
133 let second_u = second as u16 as $t;
134 (first_u << 16) | second_u
135 }
136
137 fn unpack_i16(&self) -> (i16, i16) {
138 let first = ((self >> 16) & 0xFFFF) as u16 as i16;
139 let second = (self & 0xFFFF) as u16 as i16;
140 (first, second)
141 }
142 }
143 };
144}
145
146impl_i16_packer_for_num!(u32);
147impl_i16_packer_for_num!(u64);
148#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
149impl_i16_packer_for_num!(usize);
150impl_i16_packer_for_num!(i32);
151impl_i16_packer_for_num!(i64);
152#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
153impl_i16_packer_for_num!(isize);
154
155macro_rules! impl_i32_packer_for_num {
156 ($t:ty) => {
157 impl I32Packer for $t {
158 fn pack_i32(first: i32, second: i32) -> Self {
159 let first_u = first as u32 as $t;
160 let second_u = second as u32 as $t;
161 (first_u << 32) | second_u
162 }
163
164 fn unpack_i32(&self) -> (i32, i32) {
165 let first = ((self >> 32) & 0xFFFFFFFF) as u32 as i32;
166 let second = (self & 0xFFFFFFFF) as u32 as i32;
167 (first, second)
168 }
169 }
170 };
171}
172
173impl_i32_packer_for_num!(u64);
174#[cfg(target_pointer_width = "64")]
175impl_i32_packer_for_num!(usize);
176impl_i32_packer_for_num!(i64);
177#[cfg(target_pointer_width = "64")]
178impl_i32_packer_for_num!(isize);