Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'lib/smol_str/src/lib.rs')
-rw-r--r--lib/smol_str/src/lib.rs42
1 files changed, 23 insertions, 19 deletions
diff --git a/lib/smol_str/src/lib.rs b/lib/smol_str/src/lib.rs
index bdd228b89a..60fc81e227 100644
--- a/lib/smol_str/src/lib.rs
+++ b/lib/smol_str/src/lib.rs
@@ -136,6 +136,27 @@ impl SmolStr {
_ => false,
}
}
+
+ fn from_char_iter<I: iter::Iterator<Item = char>>(mut iter: I) -> SmolStr {
+ let mut len = 0;
+ let mut buf = [0u8; INLINE_CAP];
+ while let Some(ch) = iter.next() {
+ let size = ch.len_utf8();
+ if size + len > INLINE_CAP {
+ let mut heap = String::with_capacity(size + len);
+ heap.push_str(std::str::from_utf8(&buf[..len]).unwrap());
+ heap.push(ch);
+ heap.extend(iter);
+ return SmolStr(Repr::Heap(heap.into_boxed_str().into()));
+ }
+ ch.encode_utf8(&mut buf[len..]);
+ len += size;
+ }
+ SmolStr(Repr::Inline {
+ len: len as u8,
+ buf,
+ })
+ }
}
impl Default for SmolStr {
@@ -240,25 +261,8 @@ impl fmt::Display for SmolStr {
impl iter::FromIterator<char> for SmolStr {
fn from_iter<I: iter::IntoIterator<Item = char>>(iter: I) -> SmolStr {
- let mut len = 0;
- let mut buf = [0u8; INLINE_CAP];
- let mut iter = iter.into_iter();
- while let Some(ch) = iter.next() {
- let size = ch.len_utf8();
- if size + len > INLINE_CAP {
- let mut heap = String::with_capacity(size + len);
- heap.push_str(std::str::from_utf8(&buf[..len]).unwrap());
- heap.push(ch);
- heap.extend(iter);
- return SmolStr(Repr::Heap(heap.into_boxed_str().into()));
- }
- ch.encode_utf8(&mut buf[len..]);
- len += size;
- }
- SmolStr(Repr::Inline {
- len: len as u8,
- buf,
- })
+ let iter = iter.into_iter();
+ Self::from_char_iter(iter)
}
}