@@ -3,20 +3,32 @@ use core::marker::PhantomData;
3
3
use core:: ptr:: NonNull ;
4
4
5
5
#[ repr( transparent) ]
6
- pub struct Own < T > {
6
+ pub struct Own < T >
7
+ where
8
+ T : ?Sized ,
9
+ {
7
10
pub ptr : NonNull < T > ,
8
11
}
9
12
10
- unsafe impl < T > Send for Own < T > { }
11
- unsafe impl < T > Sync for Own < T > { }
12
- impl < T > Copy for Own < T > { }
13
- impl < T > Clone for Own < T > {
13
+ unsafe impl < T > Send for Own < T > where T : ?Sized { }
14
+
15
+ unsafe impl < T > Sync for Own < T > where T : ?Sized { }
16
+
17
+ impl < T > Copy for Own < T > where T : ?Sized { }
18
+
19
+ impl < T > Clone for Own < T >
20
+ where
21
+ T : ?Sized ,
22
+ {
14
23
fn clone ( & self ) -> Self {
15
24
* self
16
25
}
17
26
}
18
27
19
- impl < T > Own < T > {
28
+ impl < T > Own < T >
29
+ where
30
+ T : ?Sized ,
31
+ {
20
32
pub fn new ( ptr : Box < T > ) -> Self {
21
33
Own {
22
34
ptr : unsafe { NonNull :: new_unchecked ( Box :: into_raw ( ptr) ) } ,
@@ -49,19 +61,29 @@ impl<T> Own<T> {
49
61
}
50
62
51
63
#[ repr( transparent) ]
52
- pub struct Ref < ' a , T > {
64
+ pub struct Ref < ' a , T >
65
+ where
66
+ T : ?Sized ,
67
+ {
53
68
pub ptr : NonNull < T > ,
54
69
lifetime : PhantomData < & ' a T > ,
55
70
}
56
71
57
- impl < ' a , T > Copy for Ref < ' a , T > { }
58
- impl < ' a , T > Clone for Ref < ' a , T > {
72
+ impl < ' a , T > Copy for Ref < ' a , T > where T : ?Sized { }
73
+
74
+ impl < ' a , T > Clone for Ref < ' a , T >
75
+ where
76
+ T : ?Sized ,
77
+ {
59
78
fn clone ( & self ) -> Self {
60
79
* self
61
80
}
62
81
}
63
82
64
- impl < ' a , T > Ref < ' a , T > {
83
+ impl < ' a , T > Ref < ' a , T >
84
+ where
85
+ T : ?Sized ,
86
+ {
65
87
pub fn new ( ptr : & ' a T ) -> Self {
66
88
Ref {
67
89
ptr : NonNull :: from ( ptr) ,
@@ -82,19 +104,29 @@ impl<'a, T> Ref<'a, T> {
82
104
}
83
105
84
106
#[ repr( transparent) ]
85
- pub struct Mut < ' a , T > {
107
+ pub struct Mut < ' a , T >
108
+ where
109
+ T : ?Sized ,
110
+ {
86
111
pub ptr : NonNull < T > ,
87
112
lifetime : PhantomData < & ' a mut T > ,
88
113
}
89
114
90
- impl < ' a , T > Copy for Mut < ' a , T > { }
91
- impl < ' a , T > Clone for Mut < ' a , T > {
115
+ impl < ' a , T > Copy for Mut < ' a , T > where T : ?Sized { }
116
+
117
+ impl < ' a , T > Clone for Mut < ' a , T >
118
+ where
119
+ T : ?Sized ,
120
+ {
92
121
fn clone ( & self ) -> Self {
93
122
* self
94
123
}
95
124
}
96
125
97
- impl < ' a , T > Mut < ' a , T > {
126
+ impl < ' a , T > Mut < ' a , T >
127
+ where
128
+ T : ?Sized ,
129
+ {
98
130
pub fn new ( ptr : & ' a mut T ) -> Self {
99
131
Mut {
100
132
ptr : NonNull :: from ( ptr) ,
@@ -119,7 +151,9 @@ impl<'a, T> Mut<'a, T> {
119
151
pub unsafe fn deref_mut ( self ) -> & ' a mut T {
120
152
& mut * self . ptr . as_ptr ( )
121
153
}
154
+ }
122
155
156
+ impl < ' a , T > Mut < ' a , T > {
123
157
pub unsafe fn read ( self ) -> T {
124
158
self . ptr . as_ptr ( ) . read ( )
125
159
}
0 commit comments