152: Implement Vec::starts_with and Vec::ends_with r=korken89 a=dbrgn

Implementation mostly copied from `std`.

The logic should be covered by documentation tests, so no separate unit tests were added.

Co-authored-by: Danilo Bargen <mail@dbrgn.ch>
This commit is contained in:
bors[bot] 2020-05-03 06:56:57 +00:00 committed by GitHub
commit 75bcd7e496
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -366,6 +366,54 @@ where
pub(crate) fn is_full(&self) -> bool {
self.0.is_full()
}
/// Returns `true` if `needle` is a prefix of the Vec.
///
/// Always returns `true` if `needle` is an empty slice.
///
/// # Examples
///
/// ```
/// use heapless::Vec;
/// use heapless::consts::*;
///
/// let v: Vec<_, U8> = Vec::from_slice(b"abc").unwrap();
/// assert_eq!(v.starts_with(b""), true);
/// assert_eq!(v.starts_with(b"ab"), true);
/// assert_eq!(v.starts_with(b"bc"), false);
/// ```
#[inline]
pub fn starts_with(&self, needle: &[T]) -> bool
where
T: PartialEq,
{
let n = needle.len();
self.len() >= n && needle == &self[..n]
}
/// Returns `true` if `needle` is a suffix of the Vec.
///
/// Always returns `true` if `needle` is an empty slice.
///
/// # Examples
///
/// ```
/// use heapless::Vec;
/// use heapless::consts::*;
///
/// let v: Vec<_, U8> = Vec::from_slice(b"abc").unwrap();
/// assert_eq!(v.ends_with(b""), true);
/// assert_eq!(v.ends_with(b"ab"), false);
/// assert_eq!(v.ends_with(b"bc"), true);
/// ```
#[inline]
pub fn ends_with(&self, needle: &[T]) -> bool
where
T: PartialEq,
{
let (v, n) = (self.len(), needle.len());
v >= n && needle == &self[v - n..]
}
}
impl<T, N> Default for Vec<T, N>
@ -960,4 +1008,28 @@ mod tests {
// Slice too large
assert!(Vec::<u8, U2>::from_slice(&[1, 2, 3]).is_err());
}
#[test]
fn starts_with() {
let v: Vec<_, U8> = Vec::from_slice(b"ab").unwrap();
assert!(v.starts_with(&[]));
assert!(v.starts_with(b""));
assert!(v.starts_with(b"a"));
assert!(v.starts_with(b"ab"));
assert!(!v.starts_with(b"abc"));
assert!(!v.starts_with(b"ba"));
assert!(!v.starts_with(b"b"));
}
#[test]
fn ends_with() {
let v: Vec<_, U8> = Vec::from_slice(b"ab").unwrap();
assert!(v.ends_with(&[]));
assert!(v.ends_with(b""));
assert!(v.ends_with(b"b"));
assert!(v.ends_with(b"ab"));
assert!(!v.ends_with(b"abc"));
assert!(!v.ends_with(b"ba"));
assert!(!v.ends_with(b"a"));
}
}