pub trait SliceExt {
type Elem;
// Required methods
fn contains_slice(&self, other: &Self) -> bool;
fn is_slice(&self, other: &Self) -> bool;
fn offset_of_slice(&self, other: &Self) -> usize;
fn get_offset_of_slice(&self, other: &Self) -> Option<usize>;
fn index_of(&self, other: *const Self::Elem) -> usize;
fn get_index_of(&self, other: *const Self::Elem) -> Option<usize>;
fn slice_lossy<SB>(&self, range: Range<usize>, bias: SB) -> &Self
where SB: Into<SliceBias>;
fn slice_lossy_mut<SB>(
&mut self,
range: Range<usize>,
bias: SB,
) -> &mut Self
where SB: Into<SliceBias>;
}
Expand description
Extension trait for [T]
and str
.
Required Associated Types§
Required Methods§
Sourcefn contains_slice(&self, other: &Self) -> bool
fn contains_slice(&self, other: &Self) -> bool
Checks whether self fully contains the other
slice in memory.
If other
is a zero-length slice it is not contained inside self
.
§Example
§Called on slices
use core_extensions::SliceExt;
let list = vec![0, 1, 2, 3, 4, 5];
let another = [6, 7, 8];
assert!(list.contains_slice(&list[..1]));
assert!(list.contains_slice(&list[3..]));
// Empty slices aren't considered contained by any other slice
assert!(!list.contains_slice(&list[..0]));
assert!(!list.contains_slice(&another[..0]));
assert!(!list.contains_slice(&another));
§Called on str
s
use core_extensions::SliceExt;
let string = "foo bar baz";
let another = String::from(string);
let foo = &string[..3];
let bar = &string[4..7];
let baz = &string[8..11];
assert!(string.contains_slice(foo));
assert!(string.contains_slice(bar));
assert!(string.contains_slice(baz));
// Empty slices aren't considered contained by any other slice
assert!(!string.contains_slice(&string[..0]));
assert!(!string.contains_slice(&another));
Sourcefn is_slice(&self, other: &Self) -> bool
fn is_slice(&self, other: &Self) -> bool
Checks whether self
is exactly the other
slice in memory.
§Example
§Called on slices
use core_extensions::SliceExt;
let list = [0, 1, 2, 3, 4, 5];
let slice_0 = &list[..0];
let slice_1 = &list[..];
let other = [0, 1, 2, 3, 4, 5];
assert!( slice_0.is_slice(slice_0));
assert!( slice_0.is_slice(&list[..0]));
assert!(!slice_0.is_slice(slice_1));
assert!(!slice_0.is_slice(&[]));
assert!(!list.is_slice(&other));
§Called on str
s
use core_extensions::SliceExt;
let string = "foo bar baz";
let another = String::from(string);
let foo = &string[..3];
let bar = &string[4..7];
let baz = &string[8..11];
assert!(!string.is_slice(foo));
assert!(!string.is_slice(bar));
assert!(!string.is_slice(baz));
assert!(string.is_slice(string));
assert!(string[..0].is_slice(&string[..0]));
assert!(!string.is_slice(&another));
Sourcefn offset_of_slice(&self, other: &Self) -> usize
fn offset_of_slice(&self, other: &Self) -> usize
Returns the index at which other
starts.
If other
is not inside self
, this returns self.len()
§Example
§Called on slices
use core_extensions::SliceExt;
let list = vec![0, 1, 2, 3, 4, 5];
let other = [0, 1, 2, 3];
assert_eq!(list.offset_of_slice(&list[..0]), 0);
assert_eq!(list.offset_of_slice(&list[3..]), 3);
assert_eq!(list.offset_of_slice(&list[5..]), 5);
assert_eq!(list.offset_of_slice(&list[6..]), list.len());
assert_eq!(list.offset_of_slice(&[]), list.len());
assert_eq!(list.offset_of_slice(&other), list.len());
§Called on str
s
use core_extensions::SliceExt;
let string = "foo bar baz";
let another = String::from(string);
let foo = &string[..3];
let bar = &string[4..7];
let baz = &string[8..11];
assert_eq!(string.offset_of_slice(string), 0);
assert_eq!(string.offset_of_slice(&string[..0]), 0);
assert_eq!(string.offset_of_slice(foo), 0);
assert_eq!(string.offset_of_slice(bar), 4);
assert_eq!(string.offset_of_slice(baz), 8);
assert_eq!(string.offset_of_slice(&string[11..]), 11);
assert_eq!(string.offset_of_slice(&another), string.len());
Sourcefn get_offset_of_slice(&self, other: &Self) -> Option<usize>
fn get_offset_of_slice(&self, other: &Self) -> Option<usize>
Returns the index at which other
starts.
If other
is a zero-length slice, or is not inside self
, this returns None
.
§Example
§Called on slices
use core_extensions::SliceExt;
let list = [0, 1, 2, 3, 4, 5];
let other = [0, 1, 2, 3];
assert_eq!(list.get_offset_of_slice(&list[..0]), None);
assert_eq!(list.get_offset_of_slice(&list[1..]), Some(1));
assert_eq!(list.get_offset_of_slice(&list[3..]), Some(3));
assert_eq!(list.get_offset_of_slice(&list[5..]), Some(5));
assert_eq!(list.get_offset_of_slice(&list[6..]), None);
assert_eq!(list.get_offset_of_slice(&other), None);
§Called on str
s
use core_extensions::SliceExt;
let string = "foo bar baz";
let another = String::from(string);
let foo = &string[..3];
let bar = &string[4..7];
let baz = &string[8..11];
assert_eq!(string.get_offset_of_slice(&string[..0]), None);
assert_eq!(string.get_offset_of_slice(string), Some(0));
assert_eq!(string.get_offset_of_slice(foo), Some(0));
assert_eq!(string.get_offset_of_slice(bar), Some(4));
assert_eq!(string.get_offset_of_slice(baz), Some(8));
assert_eq!(string.get_offset_of_slice(&string[11..]), None);
assert_eq!(string.get_offset_of_slice(&another), None);
Sourcefn index_of(&self, other: *const Self::Elem) -> usize
fn index_of(&self, other: *const Self::Elem) -> usize
Returns the index of other
if it’s stored in the slice (if it points within the slice).
If other
is not inside self
, this returns self.len()
.
§Example
§Called on slices
use core_extensions::SliceExt;
let list = vec![0, 1, 2, 3, 4, 5];
let other = [0, 1, 2, 3];
assert_eq!(list.index_of(&list[0]), 0);
assert_eq!(list.index_of(&list[3]), 3);
assert_eq!(list.index_of(&list[5]), 5);
assert_eq!(list.index_of(list.as_ptr().wrapping_offset(6)), 6);
assert_eq!(list.index_of(list.as_ptr().wrapping_offset(7)), 6);
assert_eq!(list.index_of(&0), list.len());
assert_eq!(list.index_of(&other[0]), list.len());
assert_eq!(list.index_of(&other[1]), list.len());
§Called on str
s
use core_extensions::SliceExt;
let string = String::from("abcdefgh");
let bytes = string.as_bytes();
let other = b"abcdefgh";
assert_eq!(string.index_of(&bytes[0]), 0);
assert_eq!(string.index_of(&bytes[3]), 3);
assert_eq!(string.index_of(&bytes[5]), 5);
assert_eq!(string.index_of(bytes.as_ptr().wrapping_offset(6)), 6);
assert_eq!(string.index_of(bytes.as_ptr().wrapping_offset(7)), 7);
assert_eq!(string.index_of(&0), string.len());
assert_eq!(string.index_of(&other[0]), string.len());
assert_eq!(string.index_of(&other[1]), string.len());
Sourcefn get_index_of(&self, other: *const Self::Elem) -> Option<usize>
fn get_index_of(&self, other: *const Self::Elem) -> Option<usize>
Returns the index of other
if it’s stored in the slice (if it points within the slice).
If other
is not inside self
, this returns None
.
§Example
§Called on slices
use core_extensions::SliceExt;
let list = vec![0, 1, 2, 3, 4, 5];
let other = [0, 1, 2, 3];
assert_eq!(list.get_index_of(&list[0]), Some(0));
assert_eq!(list.get_index_of(&list[3]), Some(3));
assert_eq!(list.get_index_of(&list[5]), Some(5));
assert_eq!(list.get_index_of(list.as_ptr().wrapping_offset(6)), None);
assert_eq!(list.get_index_of(list.as_ptr().wrapping_offset(7)), None);
assert_eq!(list.get_index_of(&0), None);
assert_eq!(list.get_index_of(&other[0]), None);
assert_eq!(list.get_index_of(&other[1]), None);
§Called on str
s
use core_extensions::SliceExt;
let string = String::from("abcdefgh");
let bytes = string.as_bytes();
let other = b"abcdefgh";
assert_eq!(string.get_index_of(&bytes[0]), Some(0));
assert_eq!(string.get_index_of(&bytes[3]), Some(3));
assert_eq!(string.get_index_of(&bytes[5]), Some(5));
assert_eq!(string.get_index_of(bytes.as_ptr().wrapping_offset(6)), Some(6));
assert_eq!(string.get_index_of(bytes.as_ptr().wrapping_offset(7)), Some(7));
assert_eq!(string.get_index_of(&0), None);
assert_eq!(string.get_index_of(&other[0]), None);
assert_eq!(string.get_index_of(&other[1]), None);
Sourcefn slice_lossy<SB>(&self, range: Range<usize>, bias: SB) -> &Self
fn slice_lossy<SB>(&self, range: Range<usize>, bias: SB) -> &Self
Used for non-panicking slicing.
If range.end
is less than range.start
, this returns an empty slice.
§bias
parameter
The bias
parameter, by being converted into a SliceBias
,
determines how this method handles invalid ranges.
The impl for [T]
ignores this parameter, saturating ranges at self.len()
.
For str
, it grows the range in the directions determined by bias
parameter.
§Examples
§[T]
slice
use core_extensions::SliceExt;
let arr = [1, 2, 3, 4, 5, 6];
assert_eq!(arr.slice_lossy(0..3, ()), &arr[..3]);
assert_eq!(arr.slice_lossy(3..1000, ()), &arr[3..]);
assert_eq!(arr.slice_lossy(1000..1000, ()), &[]);
assert_eq!(arr.slice_lossy(1000..0, ()), &[]);
§str
slice
use core_extensions::SliceExt;
use core_extensions::slices::SliceBias;
let word = "niño"; // 'ñ' is 2 bytes long , spanning the range 2..4
assert_eq!(word.slice_lossy(0..3, SliceBias::LEFT ), "ni");
assert_eq!(word.slice_lossy(0..3, SliceBias::RIGHT), "niñ");
assert_eq!(word.slice_lossy(0..3, SliceBias::IN ), "ni");
assert_eq!(word.slice_lossy(0..3, SliceBias::OUT), "niñ");
assert_eq!(word.slice_lossy(3..10000, ()), "ño");
assert_eq!(word.slice_lossy(3..10000, SliceBias::OUT), "ño");
assert_eq!(word.slice_lossy(1000..1000, ()), "");
assert_eq!(word.slice_lossy(1000..1000, SliceBias::OUT), "");
assert_eq!(word.slice_lossy(1000..0, SliceBias::OUT), "");
Sourcefn slice_lossy_mut<SB>(&mut self, range: Range<usize>, bias: SB) -> &mut Self
fn slice_lossy_mut<SB>(&mut self, range: Range<usize>, bias: SB) -> &mut Self
Used for non-panicking mutable slicing.
Identical behavior to slice_lossy
with respect to ranges.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.