| 674 | /// which slows down things. |
| 675 | #[inline(never)] |
| 676 | pub fn make_view(data: &[u8], block_id: u32, offset: u32) -> u128 { |
| 677 | let len = data.len(); |
| 678 | |
| 679 | // Generate specialized code for each potential small string length |
| 680 | // to improve performance |
| 681 | match len { |
| 682 | 0 => make_inlined_view::<0>(data), |
| 683 | 1 => make_inlined_view::<1>(data), |
| 684 | 2 => make_inlined_view::<2>(data), |
| 685 | 3 => make_inlined_view::<3>(data), |
| 686 | 4 => make_inlined_view::<4>(data), |
| 687 | 5 => make_inlined_view::<5>(data), |
| 688 | 6 => make_inlined_view::<6>(data), |
| 689 | 7 => make_inlined_view::<7>(data), |
| 690 | 8 => make_inlined_view::<8>(data), |
| 691 | 9 => make_inlined_view::<9>(data), |
| 692 | 10 => make_inlined_view::<10>(data), |
| 693 | 11 => make_inlined_view::<11>(data), |
| 694 | 12 => make_inlined_view::<12>(data), |
| 695 | // When string is longer than 12 bytes, it can't be inlined, we create a ByteView instead. |
| 696 | _ => { |
| 697 | let view = ByteView { |
| 698 | length: len as u32, |
| 699 | prefix: u32::from_le_bytes(data[0..4].try_into().unwrap()), |
| 700 | buffer_index: block_id, |
| 701 | offset, |
| 702 | }; |
| 703 | view.as_u128() |
| 704 | } |
| 705 | } |
| 706 | } |
| 707 | |
| 708 | #[cfg(test)] |
| 709 | mod tests { |