@@ -88,6 +88,36 @@ impl<T> VecLike<T> for Vec<T> {
8888 }
8989}
9090
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+
91121unsafe fn deallocate < T > ( ptr : * mut T , capacity : usize ) {
92122 let _vec: Vec < T > = Vec :: from_raw_parts ( ptr, 0 , capacity) ;
93123 // Let it drop.
@@ -686,6 +716,11 @@ impl_index!(ops::RangeFrom<usize>, [A::Item]);
686716impl_index ! ( ops:: RangeTo <usize >, [ A :: Item ] ) ;
687717impl_index ! ( ops:: RangeFull , [ A :: Item ] ) ;
688718
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+ }
689724
690725impl < A : Array > VecLike < A :: Item > for SmallVec < A > {
691726 #[ inline]
0 commit comments