1extern crate alloc;
2#[allow(unused_imports)]
4use alloc::{boxed::Box, string::String};
5
6use crate::{Char, OwnedChar};
7
8impl<'a> Extend<&'a Char> for String {
9 fn extend<T: IntoIterator<Item = &'a Char>>(&mut self, iter: T) {
10 let iterator = iter.into_iter();
11 let (lower_bound, _) = iterator.size_hint();
12 self.reserve(lower_bound);
13 iterator.for_each(move |c| self.push_str(c.as_str()));
14 }
15}
16
17impl<'a> Extend<&'a mut Char> for String {
18 fn extend<T: IntoIterator<Item = &'a mut Char>>(&mut self, iter: T) {
19 self.extend(iter.into_iter().map(|x| &*x));
20 }
21}
22
23impl Extend<OwnedChar> for String {
24 fn extend<T: IntoIterator<Item = OwnedChar>>(&mut self, iter: T) {
25 let iterator = iter.into_iter();
26 let (lower_bound, _) = iterator.size_hint();
27 self.reserve(lower_bound);
28 iterator.for_each(move |c| self.push_str(c.as_str()));
29 }
30}
31
32impl<'a> Extend<&'a OwnedChar> for String {
33 fn extend<T: IntoIterator<Item = &'a OwnedChar>>(&mut self, iter: T) {
34 self.extend(iter.into_iter().map(AsRef::as_ref));
35 }
36}
37
38impl<'a> Extend<&'a mut OwnedChar> for String {
39 fn extend<T: IntoIterator<Item = &'a mut OwnedChar>>(&mut self, iter: T) {
40 let iterator = iter.into_iter();
41 let (lower_bound, _) = iterator.size_hint();
42 self.reserve(lower_bound);
43 iterator.for_each(move |c| self.push_str(c.as_str()));
44 }
45}
46
47impl<'a> FromIterator<&'a Char> for String {
48 #[inline]
49 fn from_iter<T: IntoIterator<Item = &'a Char>>(iter: T) -> Self {
50 let mut s = Self::new();
51 s.extend(iter);
52 s
53 }
54}
55
56impl<'a> FromIterator<&'a mut Char> for String {
57 #[inline]
58 fn from_iter<T: IntoIterator<Item = &'a mut Char>>(iter: T) -> Self {
59 let mut s = Self::new();
60 s.extend(iter);
61 s
62 }
63}
64
65impl FromIterator<OwnedChar> for String {
66 #[inline]
67 fn from_iter<T: IntoIterator<Item = OwnedChar>>(iter: T) -> Self {
68 let mut s = Self::new();
69 s.extend(iter);
70 s
71 }
72}
73
74impl<'a> FromIterator<&'a OwnedChar> for String {
75 #[inline]
76 fn from_iter<T: IntoIterator<Item = &'a OwnedChar>>(iter: T) -> Self {
77 let mut s = Self::new();
78 s.extend(iter);
79 s
80 }
81}
82
83impl<'a> FromIterator<&'a mut OwnedChar> for String {
84 #[inline]
85 fn from_iter<T: IntoIterator<Item = &'a mut OwnedChar>>(iter: T) -> Self {
86 let mut s = Self::new();
87 s.extend(iter);
88 s
89 }
90}
91
92impl<'a> FromIterator<&'a Char> for Box<str> {
93 #[inline]
94 fn from_iter<T: IntoIterator<Item = &'a Char>>(iter: T) -> Self {
95 String::from_iter(iter).into_boxed_str()
96 }
97}
98
99impl<'a> FromIterator<&'a mut Char> for Box<str> {
100 #[inline]
101 fn from_iter<T: IntoIterator<Item = &'a mut Char>>(iter: T) -> Self {
102 String::from_iter(iter).into_boxed_str()
103 }
104}
105
106impl FromIterator<OwnedChar> for Box<str> {
107 #[inline]
108 fn from_iter<T: IntoIterator<Item = OwnedChar>>(iter: T) -> Self {
109 String::from_iter(iter).into_boxed_str()
110 }
111}
112
113impl<'a> FromIterator<&'a OwnedChar> for Box<str> {
114 #[inline]
115 fn from_iter<T: IntoIterator<Item = &'a OwnedChar>>(iter: T) -> Self {
116 String::from_iter(iter).into_boxed_str()
117 }
118}
119
120impl<'a> FromIterator<&'a mut OwnedChar> for Box<str> {
121 #[inline]
122 fn from_iter<T: IntoIterator<Item = &'a mut OwnedChar>>(iter: T) -> Self {
123 String::from_iter(iter).into_boxed_str()
124 }
125}