1use crate::constants;
6
7pub fn fit_order(size: usize) -> usize {
10 if size == 0 {
11 return 0;
12 }
13 (std::mem::size_of::<usize>() * 8 - (size - 1).leading_zeros() as usize)
15 .saturating_sub(constants::MIN_ORDER_SHIFT)
16}
17
18pub fn order_to_size(order: u8) -> usize {
20 constants::MIN_ORDER_SIZE << order
21}
22
23pub fn block_size_for_payload(payload_size: usize) -> usize {
26 (payload_size + constants::HEADER_SIZE_BYTES)
27 .clamp(constants::MIN_ORDER_SIZE, constants::MAX_ORDER_SIZE)
28}
29
30pub fn payload_size_for_order(order: u8) -> usize {
32 order_to_size(order) - constants::HEADER_SIZE_BYTES
33}
34
35#[cfg(test)]
36mod test {
37 use super::*;
38
39 #[test]
40 fn fit_order_test() {
41 assert_eq!(0, fit_order(1));
42 assert_eq!(0, fit_order(16));
43 assert_eq!(1, fit_order(17));
44 assert_eq!(2, fit_order(33));
45 assert_eq!(7, fit_order(2048));
46 }
47
48 #[test]
49 fn order_to_size_test() {
50 assert_eq!(16, order_to_size(0));
51 assert_eq!(32, order_to_size(1));
52 assert_eq!(64, order_to_size(2));
53 assert_eq!(128, order_to_size(3));
54 assert_eq!(256, order_to_size(4));
55 assert_eq!(512, order_to_size(5));
56 assert_eq!(1024, order_to_size(6));
57 assert_eq!(2048, order_to_size(7));
58 }
59
60 #[test]
61 fn fit_payload_test() {
62 for payload_size in 0..500 {
63 let block_size = block_size_for_payload(payload_size);
64 let order = fit_order(block_size) as u8;
65 let payload_max = payload_size_for_order(order);
66 assert!(
67 payload_size <= payload_max,
68 "Needed {payload_size} bytes for a payload, but only got {payload_max}; block size {block_size}, order {order}"
69 );
70 }
71 }
72}