@@ -47,53 +47,35 @@ impl Unsafe {
47
47
}
48
48
49
49
pub unsafe trait CheckedProject < P : ProjectableExt > {
50
- type RefChecker < ' a > : ProjectionRefChecker < ' a , Proj = P > ;
51
- type ValChecker : ProjectionValChecker < Proj = P > ;
50
+ type Checker : ProjectionChecker < Proj = P > ;
52
51
}
53
52
54
- pub unsafe trait ProjectionRefChecker < ' a > {
53
+ pub unsafe trait ProjectionChecker {
55
54
type Proj : ProjectableExt < Inner : CheckedProject < Self :: Proj > > ;
56
-
57
- unsafe fn __create (
58
- proj : RawProjectedRef < ' a , Self :: Proj , <Self :: Proj as Projectable >:: Inner > ,
59
- ) -> Self ;
60
- }
61
-
62
- pub unsafe trait ProjectionValChecker {
63
- type Proj : ProjectableExt < Inner : CheckedProject < Self :: Proj > > ;
64
-
65
- unsafe fn __create (
66
- proj : RawProjectedVal < Self :: Proj , <Self :: Proj as Projectable >:: Inner > ,
67
- ) -> Self ;
68
55
}
69
56
70
- pub fn __start_proj < ' a , P > ( proj : & ' a P ) -> <P :: Inner as CheckedProject < P > >:: RefChecker < ' a >
57
+ pub fn __start_proj < P > ( proj : & P ) -> ( & <P :: Inner as CheckedProject < P > >:: Checker , * const P )
71
58
where
72
59
P : ProjectableExt ,
73
60
P :: Inner : CheckedProject < P > ,
74
61
{
75
- let ptr: * const P = proj;
76
- let proj = RawProjectedRef ( ptr, PhantomData ) ;
77
- unsafe { <P :: Inner as CheckedProject < P > >:: RefChecker :: __create ( proj) }
62
+ ( unsafe { core:: mem:: transmute ( & ( ) ) } , proj)
78
63
}
79
64
80
- pub fn __start_proj_mut < ' a , P > ( proj : & ' a mut P ) -> <P :: Inner as CheckedProject < P > >:: RefChecker < ' a >
65
+ pub fn __start_proj_mut < P > ( proj : & mut P ) -> ( & mut <P :: Inner as CheckedProject < P > >:: Checker , * mut P )
81
66
where
82
67
P : ProjectableExt ,
83
68
P :: Inner : CheckedProject < P > ,
84
69
{
85
- let ptr: * mut P = proj;
86
- let proj = RawProjectedRef ( ptr, PhantomData ) ;
87
- unsafe { <P :: Inner as CheckedProject < P > >:: RefChecker :: __create ( proj) }
70
+ ( unsafe { core:: mem:: transmute ( & mut ( ) ) } , proj)
88
71
}
89
72
90
- pub fn __start_proj_move < P > ( proj : P ) -> <P :: Inner as CheckedProject < P > >:: ValChecker
73
+ pub fn __start_proj_move < P > ( proj : P ) -> ( <P :: Inner as CheckedProject < P > >:: Checker , P )
91
74
where
92
75
P : ProjectableExt ,
93
76
P :: Inner : CheckedProject < P > ,
94
77
{
95
- let proj = RawProjectedVal ( proj, PhantomData ) ;
96
- unsafe { <P :: Inner as CheckedProject < P > >:: ValChecker :: __create ( proj) }
78
+ ( unsafe { core:: mem:: transmute_copy ( & ( ) ) } , proj)
97
79
}
98
80
99
81
pub struct ProjectedField < P , F > ( PhantomData < P > , PhantomData < F > ) ;
@@ -111,54 +93,24 @@ where
111
93
Default :: default ( )
112
94
}
113
95
114
- pub unsafe fn project < ' a > (
115
- self : & ' a ProjectedField < P , F > ,
116
- raw : RawProjectedPtr < P > ,
117
- ) -> <P as Project < F > >:: Output < ' a >
96
+ pub unsafe fn project < ' a > ( & ' a self , raw : * const P ) -> <P as Project < F > >:: Output < ' a >
118
97
where
119
98
P : Project < F > ,
120
99
{
121
- unsafe { <P as Project < F > >:: project ( raw. 0 ) }
100
+ unsafe { <P as Project < F > >:: project ( raw) }
122
101
}
123
102
124
- pub unsafe fn project_mut < ' a > (
125
- self : & ' a mut ProjectedField < P , F > ,
126
- raw : RawProjectedPtr < P > ,
127
- ) -> <P as ProjectMut < F > >:: OutputMut < ' a >
103
+ pub unsafe fn project_mut < ' a > ( & ' a mut self , raw : * mut P ) -> <P as ProjectMut < F > >:: OutputMut < ' a >
128
104
where
129
105
P : ProjectMut < F > ,
130
106
{
131
- unsafe { <P as ProjectMut < F > >:: project_mut ( raw. 0 . cast_mut ( ) ) }
107
+ unsafe { <P as ProjectMut < F > >:: project_mut ( raw) }
132
108
}
133
- }
134
-
135
- pub struct RawProjectedPtr < P > ( * const P ) ;
136
-
137
- pub struct RawProjectedRef < ' a , P , T : ?Sized > ( * const P , PhantomData < ( & ' a ( ) , & ' a mut ( ) , P , T ) > ) ;
138
-
139
- pub struct RawProjectedVal < P , T : ?Sized > ( P , PhantomData < ( P , T ) > ) ;
140
-
141
- pub trait RawProjectionAccess < P > {
142
- fn access ( & self ) -> RawProjectedPtr < P > ;
143
- fn access_mut ( & mut self ) -> RawProjectedPtr < P > ;
144
- }
145
109
146
- impl < ' a , P , T : ?Sized > RawProjectionAccess < P > for RawProjectedRef < ' a , P , T > {
147
- fn access ( & self ) -> RawProjectedPtr < P > {
148
- RawProjectedPtr ( self . 0 )
149
- }
150
-
151
- fn access_mut ( & mut self ) -> RawProjectedPtr < P > {
152
- RawProjectedPtr ( self . 0 )
153
- }
154
- }
155
-
156
- impl < P , T : ?Sized > RawProjectionAccess < P > for RawProjectedVal < P , T > {
157
- fn access ( & self ) -> RawProjectedPtr < P > {
158
- RawProjectedPtr ( & raw const self . 0 )
159
- }
160
-
161
- fn access_mut ( & mut self ) -> RawProjectedPtr < P > {
162
- RawProjectedPtr ( & raw mut self . 0 )
110
+ pub unsafe fn project_move < ' a > ( self , raw : * const P ) -> <P as Project < F > >:: Output < ' a >
111
+ where
112
+ P : Project < F > ,
113
+ {
114
+ unsafe { <P as Project < F > >:: project ( raw) }
163
115
}
164
116
}
0 commit comments