From 2d01cffbf95190ff84944f00742a03ec35d240fd Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Sat, 25 Jul 2020 04:35:42 +0900 Subject: [PATCH] common::str::get_chars with test --- common/src/lib.rs | 1 + common/src/str.rs | 30 ++++++++++++++++++++++++++++++ vm/src/obj/objstr.rs | 11 +---------- 3 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 common/src/str.rs diff --git a/common/src/lib.rs b/common/src/lib.rs index f6d704744..7519f9d94 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -4,3 +4,4 @@ pub mod cell; pub mod float_ops; pub mod hash; pub mod rc; +pub mod str; diff --git a/common/src/str.rs b/common/src/str.rs new file mode 100644 index 000000000..7dbc870a3 --- /dev/null +++ b/common/src/str.rs @@ -0,0 +1,30 @@ +pub fn get_chars(s: &str, range: std::ops::Range) -> &str { + let mut chars = s.chars(); + for _ in 0..range.start { + let _ = chars.next(); + } + let start = chars.as_str(); + for _ in range { + let _ = chars.next(); + } + let end = chars.as_str(); + &start[..start.len() - end.len()] +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_chars() { + let s = "0123456789"; + assert_eq!(get_chars(s, 3..7), "3456"); + assert_eq!(get_chars(s, 3..7), &s[3..7]); + + let s = "0유니코드 문자열9"; + assert_eq!(get_chars(s, 3..7), "코드 문"); + + let s = "0😀😃😄😁😆😅😂🤣9"; + assert_eq!(get_chars(s, 3..7), "😄😁😆😅"); + } +} diff --git a/vm/src/obj/objstr.rs b/vm/src/obj/objstr.rs index dd905416c..357da1bf6 100644 --- a/vm/src/obj/objstr.rs +++ b/vm/src/obj/objstr.rs @@ -1406,16 +1406,7 @@ impl<'s> PyCommonString<'s, char> for str { } fn get_chars<'a>(&'a self, range: std::ops::Range) -> &'a Self { - let mut chars = self.chars(); - for _ in 0..range.start { - let _ = chars.next(); - } - let start = chars.as_str(); - for _ in range { - let _ = chars.next(); - } - let end = chars.as_str(); - &start[..start.len() - end.len()] + rustpython_common::str::get_chars(self, range) } fn is_empty(&self) -> bool {