@@ -6,13 +6,29 @@ use std::ptr;
6
6
use std:: slice;
7
7
8
8
#[ repr( C ) ]
9
- pub struct VarLenArray < T > {
9
+ pub struct VarLenArray < T : Copy > {
10
10
len : usize ,
11
11
ptr : * const T ,
12
12
tag : PhantomData < T > ,
13
13
}
14
14
15
- impl < T > VarLenArray < T > {
15
+ impl < T : Copy > VarLenArray < T > {
16
+ pub unsafe fn from_parts ( p : * const T , len : usize ) -> Self {
17
+ let ( len, ptr) = if !p. is_null ( ) && len != 0 {
18
+ let dst = crate :: malloc ( len * mem:: size_of :: < T > ( ) ) ;
19
+ ptr:: copy_nonoverlapping ( p, dst. cast ( ) , len) ;
20
+ ( len, dst)
21
+ } else {
22
+ ( 0 , ptr:: null_mut ( ) )
23
+ } ;
24
+ Self { len, ptr : ptr as * const _ , tag : PhantomData }
25
+ }
26
+
27
+ #[ inline]
28
+ pub fn from_slice ( arr : & [ T ] ) -> Self {
29
+ unsafe { Self :: from_parts ( arr. as_ptr ( ) , arr. len ( ) ) }
30
+ }
31
+
16
32
#[ inline]
17
33
pub fn as_ptr ( & self ) -> * const T {
18
34
self . ptr
@@ -30,31 +46,11 @@ impl<T> VarLenArray<T> {
30
46
31
47
#[ inline]
32
48
pub fn as_slice ( & self ) -> & [ T ] {
33
- unsafe { slice:: from_raw_parts ( self . as_ptr ( ) , self . len ( ) ) }
34
- }
35
- }
36
-
37
- impl < T : Copy > VarLenArray < T > {
38
- /// Creates a new `VarLenArray` from a slice by copying the source data.
39
- #[ inline]
40
- pub fn from_slice ( arr : & [ T ] ) -> Self {
41
- unsafe { Self :: from_parts ( arr. as_ptr ( ) , arr. len ( ) ) }
42
- }
43
-
44
- /// Create a new `VarLenArray` from a ptr/len combo by copying the source data.
45
- pub unsafe fn from_parts ( p : * const T , len : usize ) -> Self {
46
- let ( len, ptr) = if !p. is_null ( ) && len != 0 {
47
- let dst = crate :: malloc ( len * mem:: size_of :: < T > ( ) ) ;
48
- ptr:: copy_nonoverlapping ( p, dst. cast ( ) , len) ;
49
- ( len, dst)
50
- } else {
51
- ( 0 , ptr:: null_mut ( ) )
52
- } ;
53
- Self { len, ptr : ptr as * const _ , tag : PhantomData }
49
+ self
54
50
}
55
51
}
56
52
57
- impl < T > Drop for VarLenArray < T > {
53
+ impl < T : Copy > Drop for VarLenArray < T > {
58
54
fn drop ( & mut self ) {
59
55
if !self . ptr . is_null ( ) {
60
56
unsafe {
@@ -75,15 +71,15 @@ impl<T: Copy> Clone for VarLenArray<T> {
75
71
}
76
72
}
77
73
78
- impl < T > Deref for VarLenArray < T > {
74
+ impl < T : Copy > Deref for VarLenArray < T > {
79
75
type Target = [ T ] ;
80
76
81
77
#[ inline]
82
78
fn deref ( & self ) -> & [ T ] {
83
79
if self . len == 0 || self . ptr . is_null ( ) {
84
80
& [ ]
85
81
} else {
86
- self . as_slice ( )
82
+ unsafe { slice :: from_raw_parts ( self . as_ptr ( ) , self . len ( ) ) }
87
83
}
88
84
}
89
85
}
@@ -139,7 +135,7 @@ impl<T: Copy + PartialEq, const N: usize> PartialEq<[T; N]> for VarLenArray<T> {
139
135
}
140
136
}
141
137
142
- impl < T : fmt:: Debug > fmt:: Debug for VarLenArray < T > {
138
+ impl < T : Copy + fmt:: Debug > fmt:: Debug for VarLenArray < T > {
143
139
#[ inline]
144
140
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
145
141
self . as_slice ( ) . fmt ( f)
0 commit comments