binius_compute/cpu/
memory.rs

1// Copyright 2025 Irreducible Inc.
2
3use 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}