num_packer/
impls.rs

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
28// impl U8Packer
29macro_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
52// impl U16Packer
53macro_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
76// impl U32Packer
77macro_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);