(shape: ArrayShape, slice: Slice)
| 75 | |
| 76 | #[doc(hidden)] |
| 77 | pub fn get_clean_slice(shape: ArrayShape, slice: Slice) -> Result<Slice> { |
| 78 | let mut num_ellipsis = 0; |
| 79 | for x in &slice { |
| 80 | if *x == SliceElement::Ellipsis { |
| 81 | num_ellipsis += 1; |
| 82 | } |
| 83 | } |
| 84 | if num_ellipsis > 1 { |
| 85 | return Err(runtime_error!("Multiple Ellipsis in the slice")); |
| 86 | } |
| 87 | let mut clean_slice = vec![]; |
| 88 | for x in &slice { |
| 89 | if *x == SliceElement::Ellipsis { |
| 90 | let padding = shape.len() as i64 - slice.len() as i64 + 1; |
| 91 | if padding < 0 { |
| 92 | return Err(runtime_error!( |
| 93 | "Ellipsis corresponds to a negative number of entries" |
| 94 | )); |
| 95 | } |
| 96 | clean_slice |
| 97 | .extend(repeat(SliceElement::SubArray(None, None, None)).take(padding as usize)); |
| 98 | } else { |
| 99 | clean_slice.push(x.clone()); |
| 100 | } |
| 101 | } |
| 102 | if clean_slice.len() > shape.len() { |
| 103 | return Err(runtime_error!("Slice is too long")); |
| 104 | } |
| 105 | Ok(clean_slice) |
| 106 | } |
| 107 | |
| 108 | fn normalize_subarray(dimension: u64, slice_element: SliceElement) -> Result<(i64, i64, i64)> { |
| 109 | if let SliceElement::SubArray(begin, end, step) = slice_element { |
no test coverage detected