diff --git a/CHANGELOG.md b/CHANGELOG.md index 334ef75..89377f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog ## [Unreleased] +### Added +- Added `IntoWideIter` impl for `&String` ## [0.2.0] - 2022-10-20 ### Added diff --git a/src/lib.rs b/src/lib.rs index 75182ef..cd56268 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -84,6 +84,15 @@ impl<'a> IntoWideIter for &&'a str { } } +impl<'a> IntoWideIter for &'a String { + type Iter = std::str::EncodeUtf16<'a>; + + #[inline] + fn into_wide_iter(self) -> Self::Iter { + self.as_str().encode_utf16() + } +} + impl<'a> IntoWideIter for &'a [u16] { type Iter = std::iter::Copied>; @@ -110,3 +119,59 @@ impl<'a> IntoWideIter for &'a Vec { self.iter().copied() } } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn into_wide_iter_check() { + const DATA: &str = "test argument"; + let expected: Vec = DATA.encode_utf16().collect(); + + fn check(arg: impl IntoWideIter, expected: &[u16]) { + let arg: Vec = arg.into_wide_iter().collect(); + assert!(arg == expected); + } + + { + let data: &str = DATA; + check(data, &expected); + } + + { + let data: &&str = &DATA; + check(data, &expected); + } + + // TODO: Should IntoWideIter be implemented for String? + // It's always better to pass an &str or an &String, so users should be forced to do that? + // { + // let data: String = DATA.into(); + // check(data, &expected); + // } + + { + let data: String = DATA.into(); + let data: &String = &data; + check(data, &expected); + } + + { + let data: Vec = DATA.encode_utf16().collect(); + let data: &[u16] = &data; + check(data, &expected); + } + + { + let data: Vec = DATA.encode_utf16().collect(); + check(data, &expected); + } + + { + let data: Vec = DATA.encode_utf16().collect(); + let data: &Vec = &data; + check(data, &expected); + } + } +}