@@ -57,10 +57,15 @@ macro_rules! callback {
57
57
58
58
macro_rules! define {
59
59
// When using members, careful with UnsafeFrom, the data casted back must have been allocated on rust side.
60
- { #[ c_ty( $inner: ident) ] $( #[ $m: meta] ) * struct $name: ident$( <$l: tt >) * $( { $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } ) ?; $( $defs: tt) * } => {
60
+ { #[ c_ty( $inner: ident) ] $( #[ $m: meta] ) * struct $name: ident$( <$l: lifetime >) * $( { $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } ) ?; $( $defs: tt) * } => {
61
61
define_struct!( define $( #[ $m] ) * struct $name $( lifetime $l) * inner $inner members $( $( $( #[ $mm] ) * $member: $member_type, ) * ) * ) ;
62
62
define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
63
63
} ;
64
+ // case for generic type
65
+ { #[ c_ty( $inner: ident) ] $( #[ $m: meta] ) * struct $name: ident$( <$g: tt>) * $( { $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } ) ?; $( $defs: tt) * } => {
66
+ define_struct!( define $( #[ $m] ) * struct $name $( generic $g) * inner $inner members $( $( $( #[ $mm] ) * $member: $member_type, ) * ) * ) ;
67
+ define_struct!( << $name $( generic $g) * inner $inner >> $( $defs) * ) ;
68
+ } ;
64
69
// Do not use UnsafeFrom with 'c_box_ty'. That is currently not supported as its not needed anywhere, support may be added in the future if needed anywhere.
65
70
{ #[ c_box_ty( $inner: ident) ] $( #[ $m: meta] ) * struct $name: ident$( <$l: tt>) * $( { $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } ) ?; $( $defs: tt) * } => {
66
71
define_struct!( define_box $( #[ $m] ) * struct $name $( lifetime $l) * inner $inner members $( $( $( #[ $mm] ) * $member: $member_type, ) * ) * ) ;
@@ -109,7 +114,7 @@ macro_rules! define_enum {
109
114
}
110
115
111
116
macro_rules! define_struct {
112
- { define $( #[ $m: meta] ) * struct $name: ident $( lifetime $l: tt ) * inner $inner: ident members $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } => {
117
+ { define $( #[ $m: meta] ) * struct $name: ident $( lifetime $l: lifetime ) * inner $inner: ident members $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } => {
113
118
as_item!(
114
119
#[ allow( dead_code) ]
115
120
$( #[ $m] ) *
@@ -144,6 +149,40 @@ macro_rules! define_struct {
144
149
) ;
145
150
} ;
146
151
152
+ { define $( #[ $m: meta] ) * struct $name: ident $( generic $g: tt) * inner $inner: ident members $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } => {
153
+ as_item!(
154
+ #[ allow( dead_code) ]
155
+ $( #[ $m] ) *
156
+ pub struct $name<$( $g) * > {
157
+ inner: :: mbedtls_sys:: $inner,
158
+ $( $( #[ $mm] ) * $member: $member_type, ) *
159
+ }
160
+ ) ;
161
+
162
+ as_item!(
163
+ #[ allow( dead_code) ]
164
+ impl <$( $g) * > $name<$( $g) * > {
165
+ pub ( crate ) fn into_inner( self ) -> :: mbedtls_sys:: $inner {
166
+ let inner = self . inner;
167
+ :: core:: mem:: forget( self ) ;
168
+ inner
169
+ }
170
+
171
+ pub ( crate ) fn handle( & self ) -> & :: mbedtls_sys:: $inner {
172
+ & self . inner
173
+ }
174
+
175
+ pub ( crate ) fn handle_mut( & mut self ) -> & mut :: mbedtls_sys:: $inner {
176
+ & mut self . inner
177
+ }
178
+ }
179
+ ) ;
180
+
181
+ as_item!(
182
+ unsafe impl <$( $g) * > Send for $name<$( $g) * > { }
183
+ ) ;
184
+ } ;
185
+
147
186
{ define_box $( #[ $m: meta] ) * struct $name: ident $( lifetime $l: tt) * inner $inner: ident members $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } => {
148
187
as_item!(
149
188
#[ allow( dead_code) ]
@@ -173,14 +212,22 @@ macro_rules! define_struct {
173
212
) ;
174
213
} ;
175
214
176
- { << $name: ident $( lifetime $l: tt ) * inner $inner: ident >> const init: fn ( ) -> Self = $ctor: ident $( { $( $member: ident: $member_init: expr, ) * } ) ?; $( $defs: tt) * } => {
215
+ { << $name: ident $( lifetime $l: lifetime ) * inner $inner: ident >> const init: fn ( ) -> Self = $ctor: ident $( { $( $member: ident: $member_init: expr, ) * } ) ?; $( $defs: tt) * } => {
177
216
define_struct!( init $name ( ) init $ctor $( lifetime $l) * members $( $( $member: $member_init, ) * ) * ) ;
178
217
define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
179
218
} ;
180
- { << $name: ident $( lifetime $l: tt) * inner $inner: ident >> pub const new: fn ( ) -> Self = $ctor: ident $( { $( $member: ident: $member_init: expr, ) * } ) ?; $( $defs: tt) * } => {
219
+ { << $name: ident $( generic $g: tt) * inner $inner: ident >> const init: fn ( ) -> Self = $ctor: ident $( { $( $member: ident: $member_init: expr, ) * } ) ?; $( $defs: tt) * } => {
220
+ define_struct!( init $name ( ) init $ctor $( generic $g) * members $( $( $member: $member_init, ) * ) * ) ;
221
+ define_struct!( << $name $( generic $g) * inner $inner >> $( $defs) * ) ;
222
+ } ;
223
+ { << $name: ident $( lifetime $l: lifetime) * inner $inner: ident >> pub const new: fn ( ) -> Self = $ctor: ident $( { $( $member: ident: $member_init: expr, ) * } ) ?; $( $defs: tt) * } => {
181
224
define_struct!( init $name ( pub ) new $ctor $( lifetime $l) * members $( $( $member: $member_init, ) * ) * ) ;
182
225
define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
183
226
} ;
227
+ { << $name: ident $( generic $g: tt) * inner $inner: ident >> pub const new: fn ( ) -> Self = $ctor: ident $( { $( $member: ident: $member_init: expr, ) * } ) ?; $( $defs: tt) * } => {
228
+ define_struct!( init $name ( pub ) new $ctor $( generic $g) * members $( $( $member: $member_init, ) * ) * ) ;
229
+ define_struct!( << $name $( generic $g) * inner $inner >> $( $defs) * ) ;
230
+ } ;
184
231
{ init $name: ident ( $( $vis: tt) * ) $new: ident $ctor: ident $( lifetime $l: tt) * members $( $member: ident: $member_init: expr, ) * } => {
185
232
as_item!(
186
233
#[ allow( dead_code) ]
@@ -215,10 +262,14 @@ macro_rules! define_struct {
215
262
) ;
216
263
} ;
217
264
218
- { << $name: ident $( lifetime $l: tt ) * inner $inner: ident >> impl <$l2: tt> Into <ptr> { } $( $defs: tt) * } => {
265
+ { << $name: ident $( lifetime $l: lifetime ) * inner $inner: ident >> impl <$l2: tt> Into <ptr> { } $( $defs: tt) * } => {
219
266
define_struct!( into $name inner $inner $( lifetime $l) * lifetime2 $l2 ) ;
220
267
define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
221
268
} ;
269
+ { << $name: ident $( generic $g: tt) * inner $inner: ident >> impl <$l2: tt> Into <ptr> { } $( $defs: tt) * } => {
270
+ define_struct!( into $name inner $inner $( generic $g) * lifetime2 $l2 ) ;
271
+ define_struct!( << $name $( generic $g) * inner $inner >> $( $defs) * ) ;
272
+ } ;
222
273
{ into $name: ident inner $inner: ident $( lifetime $l: tt) * lifetime2 $l2: tt } => {
223
274
as_item!(
224
275
impl <$l2, $( $l) ,* > Into <* const $inner> for & $l2 $name<$( $l) * > {
@@ -246,12 +297,43 @@ macro_rules! define_struct {
246
297
}
247
298
) ;
248
299
} ;
300
+ { into $name: ident inner $inner: ident $( generic $g: tt) * lifetime2 $l2: tt } => {
301
+ as_item!(
302
+ impl <$l2, $( $g) ,* > Into <* const $inner> for & $l2 $name<$( $g) * > {
303
+ fn into( self ) -> * const $inner {
304
+ self . handle( )
305
+ }
306
+ }
307
+ ) ;
308
+
309
+ as_item!(
310
+ impl <$l2, $( $g) ,* > Into <* mut $inner> for & $l2 mut $name<$( $g) * > {
311
+ fn into( self ) -> * mut $inner {
312
+ self . handle_mut( )
313
+ }
314
+ }
315
+ ) ;
316
+ as_item!(
317
+ impl <$( $g) ,* > $name<$( $g) * > {
318
+ /// Needed for compatibility with mbedtls - where we could pass
319
+ /// `*const` but function signature requires `*mut`
320
+ #[ allow( dead_code) ]
321
+ pub ( crate ) unsafe fn inner_ffi_mut( & self ) -> * mut $inner {
322
+ self . handle( ) as * const _ as * mut $inner
323
+ }
324
+ }
325
+ ) ;
326
+ } ;
249
327
250
- { << $name: ident $( lifetime $l: tt ) * inner $inner: ident >> impl <$l2: tt> UnsafeFrom <ptr> { } $( $defs: tt) * } => {
328
+ { << $name: ident $( lifetime $l: lifetime ) * inner $inner: ident >> impl <$l2: tt> UnsafeFrom <ptr> { } $( $defs: tt) * } => {
251
329
define_struct!( unsafe_from $name inner $inner $( lifetime $l) * lifetime2 $l2 ) ;
252
330
define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
253
331
} ;
254
- { unsafe_from $name: ident inner $inner: ident $( lifetime $l: tt) * lifetime2 $l2: tt } => {
332
+ { << $name: ident $( generic $g: tt) * inner $inner: ident >> impl <$l2: tt> UnsafeFrom <ptr> { } $( $defs: tt) * } => {
333
+ define_struct!( unsafe_from $name inner $inner $( generic $g) * lifetime2 $l2 ) ;
334
+ define_struct!( << $name $( generic $g) * inner $inner >> $( $defs) * ) ;
335
+ } ;
336
+ { unsafe_from $name: ident inner $inner: ident $( lifetime $l: lifetime) * lifetime2 $l2: tt } => {
255
337
as_item!(
256
338
impl <$l2, $( $l) ,* > crate :: private:: UnsafeFrom <* const $inner> for & $l2 $name<$( $l) * > {
257
339
unsafe fn from( ptr: * const $inner) -> Option <Self > {
@@ -268,9 +350,28 @@ macro_rules! define_struct {
268
350
}
269
351
) ;
270
352
} ;
353
+ { unsafe_from $name: ident inner $inner: ident $( generic $g: tt) * lifetime2 $l2: tt } => {
354
+ as_item!(
355
+ impl <$l2, $( $g) ,* > crate :: private:: UnsafeFrom <* const $inner> for & $l2 $name<$( $g) * > {
356
+ unsafe fn from( ptr: * const $inner) -> Option <Self > {
357
+ ( ptr as * const $name<$( $g) ,* >) . as_ref( )
358
+ }
359
+ }
360
+ ) ;
361
+
362
+ as_item!(
363
+ impl <$l2, $( $g) ,* > crate :: private:: UnsafeFrom <* mut $inner> for & $l2 mut $name<$( $g) * > {
364
+ unsafe fn from( ptr: * mut $inner) -> Option <Self > {
365
+ ( ptr as * mut $name<$( $g) ,* >) . as_mut( )
366
+ }
367
+ }
368
+ ) ;
369
+ } ;
271
370
272
- { << $name: ident $( lifetime $l: tt) * inner $inner: ident >> } => { } ;
273
- { lifetime $l: tt } => { } ;
371
+ { << $name: ident $( lifetime $l: lifetime) * inner $inner: ident >> } => { } ;
372
+ { << $name: ident $( generic $g: tt) * inner $inner: ident >> } => { } ;
373
+ { lifetime $l: lifetime } => { } ;
374
+ { generic $g: tt } => { } ;
274
375
}
275
376
276
377
macro_rules! setter {
0 commit comments