@@ -88,6 +88,36 @@ impl<T> VecLike<T> for Vec<T> {
88
88
}
89
89
}
90
90
91
+ /// Trait to be implemented by a collection that can be extended from a slice
92
+ ///
93
+ /// ## Example
94
+ ///
95
+ /// ```rust
96
+ /// use smallvec::{ExtendFromSlice, SmallVec8};
97
+ ///
98
+ /// fn initialize<V: ExtendFromSlice<u8>>(v: &mut V) {
99
+ /// v.extend_from_slice(b"Test!");
100
+ /// }
101
+ ///
102
+ /// let mut vec = Vec::new();
103
+ /// initialize(&mut vec);
104
+ /// assert_eq!(&vec, b"Test!");
105
+ ///
106
+ /// let mut small_vec = SmallVec8::new();
107
+ /// initialize(&mut small_vec);
108
+ /// assert_eq!(&small_vec as &[_], b"Test!");
109
+ /// ```
110
+ pub trait ExtendFromSlice < T > : VecLike < T > {
111
+ /// Extends a collection from a slice of its element type
112
+ fn extend_from_slice ( & mut self , other : & [ T ] ) ;
113
+ }
114
+
115
+ impl < T : Clone > ExtendFromSlice < T > for Vec < T > {
116
+ fn extend_from_slice ( & mut self , other : & [ T ] ) {
117
+ Vec :: extend_from_slice ( self , other)
118
+ }
119
+ }
120
+
91
121
unsafe fn deallocate < T > ( ptr : * mut T , capacity : usize ) {
92
122
let _vec: Vec < T > = Vec :: from_raw_parts ( ptr, 0 , capacity) ;
93
123
// Let it drop.
@@ -686,6 +716,11 @@ impl_index!(ops::RangeFrom<usize>, [A::Item]);
686
716
impl_index ! ( ops:: RangeTo <usize >, [ A :: Item ] ) ;
687
717
impl_index ! ( ops:: RangeFull , [ A :: Item ] ) ;
688
718
719
+ impl < A : Array > ExtendFromSlice < A :: Item > for SmallVec < A > where A :: Item : Copy {
720
+ fn extend_from_slice ( & mut self , other : & [ A :: Item ] ) {
721
+ SmallVec :: extend_from_slice ( self , other)
722
+ }
723
+ }
689
724
690
725
impl < A : Array > VecLike < A :: Item > for SmallVec < A > {
691
726
#[ inline]
0 commit comments