Skip to content

Commit 2370a0f

Browse files
slice: utility 'enforce_embedding' (2) (#788)
Summary: Pull Request resolved: #788 i messed this up in D79751839. as the name `enforce` suggests, i was intending to provide a fluent-api for this function, fixed by this diff. now you can say e.g. `view.enforce_embedded(&base)?.len()` for example for "on-the-fly" enforcement (à la https://erdani.org/publications/cuj-06-2003.php.html). ghstack-source-id: 301394706 exported-using-ghexport Reviewed By: pzhan9 Differential Revision: D79805718 fbshipit-source-id: 7bcc5c900882db0fe860a6afb6b683dd9b811c73
1 parent 0901071 commit 2370a0f

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

ndslice/src/slice.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -655,15 +655,30 @@ impl Slice {
655655
})
656656
}
657657

658-
/// Ensures that every storage offset used by `other` is valid in
659-
/// `self`.
658+
/// Ensures that every storage offset used by `self` is valid in
659+
/// `other`.
660660
///
661-
/// That is, for all p ∈ other:
662-
/// `self.coordinates(other.location(p))` is defined.
663-
pub fn enforce_embedding(&self, other: &Slice) -> Result<(), SliceError> {
664-
other
665-
.iter()
666-
.try_for_each(|loc| self.coordinates(loc).map(|_| ()))
661+
/// That is, for all p ∈ self:
662+
/// `other.coordinates(self.location(p))` is defined.
663+
///
664+
/// Returns `self` on success, enabling fluent chaining.
665+
///
666+
/// # Examples
667+
///
668+
/// ```
669+
/// use ndslice::Slice;
670+
///
671+
/// let base = Slice::new(0, vec![4, 4], vec![4, 1]).unwrap();
672+
/// let view = base.subview(&[1, 1], &[2, 2]).unwrap();
673+
/// assert_eq!(view.enforce_embedding(&base).unwrap().len(), 4);
674+
///
675+
/// let small = Slice::new(0, vec![2, 2], vec![2, 1]).unwrap();
676+
/// assert!(view.enforce_embedding(&small).is_err());
677+
/// ```
678+
pub fn enforce_embedding<'a>(&'a self, other: &'_ Slice) -> Result<&'a Slice, SliceError> {
679+
self.iter()
680+
.try_for_each(|loc| other.coordinates(loc).map(|_| ()))?;
681+
Ok(self)
667682
}
668683
}
669684

@@ -1092,14 +1107,14 @@ mod tests {
10921107
let base = Slice::new(0, vec![4, 4], vec![4, 1]).unwrap(); // 4×4 matrix, row-major
10931108
let view = Slice::new(5, vec![2, 2], vec![4, 1]).unwrap(); // a 2×2 submatrix starting at (1,1)
10941109

1095-
assert!(base.enforce_embedding(&view).is_ok());
1110+
assert!(view.enforce_embedding(&base).is_ok());
10961111
}
10971112

10981113
#[test]
10991114
fn embedding_fails_for_out_of_bounds_view() {
11001115
let base = Slice::new(0, vec![4, 4], vec![4, 1]).unwrap(); // 4×4 matrix
11011116
let view = Slice::new(14, vec![2, 2], vec![4, 1]).unwrap(); // starts at (3,2), accesses (4,3)
11021117

1103-
assert!(base.enforce_embedding(&view).is_err());
1118+
assert!(view.enforce_embedding(&base).is_err());
11041119
}
11051120
}

0 commit comments

Comments
 (0)