Skip to content

Commit e047318

Browse files
tormolThomas Bahn
authored andcommitted
Implement more AsRef<AsciiStr> and genericize Extend and IntoIterator
* Implement identity AsRef and AsMut for AsciiStr. * Implement AsRe<AsciiStr> for AsciiChar. * implement Extend and IntoIterator<AsciiString> for any iterable with Item=AsRef<AsciiChar>.
1 parent 0ad4303 commit e047318

File tree

3 files changed

+28
-52
lines changed

3 files changed

+28
-52
lines changed

src/ascii_str.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use core::fmt;
44
use core::ops::{Index, IndexMut};
55
use core::ops::{Range, RangeTo, RangeFrom, RangeFull, RangeInclusive, RangeToInclusive};
6-
use core::slice::{Iter, IterMut};
6+
use core::slice::{self, Iter, IterMut};
77
#[cfg(feature = "std")]
88
use std::error::Error;
99
#[cfg(feature = "std")]
@@ -355,6 +355,18 @@ impl From<Box<[AsciiChar]>> for Box<AsciiStr> {
355355
}
356356
}
357357

358+
impl AsRef<AsciiStr> for AsciiStr {
359+
#[inline]
360+
fn as_ref(&self) -> &AsciiStr {
361+
self
362+
}
363+
}
364+
impl AsMut<AsciiStr> for AsciiStr {
365+
#[inline]
366+
fn as_mut(&mut self) -> &mut AsciiStr {
367+
self
368+
}
369+
}
358370
impl AsRef<AsciiStr> for [AsciiChar] {
359371
#[inline]
360372
fn as_ref(&self) -> &AsciiStr {
@@ -408,6 +420,13 @@ widen_box! {[AsciiChar]}
408420
widen_box! {[u8]}
409421
widen_box! {str}
410422

423+
// allows &AsciiChar to be used by generic AsciiString Extend and FromIterator
424+
impl AsRef<AsciiStr> for AsciiChar {
425+
fn as_ref(&self) -> &AsciiStr {
426+
slice::from_ref(self).into()
427+
}
428+
}
429+
411430
impl fmt::Display for AsciiStr {
412431
#[inline]
413432
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {

src/ascii_string.rs

Lines changed: 6 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -566,65 +566,21 @@ impl fmt::Write for AsciiString {
566566
}
567567
}
568568

569-
impl FromIterator<AsciiChar> for AsciiString {
570-
fn from_iter<I: IntoIterator<Item = AsciiChar>>(iter: I) -> AsciiString {
569+
impl<A: AsRef<AsciiStr>> FromIterator<A> for AsciiString {
570+
fn from_iter<I: IntoIterator<Item = A>>(iter: I) -> AsciiString {
571571
let mut buf = AsciiString::new();
572572
buf.extend(iter);
573573
buf
574574
}
575575
}
576576

577-
impl<'a> FromIterator<&'a AsciiStr> for AsciiString {
578-
fn from_iter<I: IntoIterator<Item = &'a AsciiStr>>(iter: I) -> AsciiString {
579-
let mut buf = AsciiString::new();
580-
buf.extend(iter);
581-
buf
582-
}
583-
}
584-
585-
impl<'a> FromIterator<Cow<'a, AsciiStr>> for AsciiString {
586-
fn from_iter<I: IntoIterator<Item = Cow<'a, AsciiStr>>>(iter: I) -> AsciiString {
587-
let mut buf = AsciiString::new();
588-
buf.extend(iter);
589-
buf
590-
}
591-
}
592-
593-
impl Extend<AsciiChar> for AsciiString {
594-
fn extend<I: IntoIterator<Item = AsciiChar>>(&mut self, iterable: I) {
595-
let iterator = iterable.into_iter();
596-
let (lower_bound, _) = iterator.size_hint();
597-
self.reserve(lower_bound);
598-
for ch in iterator {
599-
self.push(ch)
600-
}
601-
}
602-
}
603-
604-
impl<'a> Extend<&'a AsciiChar> for AsciiString {
605-
fn extend<I: IntoIterator<Item = &'a AsciiChar>>(&mut self, iter: I) {
606-
self.extend(iter.into_iter().cloned())
607-
}
608-
}
609-
610-
impl<'a> Extend<&'a AsciiStr> for AsciiString {
611-
fn extend<I: IntoIterator<Item = &'a AsciiStr>>(&mut self, iterable: I) {
612-
let iterator = iterable.into_iter();
613-
let (lower_bound, _) = iterator.size_hint();
614-
self.reserve(lower_bound);
615-
for s in iterator {
616-
self.push_str(s)
617-
}
618-
}
619-
}
620-
621-
impl<'a> Extend<Cow<'a, AsciiStr>> for AsciiString {
622-
fn extend<I: IntoIterator<Item = Cow<'a,AsciiStr>>>(&mut self, iterable: I) {
577+
impl<A: AsRef<AsciiStr>> Extend<A> for AsciiString {
578+
fn extend<I: IntoIterator<Item = A>>(&mut self, iterable: I) {
623579
let iterator = iterable.into_iter();
624580
let (lower_bound, _) = iterator.size_hint();
625581
self.reserve(lower_bound);
626-
for s in iterator {
627-
self.push_str(&*s);
582+
for item in iterator {
583+
self.push_str(item.as_ref())
628584
}
629585
}
630586
}

tests.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,5 +137,6 @@ fn extend_from_iterator() {
137137
}
138138
});
139139
s.extend(cows);
140-
assert_eq!(s, "abcabconetwothreeASCIIASCIIASCII");
140+
s.extend(&[AsciiChar::LineFeed]);
141+
assert_eq!(s, "abcabconetwothreeASCIIASCIIASCII\n");
141142
}

0 commit comments

Comments
 (0)