@@ -18,7 +18,7 @@ use alloc::heap::{EMPTY, allocate, reallocate, deallocate};
18
18
use core:: cmp:: max;
19
19
use core:: default:: Default ;
20
20
use core:: fmt;
21
- use core:: kinds:: marker:: InvariantType ;
21
+ use core:: kinds:: marker:: { ContravariantLifetime , InvariantType } ;
22
22
use core:: mem;
23
23
use core:: num;
24
24
use core:: ops;
@@ -1875,6 +1875,39 @@ pub fn unzip<T, U, V: Iterator<(T, U)>>(mut iter: V) -> (Vec<T>, Vec<U>) {
1875
1875
( ts, us)
1876
1876
}
1877
1877
1878
+ /// Wrapper type providing a `&Vec<T>` reference via `Deref`.
1879
+ #[ experimental]
1880
+ pub struct DerefVec < ' a , T > {
1881
+ x : Vec < T > ,
1882
+ l : ContravariantLifetime < ' a >
1883
+ }
1884
+
1885
+ impl < ' a , T > Deref < Vec < T > > for DerefVec < ' a , T > {
1886
+ fn deref < ' b > ( & ' b self ) -> & ' b Vec < T > {
1887
+ & self . x
1888
+ }
1889
+ }
1890
+
1891
+ // Prevent the inner `Vec<T>` from attempting to deallocate memory.
1892
+ #[ unsafe_destructor]
1893
+ impl < ' a , T > Drop for DerefVec < ' a , T > {
1894
+ fn drop ( & mut self ) {
1895
+ self . x . len = 0 ;
1896
+ self . x . cap = 0 ;
1897
+ }
1898
+ }
1899
+
1900
+ /// Convert a slice to a wrapper type providing a `&Vec<T>` reference.
1901
+ #[ experimental]
1902
+ pub fn as_vec < ' a , T > ( x : & ' a [ T ] ) -> DerefVec < ' a , T > {
1903
+ unsafe {
1904
+ DerefVec {
1905
+ x : Vec :: from_raw_parts ( x. len ( ) , x. len ( ) , x. as_ptr ( ) as * mut T ) ,
1906
+ l : ContravariantLifetime :: < ' a >
1907
+ }
1908
+ }
1909
+ }
1910
+
1878
1911
/// Unsafe vector operations.
1879
1912
#[ unstable]
1880
1913
pub mod raw {
@@ -2169,10 +2202,38 @@ mod tests {
2169
2202
use std:: prelude:: * ;
2170
2203
use std:: mem:: size_of;
2171
2204
use test:: Bencher ;
2172
- use super :: { unzip, raw, Vec } ;
2205
+ use super :: { as_vec , unzip, raw, Vec } ;
2173
2206
2174
2207
use MutableSeq ;
2175
2208
2209
+ struct DropCounter < ' a > {
2210
+ count : & ' a mut int
2211
+ }
2212
+
2213
+ #[ unsafe_destructor]
2214
+ impl < ' a > Drop for DropCounter < ' a > {
2215
+ fn drop ( & mut self ) {
2216
+ * self . count += 1 ;
2217
+ }
2218
+ }
2219
+
2220
+ #[ test]
2221
+ fn test_as_vec ( ) {
2222
+ let xs = [ 1u8 , 2u8 , 3u8 ] ;
2223
+ assert_eq ! ( as_vec( xs) . as_slice( ) , xs. as_slice( ) ) ;
2224
+ }
2225
+
2226
+ #[ test]
2227
+ fn test_as_vec_dtor ( ) {
2228
+ let ( mut count_x, mut count_y) = ( 0 , 0 ) ;
2229
+ {
2230
+ let xs = & [ DropCounter { count : & mut count_x } , DropCounter { count : & mut count_y } ] ;
2231
+ assert_eq ! ( as_vec( xs) . len( ) , 2 ) ;
2232
+ }
2233
+ assert_eq ! ( count_x, 1 ) ;
2234
+ assert_eq ! ( count_y, 1 ) ;
2235
+ }
2236
+
2176
2237
#[ test]
2177
2238
fn test_small_vec_struct ( ) {
2178
2239
assert ! ( size_of:: <Vec <u8 >>( ) == size_of:: <uint>( ) * 3 ) ;
@@ -2185,17 +2246,6 @@ mod tests {
2185
2246
y : Vec < T >
2186
2247
}
2187
2248
2188
- struct DropCounter < ' a > {
2189
- count : & ' a mut int
2190
- }
2191
-
2192
- #[ unsafe_destructor]
2193
- impl < ' a > Drop for DropCounter < ' a > {
2194
- fn drop ( & mut self ) {
2195
- * self . count += 1 ;
2196
- }
2197
- }
2198
-
2199
2249
let ( mut count_x, mut count_y) = ( 0 , 0 ) ;
2200
2250
{
2201
2251
let mut tv = TwoVec {
0 commit comments