binius_compute/cpu/
memory.rs1use std::{collections::Bound, ops::RangeBounds};
4
5use crate::memory::ComputeMemory;
6
7#[derive(Debug)]
8pub struct CpuMemory;
9
10impl<F: 'static> ComputeMemory<F> for CpuMemory {
11 const MIN_SLICE_LEN: usize = 1;
12
13 type FSlice<'a> = &'a [F];
14 type FSliceMut<'a> = &'a mut [F];
15
16 fn as_const<'a>(data: &'a &mut [F]) -> &'a [F] {
17 data
18 }
19
20 fn slice(data: Self::FSlice<'_>, range: impl RangeBounds<usize>) -> Self::FSlice<'_> {
21 let start = match range.start_bound() {
22 Bound::Included(&start) => start,
23 Bound::Excluded(&start) => start + 1,
24 Bound::Unbounded => 0,
25 };
26 let end = match range.end_bound() {
27 Bound::Included(&end) => end + 1,
28 Bound::Excluded(&end) => end,
29 Bound::Unbounded => data.len(),
30 };
31 &data[start..end]
32 }
33
34 fn slice_mut<'a>(data: &'a mut &mut [F], range: impl RangeBounds<usize>) -> &'a mut [F] {
35 let start = match range.start_bound() {
36 Bound::Included(&start) => start,
37 Bound::Excluded(&start) => start + 1,
38 Bound::Unbounded => 0,
39 };
40 let end = match range.end_bound() {
41 Bound::Included(&end) => end + 1,
42 Bound::Excluded(&end) => end,
43 Bound::Unbounded => data.len(),
44 };
45 &mut data[start..end]
46 }
47
48 fn split_at_mut(
49 data: Self::FSliceMut<'_>,
50 mid: usize,
51 ) -> (Self::FSliceMut<'_>, Self::FSliceMut<'_>) {
52 data.split_at_mut(mid)
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn test_try_slice_on_mem_slice() {
62 let data = [4, 5, 6];
63 assert_eq!(CpuMemory::slice(&data, 0..2), &data[0..2]);
64 assert_eq!(CpuMemory::slice(&data, ..2), &data[..2]);
65 assert_eq!(CpuMemory::slice(&data, 1..), &data[1..]);
66 assert_eq!(CpuMemory::slice(&data, ..), &data[..]);
67 }
68
69 #[test]
70 fn test_convert_mut_mem_slice_to_const() {
71 let mut data = [4, 5, 6];
72 let data_clone = data;
73 let data = &mut data[..];
74 let data = CpuMemory::as_const(&data);
75 assert_eq!(data, &data_clone);
76 }
77
78 #[test]
79 fn test_try_slice_on_mut_mem_slice() {
80 let mut data = [4, 5, 6];
81 let mut data_clone = data;
82 let mut data = &mut data[..];
83 assert_eq!(CpuMemory::slice_mut(&mut data, 0..2), &mut data_clone[0..2]);
84 assert_eq!(CpuMemory::slice_mut(&mut data, ..2), &mut data_clone[..2]);
85 assert_eq!(CpuMemory::slice_mut(&mut data, 1..), &mut data_clone[1..]);
86 assert_eq!(CpuMemory::slice_mut(&mut data, ..), &mut data_clone[..]);
87 }
88}