@@ -57,10 +57,15 @@ macro_rules! callback {
5757
5858macro_rules! define {
5959 // 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) * } => {
6161 define_struct!( define $( #[ $m] ) * struct $name $( lifetime $l) * inner $inner members $( $( $( #[ $mm] ) * $member: $member_type, ) * ) * ) ;
6262 define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
6363 } ;
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+ } ;
6469 // 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.
6570 { #[ c_box_ty( $inner: ident) ] $( #[ $m: meta] ) * struct $name: ident$( <$l: tt>) * $( { $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } ) ?; $( $defs: tt) * } => {
6671 define_struct!( define_box $( #[ $m] ) * struct $name $( lifetime $l) * inner $inner members $( $( $( #[ $mm] ) * $member: $member_type, ) * ) * ) ;
@@ -109,7 +114,7 @@ macro_rules! define_enum {
109114}
110115
111116macro_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, ) * } => {
113118 as_item!(
114119 #[ allow( dead_code) ]
115120 $( #[ $m] ) *
@@ -144,6 +149,40 @@ macro_rules! define_struct {
144149 ) ;
145150 } ;
146151
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+
147186 { define_box $( #[ $m: meta] ) * struct $name: ident $( lifetime $l: tt) * inner $inner: ident members $( $( #[ $mm: meta] ) * $member: ident: $member_type: ty, ) * } => {
148187 as_item!(
149188 #[ allow( dead_code) ]
@@ -173,14 +212,22 @@ macro_rules! define_struct {
173212 ) ;
174213 } ;
175214
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) * } => {
177216 define_struct!( init $name ( ) init $ctor $( lifetime $l) * members $( $( $member: $member_init, ) * ) * ) ;
178217 define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
179218 } ;
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) * } => {
181224 define_struct!( init $name ( pub ) new $ctor $( lifetime $l) * members $( $( $member: $member_init, ) * ) * ) ;
182225 define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
183226 } ;
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+ } ;
184231 { init $name: ident ( $( $vis: tt) * ) $new: ident $ctor: ident $( lifetime $l: tt) * members $( $member: ident: $member_init: expr, ) * } => {
185232 as_item!(
186233 #[ allow( dead_code) ]
@@ -215,10 +262,14 @@ macro_rules! define_struct {
215262 ) ;
216263 } ;
217264
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) * } => {
219266 define_struct!( into $name inner $inner $( lifetime $l) * lifetime2 $l2 ) ;
220267 define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
221268 } ;
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+ } ;
222273 { into $name: ident inner $inner: ident $( lifetime $l: tt) * lifetime2 $l2: tt } => {
223274 as_item!(
224275 impl <$l2, $( $l) ,* > Into <* const $inner> for & $l2 $name<$( $l) * > {
@@ -246,12 +297,43 @@ macro_rules! define_struct {
246297 }
247298 ) ;
248299 } ;
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+ } ;
249327
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) * } => {
251329 define_struct!( unsafe_from $name inner $inner $( lifetime $l) * lifetime2 $l2 ) ;
252330 define_struct!( << $name $( lifetime $l) * inner $inner >> $( $defs) * ) ;
253331 } ;
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 } => {
255337 as_item!(
256338 impl <$l2, $( $l) ,* > crate :: private:: UnsafeFrom <* const $inner> for & $l2 $name<$( $l) * > {
257339 unsafe fn from( ptr: * const $inner) -> Option <Self > {
@@ -268,9 +350,28 @@ macro_rules! define_struct {
268350 }
269351 ) ;
270352 } ;
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+ } ;
271370
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 } => { } ;
274375}
275376
276377macro_rules! setter {
0 commit comments