Skip to content

Commit

Permalink
Add ByteString::slice_ref (#470)
Browse files Browse the repository at this point in the history
  • Loading branch information
Wang, Chi committed Nov 7, 2022
1 parent 00654aa commit 363984a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
2 changes: 2 additions & 0 deletions bytestring/CHANGES.md
Expand Up @@ -2,7 +2,9 @@

## Unreleased - 2022-xx-xx
- Minimum supported Rust version (MSRV) is now 1.57.
- Add `ByteString::slice_ref` which can safely slice a `ByteString` into a new one with zero copy. [#470]

[#470]: https://github.com/actix/actix-net/pull/470

## 1.1.0 - 2022-06-11
- Implement `From<Box<str>>` for `ByteString`. [#458]
Expand Down
34 changes: 34 additions & 0 deletions bytestring/src/lib.rs
Expand Up @@ -50,6 +50,34 @@ impl ByteString {
pub const unsafe fn from_bytes_unchecked(src: Bytes) -> ByteString {
Self(src)
}

/// Returns a slice of self that is equivalent to the given `subset`. Corresponds to [`Bytes::slice_ref`].
///
/// When processing a `ByteString` buffer with other tools, one often gets a
/// `&str` which is in fact a slice of the `ByteString`, i.e. a subset of it.
/// This function turns that `&str` into another `ByteString`, as if one had
/// sliced the `ByteString` with the offsets that correspond to `subset`.
///
/// This operation is `O(1)`.
///
/// # Examples
///
/// ```
/// use bytestring::ByteString;
///
/// let string = ByteString::from_static(" foo ");
/// let subset = string.trim();
/// let substring = string.slice_ref(subset);
/// assert_eq!(substring, "foo");
/// ```
///
/// # Panics
///
/// Requires that the given `subset` str is in fact contained within the
/// `ByteString` buffer; otherwise this function will panic.
pub fn slice_ref(&self, subset: &str) -> Self {
Self(self.0.slice_ref(subset.as_bytes()))
}
}

impl PartialEq<str> for ByteString {
Expand Down Expand Up @@ -349,4 +377,10 @@ mod test {
let s = serde_json::to_string(&ByteString::from_static("nice bytes")).unwrap();
assert_eq!(s, r#""nice bytes""#);
}

#[test]
#[should_panic]
fn test_slice_ref_catches_not_a_subset() {
ByteString::from_static("foo bar").slice_ref("foo");
}
}

0 comments on commit 363984a

Please sign in to comment.