@@ -287,6 +287,8 @@ impl<A: Array> SmallVecData<A> {
287
287
SmallVecData { inline }
288
288
}
289
289
#[ inline]
290
+ unsafe fn into_inline ( self ) -> A { self . inline }
291
+ #[ inline]
290
292
unsafe fn heap ( & self ) -> ( * mut A :: Item , usize ) {
291
293
self . heap
292
294
}
@@ -327,6 +329,13 @@ impl<A: Array> SmallVecData<A> {
327
329
SmallVecData :: Inline ( ManuallyDrop :: new ( inline) )
328
330
}
329
331
#[ inline]
332
+ unsafe fn into_inline ( self ) -> A {
333
+ match self {
334
+ SmallVecData :: Inline ( a) => ManuallyDrop :: into_inner ( a) ,
335
+ _ => debug_unreachable ! ( ) ,
336
+ }
337
+ }
338
+ #[ inline]
330
339
unsafe fn heap ( & self ) -> ( * mut A :: Item , usize ) {
331
340
match * self {
332
341
SmallVecData :: Heap ( data) => data,
@@ -812,6 +821,19 @@ impl<A: Array> SmallVec<A> {
812
821
}
813
822
}
814
823
824
+ /// If the SmallVec has not spilled onto the heap, convert it into an `A`. Otherwise return `Err(Self)`.
825
+ pub fn into_inner ( mut self ) -> Result < A , Self > {
826
+ if self . spilled ( ) {
827
+ Err ( self )
828
+ } else {
829
+ unsafe {
830
+ let data = mem:: replace ( & mut self . data , SmallVecData :: from_inline ( mem:: uninitialized ( ) ) ) ;
831
+ mem:: forget ( self ) ;
832
+ Ok ( data. into_inline ( ) )
833
+ }
834
+ }
835
+ }
836
+
815
837
/// Retains only the elements specified by the predicate.
816
838
///
817
839
/// In other words, remove all elements `e` such that `f(&e)` returns `false`.
@@ -1945,6 +1967,15 @@ mod tests {
1945
1967
assert_eq ! ( vec. into_vec( ) , vec![ 0 , 1 , 2 ] ) ;
1946
1968
}
1947
1969
1970
+ #[ test]
1971
+ fn test_into_inner ( ) {
1972
+ let vec = SmallVec :: < [ u8 ; 2 ] > :: from_iter ( 0 ..2 ) ;
1973
+ assert_eq ! ( vec. into_inner( ) , Ok ( [ 0 , 1 ] ) ) ;
1974
+
1975
+ let vec = SmallVec :: < [ u8 ; 2 ] > :: from_iter ( 0 ..3 ) ;
1976
+ assert_eq ! ( vec. clone( ) . into_inner( ) , Err ( vec) ) ;
1977
+ }
1978
+
1948
1979
#[ test]
1949
1980
fn test_from_vec ( ) {
1950
1981
let vec = vec ! [ ] ;
0 commit comments