|
1 | | -use alloc::{ |
2 | | - format, |
3 | | - sync::Arc, |
4 | | - vec::Vec, |
5 | | -}; |
| 1 | +use alloc::vec::Vec; |
6 | 2 | use core::{ |
7 | | - marker::{ |
8 | | - self, |
9 | | - }, |
| 3 | + self, |
10 | 4 | mem, |
11 | 5 | ops::Range, |
12 | 6 | slice, |
13 | 7 | }; |
14 | 8 |
|
15 | 9 | use crate::{ |
16 | | - AccessError, |
17 | | - AccessMode, |
18 | 10 | Copy, |
19 | 11 | FromMemoryView, |
| 12 | + MemoryDecodeError, |
20 | 13 | MemoryView, |
21 | 14 | Reference, |
22 | | - Viewable, |
| 15 | + SizedViewable, |
23 | 16 | }; |
24 | 17 |
|
25 | 18 | #[allow(clippy::len_without_is_empty)] |
26 | | -pub trait Array<T: ?Sized> { |
| 19 | +pub trait Array<T> { |
27 | 20 | fn start_address(&self) -> u64; |
28 | 21 |
|
29 | 22 | fn len(&self) -> Option<usize>; |
30 | 23 | } |
31 | 24 |
|
32 | 25 | impl<T: FromMemoryView> dyn Array<T> { |
33 | | - pub fn element_at(&self, memory: &dyn MemoryView, index: usize) -> Result<T, AccessError> { |
| 26 | + pub fn element_at<M: MemoryView>( |
| 27 | + &self, |
| 28 | + memory: &M, |
| 29 | + index: usize, |
| 30 | + ) -> Result<T, MemoryDecodeError<M::AccessError, T::DecodeError>> { |
34 | 31 | let offset = (index * mem::size_of::<T>()) as u64; |
35 | | - T::read_object(memory, self.start_address() + offset).map_err(|err| AccessError { |
36 | | - source: err, |
37 | | - offset: self.start_address() + offset, |
38 | | - size: mem::size_of::<T>(), |
39 | | - mode: AccessMode::Read, |
40 | | - object: "[..]".into(), |
41 | | - member: Some(format!("[{}]", index).into()), |
42 | | - }) |
| 32 | + T::read_object(memory, self.start_address() + offset) |
43 | 33 | } |
44 | 34 |
|
45 | | - pub fn elements( |
| 35 | + pub fn elements<M: MemoryView>( |
46 | 36 | &self, |
47 | | - memory: &dyn MemoryView, |
| 37 | + memory: &M, |
48 | 38 | range: Range<usize>, |
49 | | - ) -> Result<Vec<T>, AccessError> { |
| 39 | + ) -> Result<Vec<T>, MemoryDecodeError<M::AccessError, T::DecodeError>> { |
50 | 40 | let element_count = range.end - range.start; |
51 | 41 | let mut result = Vec::with_capacity(element_count); |
52 | 42 |
|
53 | | - unsafe { |
54 | | - let buffer = slice::from_raw_parts_mut( |
55 | | - result.as_mut_ptr() as *mut u8, |
56 | | - element_count * mem::size_of::<T>(), |
57 | | - ); |
58 | | - let offset = self.start_address() + (range.start * mem::size_of::<T>()) as u64; |
59 | | - |
60 | | - memory |
61 | | - .read_memory(offset, buffer) |
62 | | - .map_err(|err| AccessError { |
63 | | - source: err, |
64 | | - offset, |
65 | | - size: buffer.len(), |
66 | | - mode: AccessMode::Read, |
67 | | - object: "[..]".into(), |
68 | | - member: Some(format!("[{:#?}]", range).into()), |
69 | | - })?; |
70 | | - |
71 | | - result.set_len(element_count); |
72 | | - }; |
| 43 | + for index in range { |
| 44 | + result.push(self.element_at(memory, index)?); |
| 45 | + } |
73 | 46 |
|
74 | 47 | Ok(result) |
75 | 48 | } |
76 | 49 | } |
77 | 50 |
|
78 | | -impl<T: ?Sized + Viewable<T>> dyn Array<T> { |
79 | | - pub fn element_reference(&self, memory: Arc<dyn MemoryView>, index: usize) -> Reference<T> { |
80 | | - let offset = (index * T::MEMORY_SIZE) as u64; |
| 51 | +impl<T: SizedViewable> dyn Array<T> { |
| 52 | + pub fn element_reference<M: MemoryView>(&self, memory: M, index: usize) -> Reference<T, M> { |
| 53 | + let offset = (index * T::memory_size()) as u64; |
81 | 54 | Reference::new(memory, self.start_address() + offset) |
82 | 55 | } |
83 | 56 |
|
84 | | - pub fn elements_reference( |
| 57 | + pub fn elements_reference<M: MemoryView + Clone>( |
85 | 58 | &self, |
86 | | - memory: Arc<dyn MemoryView>, |
| 59 | + memory: M, |
87 | 60 | range: Range<usize>, |
88 | | - ) -> Vec<Reference<T>> { |
| 61 | + ) -> Vec<Reference<T, M>> { |
89 | 62 | Vec::from_iter(range.map(|index| { |
90 | 63 | Reference::new( |
91 | 64 | memory.clone(), |
92 | | - self.start_address() + (index * T::MEMORY_SIZE) as u64, |
| 65 | + self.start_address() + (index * T::memory_size()) as u64, |
93 | 66 | ) |
94 | 67 | })) |
95 | 68 | } |
96 | | -} |
97 | 69 |
|
98 | | -impl<T: ?Sized + Viewable<T>> dyn Array<T> |
99 | | -where |
100 | | - T::Implementation<T::Memory>: marker::Copy, |
101 | | -{ |
102 | | - pub fn element_copy( |
| 70 | + pub fn element_copy<M: MemoryView>( |
103 | 71 | &self, |
104 | | - memory: &dyn MemoryView, |
| 72 | + memory: &M, |
105 | 73 | index: usize, |
106 | | - ) -> Result<Copy<T>, AccessError> { |
107 | | - let offset = (index * T::MEMORY_SIZE) as u64; |
108 | | - Copy::read_object(memory, self.start_address() + offset).map_err(|err| AccessError { |
109 | | - source: err, |
110 | | - offset: self.start_address() + offset, |
111 | | - size: T::MEMORY_SIZE, |
112 | | - mode: AccessMode::Read, |
113 | | - object: format!("[{}]", T::name()).into(), |
114 | | - member: Some(format!("[{}]", index).into()), |
115 | | - }) |
| 74 | + ) -> Result<Copy<T>, M::AccessError> { |
| 75 | + let offset = (index * T::memory_size()) as u64; |
| 76 | + Copy::read_from_memory(memory, self.start_address() + offset) |
116 | 77 | } |
117 | 78 |
|
118 | | - pub fn elements_copy( |
| 79 | + pub fn elements_copy<M: MemoryView>( |
119 | 80 | &self, |
120 | | - memory: &dyn MemoryView, |
| 81 | + memory: &M, |
121 | 82 | range: Range<usize>, |
122 | | - ) -> Result<Vec<Copy<T>>, AccessError> { |
| 83 | + ) -> Result<Vec<Copy<T>>, M::AccessError> { |
123 | 84 | let element_count = range.end - range.start; |
124 | 85 | let mut result = Vec::<T::Memory>::with_capacity(element_count); |
125 | 86 |
|
126 | 87 | unsafe { |
127 | 88 | let buffer = slice::from_raw_parts_mut( |
128 | 89 | result.as_mut_ptr() as *mut u8, |
129 | | - element_count * T::MEMORY_SIZE, |
| 90 | + element_count * T::memory_size(), |
130 | 91 | ); |
131 | | - let offset = self.start_address() + (range.start * T::MEMORY_SIZE) as u64; |
132 | | - |
133 | | - memory |
134 | | - .read_memory(offset, buffer) |
135 | | - .map_err(|err| AccessError { |
136 | | - source: err, |
137 | | - offset, |
138 | | - size: buffer.len(), |
139 | | - mode: AccessMode::Read, |
140 | | - object: "[..]".into(), |
141 | | - member: Some(format!("[{:#?}]", range).into()), |
142 | | - })?; |
143 | | - |
| 92 | + let offset = self.start_address() + (range.start * T::memory_size()) as u64; |
| 93 | + memory.read_memory(offset, buffer)?; |
144 | 94 | result.set_len(element_count); |
145 | 95 | }; |
146 | 96 |
|
147 | 97 | Ok(result.into_iter().map(Copy::<T>::new).collect::<Vec<_>>()) |
148 | 98 | } |
149 | 99 | } |
150 | 100 |
|
151 | | -pub trait SizedArray<T: ?Sized, const N: usize>: Array<T> {} |
| 101 | +pub trait SizedArray<T, const N: usize>: Array<T> {} |
152 | 102 |
|
153 | | -impl<T: ?Sized, const N: usize> dyn SizedArray<T, N> { |
| 103 | +impl<T, const N: usize> dyn SizedArray<T, N> { |
154 | 104 | pub fn len(&self) -> usize { |
155 | 105 | N |
156 | 106 | } |
|
0 commit comments