D11388: rust: Generalize the `trim_end_newlines` utility of byte strings
SimonSapin
phabricator at mercurial-scm.org
Fri Sep 3 14:38:22 UTC 2021
SimonSapin created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.
REVISION SUMMARY
⦠into `trim_end_matches` that takes a callack.
Also add `trim_start_matches`.
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D11388
AFFECTED FILES
rust/hg-core/src/repo.rs
rust/hg-core/src/utils.rs
CHANGE DETAILS
diff --git a/rust/hg-core/src/utils.rs b/rust/hg-core/src/utils.rs
--- a/rust/hg-core/src/utils.rs
+++ b/rust/hg-core/src/utils.rs
@@ -67,36 +67,34 @@
}
pub trait SliceExt {
- fn trim_end_newlines(&self) -> &Self;
fn trim_end(&self) -> &Self;
fn trim_start(&self) -> &Self;
+ fn trim_end_matches(&self, f: impl FnMut(u8) -> bool) -> &Self;
+ fn trim_start_matches(&self, f: impl FnMut(u8) -> bool) -> &Self;
fn trim(&self) -> &Self;
fn drop_prefix(&self, needle: &Self) -> Option<&Self>;
fn split_2(&self, separator: u8) -> Option<(&[u8], &[u8])>;
}
-#[allow(clippy::trivially_copy_pass_by_ref)]
-fn is_not_whitespace(c: &u8) -> bool {
- !(*c as char).is_whitespace()
-}
+impl SliceExt for [u8] {
+ fn trim_end(&self) -> &[u8] {
+ self.trim_end_matches(|byte| byte.is_ascii_whitespace())
+ }
-impl SliceExt for [u8] {
- fn trim_end_newlines(&self) -> &[u8] {
- if let Some(last) = self.iter().rposition(|&byte| byte != b'\n') {
+ fn trim_start(&self) -> &[u8] {
+ self.trim_start_matches(|byte| byte.is_ascii_whitespace())
+ }
+
+ fn trim_end_matches(&self, mut f: impl FnMut(u8) -> bool) -> &Self {
+ if let Some(last) = self.iter().rposition(|&byte| !f(byte)) {
&self[..=last]
} else {
&[]
}
}
- fn trim_end(&self) -> &[u8] {
- if let Some(last) = self.iter().rposition(is_not_whitespace) {
- &self[..=last]
- } else {
- &[]
- }
- }
- fn trim_start(&self) -> &[u8] {
- if let Some(first) = self.iter().position(is_not_whitespace) {
+
+ fn trim_start_matches(&self, mut f: impl FnMut(u8) -> bool) -> &Self {
+ if let Some(first) = self.iter().position(|&byte| !f(byte)) {
&self[first..]
} else {
&[]
diff --git a/rust/hg-core/src/repo.rs b/rust/hg-core/src/repo.rs
--- a/rust/hg-core/src/repo.rs
+++ b/rust/hg-core/src/repo.rs
@@ -127,7 +127,8 @@
} else {
let bytes = hg_vfs.read("sharedpath")?;
let mut shared_path =
- get_path_from_bytes(bytes.trim_end_newlines()).to_owned();
+ get_path_from_bytes(bytes.trim_end_matches(|b| b == b'\n'))
+ .to_owned();
if relative {
shared_path = dot_hg.join(shared_path)
}
To: SimonSapin, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
More information about the Mercurial-devel
mailing list