@@ -1048,27 +1048,33 @@ fn expand_rust_box(ident: &Ident, types: &Types, explicit_impl: Option<&Impl>) -
1048
1048
let local_dealloc = format_ident ! ( "{}dealloc" , local_prefix) ;
1049
1049
let local_drop = format_ident ! ( "{}drop" , local_prefix) ;
1050
1050
1051
+ let ( impl_generics, ty_generics) = if let Some ( imp) = explicit_impl {
1052
+ ( & imp. impl_generics , & imp. ty_generics )
1053
+ } else {
1054
+ ( resolve. generics , resolve. generics )
1055
+ } ;
1056
+
1051
1057
let begin_span =
1052
1058
explicit_impl. map_or_else ( Span :: call_site, |explicit| explicit. impl_token . span ) ;
1053
1059
let end_span = explicit_impl. map_or_else ( Span :: call_site, |explicit| explicit. brace_token . span ) ;
1054
1060
let unsafe_token = format_ident ! ( "unsafe" , span = begin_span) ;
1055
1061
1056
1062
quote_spanned ! { end_span=>
1057
1063
#[ doc( hidden) ]
1058
- #unsafe_token impl :: cxx:: private:: ImplBox for #ident { }
1064
+ #unsafe_token impl #impl_generics :: cxx:: private:: ImplBox for #ident #ty_generics { }
1059
1065
#[ doc( hidden) ]
1060
1066
#[ export_name = #link_alloc]
1061
- unsafe extern "C" fn #local_alloc( ) -> * mut :: std:: mem:: MaybeUninit <#ident> {
1067
+ unsafe extern "C" fn #local_alloc #impl_generics ( ) -> * mut :: std:: mem:: MaybeUninit <#ident #ty_generics > {
1062
1068
:: std:: boxed:: Box :: into_raw( :: std:: boxed:: Box :: new( :: std:: mem:: MaybeUninit :: uninit( ) ) )
1063
1069
}
1064
1070
#[ doc( hidden) ]
1065
1071
#[ export_name = #link_dealloc]
1066
- unsafe extern "C" fn #local_dealloc( ptr: * mut :: std:: mem:: MaybeUninit <#ident>) {
1072
+ unsafe extern "C" fn #local_dealloc #impl_generics ( ptr: * mut :: std:: mem:: MaybeUninit <#ident #ty_generics >) {
1067
1073
:: std:: boxed:: Box :: from_raw( ptr) ;
1068
1074
}
1069
1075
#[ doc( hidden) ]
1070
1076
#[ export_name = #link_drop]
1071
- unsafe extern "C" fn #local_drop( this: * mut :: std:: boxed:: Box <#ident>) {
1077
+ unsafe extern "C" fn #local_drop #impl_generics ( this: * mut :: std:: boxed:: Box <#ident #ty_generics >) {
1072
1078
:: std:: ptr:: drop_in_place( this) ;
1073
1079
}
1074
1080
}
@@ -1094,47 +1100,53 @@ fn expand_rust_vec(elem: &Ident, types: &Types, explicit_impl: Option<&Impl>) ->
1094
1100
let local_reserve_total = format_ident ! ( "{}reserve_total" , local_prefix) ;
1095
1101
let local_set_len = format_ident ! ( "{}set_len" , local_prefix) ;
1096
1102
1103
+ let ( impl_generics, ty_generics) = if let Some ( imp) = explicit_impl {
1104
+ ( & imp. impl_generics , & imp. ty_generics )
1105
+ } else {
1106
+ ( resolve. generics , resolve. generics )
1107
+ } ;
1108
+
1097
1109
let begin_span =
1098
1110
explicit_impl. map_or_else ( Span :: call_site, |explicit| explicit. impl_token . span ) ;
1099
1111
let end_span = explicit_impl. map_or_else ( Span :: call_site, |explicit| explicit. brace_token . span ) ;
1100
1112
let unsafe_token = format_ident ! ( "unsafe" , span = begin_span) ;
1101
1113
1102
1114
quote_spanned ! { end_span=>
1103
1115
#[ doc( hidden) ]
1104
- #unsafe_token impl :: cxx:: private:: ImplVec for #elem { }
1116
+ #unsafe_token impl #impl_generics :: cxx:: private:: ImplVec for #elem #ty_generics { }
1105
1117
#[ doc( hidden) ]
1106
1118
#[ export_name = #link_new]
1107
- unsafe extern "C" fn #local_new( this: * mut :: cxx:: private:: RustVec <#elem>) {
1119
+ unsafe extern "C" fn #local_new #impl_generics ( this: * mut :: cxx:: private:: RustVec <#elem #ty_generics >) {
1108
1120
:: std:: ptr:: write( this, :: cxx:: private:: RustVec :: new( ) ) ;
1109
1121
}
1110
1122
#[ doc( hidden) ]
1111
1123
#[ export_name = #link_drop]
1112
- unsafe extern "C" fn #local_drop( this: * mut :: cxx:: private:: RustVec <#elem>) {
1124
+ unsafe extern "C" fn #local_drop #impl_generics ( this: * mut :: cxx:: private:: RustVec <#elem #ty_generics >) {
1113
1125
:: std:: ptr:: drop_in_place( this) ;
1114
1126
}
1115
1127
#[ doc( hidden) ]
1116
1128
#[ export_name = #link_len]
1117
- unsafe extern "C" fn #local_len( this: * const :: cxx:: private:: RustVec <#elem>) -> usize {
1129
+ unsafe extern "C" fn #local_len #impl_generics ( this: * const :: cxx:: private:: RustVec <#elem #ty_generics >) -> usize {
1118
1130
( * this) . len( )
1119
1131
}
1120
1132
#[ doc( hidden) ]
1121
1133
#[ export_name = #link_capacity]
1122
- unsafe extern "C" fn #local_capacity( this: * const :: cxx:: private:: RustVec <#elem>) -> usize {
1134
+ unsafe extern "C" fn #local_capacity #impl_generics ( this: * const :: cxx:: private:: RustVec <#elem #ty_generics >) -> usize {
1123
1135
( * this) . capacity( )
1124
1136
}
1125
1137
#[ doc( hidden) ]
1126
1138
#[ export_name = #link_data]
1127
- unsafe extern "C" fn #local_data( this: * const :: cxx:: private:: RustVec <#elem>) -> * const #elem {
1139
+ unsafe extern "C" fn #local_data #impl_generics ( this: * const :: cxx:: private:: RustVec <#elem #ty_generics >) -> * const #elem #ty_generics {
1128
1140
( * this) . as_ptr( )
1129
1141
}
1130
1142
#[ doc( hidden) ]
1131
1143
#[ export_name = #link_reserve_total]
1132
- unsafe extern "C" fn #local_reserve_total( this: * mut :: cxx:: private:: RustVec <#elem>, cap: usize ) {
1144
+ unsafe extern "C" fn #local_reserve_total #impl_generics ( this: * mut :: cxx:: private:: RustVec <#elem #ty_generics >, cap: usize ) {
1133
1145
( * this) . reserve_total( cap) ;
1134
1146
}
1135
1147
#[ doc( hidden) ]
1136
1148
#[ export_name = #link_set_len]
1137
- unsafe extern "C" fn #local_set_len( this: * mut :: cxx:: private:: RustVec <#elem>, len: usize ) {
1149
+ unsafe extern "C" fn #local_set_len #impl_generics ( this: * mut :: cxx:: private:: RustVec <#elem #ty_generics >, len: usize ) {
1138
1150
( * this) . set_len( len) ;
1139
1151
}
1140
1152
}
@@ -1151,6 +1163,12 @@ fn expand_unique_ptr(ident: &Ident, types: &Types, explicit_impl: Option<&Impl>)
1151
1163
let link_release = format ! ( "{}release" , prefix) ;
1152
1164
let link_drop = format ! ( "{}drop" , prefix) ;
1153
1165
1166
+ let ( impl_generics, ty_generics) = if let Some ( imp) = explicit_impl {
1167
+ ( & imp. impl_generics , & imp. ty_generics )
1168
+ } else {
1169
+ ( resolve. generics , resolve. generics )
1170
+ } ;
1171
+
1154
1172
let can_construct_from_value = types. structs . contains_key ( ident)
1155
1173
|| types. enums . contains_key ( ident)
1156
1174
|| types. aliases . contains_key ( ident) ;
@@ -1162,7 +1180,7 @@ fn expand_unique_ptr(ident: &Ident, types: &Types, explicit_impl: Option<&Impl>)
1162
1180
fn __uninit( this: * mut * mut :: std:: ffi:: c_void) -> * mut :: std:: ffi:: c_void;
1163
1181
}
1164
1182
let mut repr = :: std:: ptr:: null_mut:: <:: std:: ffi:: c_void>( ) ;
1165
- unsafe { __uninit( & mut repr) . cast:: <#ident>( ) . write( value) }
1183
+ unsafe { __uninit( & mut repr) . cast:: <#ident #ty_generics >( ) . write( value) }
1166
1184
repr
1167
1185
}
1168
1186
} )
@@ -1176,7 +1194,7 @@ fn expand_unique_ptr(ident: &Ident, types: &Types, explicit_impl: Option<&Impl>)
1176
1194
let unsafe_token = format_ident ! ( "unsafe" , span = begin_span) ;
1177
1195
1178
1196
quote_spanned ! { end_span=>
1179
- #unsafe_token impl :: cxx:: private:: UniquePtrTarget for #ident {
1197
+ #unsafe_token impl #impl_generics :: cxx:: private:: UniquePtrTarget for #ident #ty_generics {
1180
1198
const __NAME: & ' static dyn :: std:: fmt:: Display = & #name;
1181
1199
fn __null( ) -> * mut :: std:: ffi:: c_void {
1182
1200
extern "C" {
@@ -1232,6 +1250,12 @@ fn expand_shared_ptr(ident: &Ident, types: &Types, explicit_impl: Option<&Impl>)
1232
1250
let link_get = format ! ( "{}get" , prefix) ;
1233
1251
let link_drop = format ! ( "{}drop" , prefix) ;
1234
1252
1253
+ let ( impl_generics, ty_generics) = if let Some ( imp) = explicit_impl {
1254
+ ( & imp. impl_generics , & imp. ty_generics )
1255
+ } else {
1256
+ ( resolve. generics , resolve. generics )
1257
+ } ;
1258
+
1235
1259
let can_construct_from_value = types. structs . contains_key ( ident)
1236
1260
|| types. enums . contains_key ( ident)
1237
1261
|| types. aliases . contains_key ( ident) ;
@@ -1242,7 +1266,7 @@ fn expand_shared_ptr(ident: &Ident, types: &Types, explicit_impl: Option<&Impl>)
1242
1266
#[ link_name = #link_uninit]
1243
1267
fn __uninit( new: * mut :: std:: ffi:: c_void) -> * mut :: std:: ffi:: c_void;
1244
1268
}
1245
- __uninit( new) . cast:: <#ident>( ) . write( value) ;
1269
+ __uninit( new) . cast:: <#ident #ty_generics >( ) . write( value) ;
1246
1270
}
1247
1271
} )
1248
1272
} else {
@@ -1255,7 +1279,7 @@ fn expand_shared_ptr(ident: &Ident, types: &Types, explicit_impl: Option<&Impl>)
1255
1279
let unsafe_token = format_ident ! ( "unsafe" , span = begin_span) ;
1256
1280
1257
1281
quote_spanned ! { end_span=>
1258
- #unsafe_token impl :: cxx:: private:: SharedPtrTarget for #ident {
1282
+ #unsafe_token impl #impl_generics :: cxx:: private:: SharedPtrTarget for #ident #ty_generics {
1259
1283
const __NAME: & ' static dyn :: std:: fmt:: Display = & #name;
1260
1284
unsafe fn __null( new: * mut :: std:: ffi:: c_void) {
1261
1285
extern "C" {
@@ -1300,13 +1324,19 @@ fn expand_weak_ptr(ident: &Ident, types: &Types, explicit_impl: Option<&Impl>) -
1300
1324
let link_upgrade = format ! ( "{}upgrade" , prefix) ;
1301
1325
let link_drop = format ! ( "{}drop" , prefix) ;
1302
1326
1327
+ let ( impl_generics, ty_generics) = if let Some ( imp) = explicit_impl {
1328
+ ( & imp. impl_generics , & imp. ty_generics )
1329
+ } else {
1330
+ ( resolve. generics , resolve. generics )
1331
+ } ;
1332
+
1303
1333
let begin_span =
1304
1334
explicit_impl. map_or_else ( Span :: call_site, |explicit| explicit. impl_token . span ) ;
1305
1335
let end_span = explicit_impl. map_or_else ( Span :: call_site, |explicit| explicit. brace_token . span ) ;
1306
1336
let unsafe_token = format_ident ! ( "unsafe" , span = begin_span) ;
1307
1337
1308
1338
quote_spanned ! { end_span=>
1309
- #unsafe_token impl :: cxx:: private:: WeakPtrTarget for #ident {
1339
+ #unsafe_token impl #impl_generics :: cxx:: private:: WeakPtrTarget for #ident #ty_generics {
1310
1340
const __NAME: & ' static dyn :: std:: fmt:: Display = & #name;
1311
1341
unsafe fn __null( new: * mut :: std:: ffi:: c_void) {
1312
1342
extern "C" {
@@ -1363,25 +1393,31 @@ fn expand_cxx_vector(elem: &Ident, explicit_impl: Option<&Impl>, types: &Types)
1363
1393
let link_unique_ptr_release = format ! ( "{}release" , unique_ptr_prefix) ;
1364
1394
let link_unique_ptr_drop = format ! ( "{}drop" , unique_ptr_prefix) ;
1365
1395
1396
+ let ( impl_generics, ty_generics) = if let Some ( imp) = explicit_impl {
1397
+ ( & imp. impl_generics , & imp. ty_generics )
1398
+ } else {
1399
+ ( resolve. generics , resolve. generics )
1400
+ } ;
1401
+
1366
1402
let begin_span =
1367
1403
explicit_impl. map_or_else ( Span :: call_site, |explicit| explicit. impl_token . span ) ;
1368
1404
let end_span = explicit_impl. map_or_else ( Span :: call_site, |explicit| explicit. brace_token . span ) ;
1369
1405
let unsafe_token = format_ident ! ( "unsafe" , span = begin_span) ;
1370
1406
1371
1407
quote_spanned ! { end_span=>
1372
- #unsafe_token impl :: cxx:: private:: VectorElement for #elem {
1408
+ #unsafe_token impl #impl_generics :: cxx:: private:: VectorElement for #elem #ty_generics {
1373
1409
const __NAME: & ' static dyn :: std:: fmt:: Display = & #name;
1374
1410
fn __vector_size( v: & :: cxx:: CxxVector <Self >) -> usize {
1375
1411
extern "C" {
1376
1412
#[ link_name = #link_size]
1377
- fn __vector_size( _: & :: cxx:: CxxVector <#elem>) -> usize ;
1413
+ fn __vector_size #impl_generics ( _: & :: cxx:: CxxVector <#elem #ty_generics >) -> usize ;
1378
1414
}
1379
1415
unsafe { __vector_size( v) }
1380
1416
}
1381
1417
unsafe fn __get_unchecked( v: * mut :: cxx:: CxxVector <Self >, pos: usize ) -> * mut Self {
1382
1418
extern "C" {
1383
1419
#[ link_name = #link_get_unchecked]
1384
- fn __get_unchecked( _: * mut :: cxx:: CxxVector <#elem>, _: usize ) -> * mut #elem;
1420
+ fn __get_unchecked #impl_generics ( _: * mut :: cxx:: CxxVector <#elem #ty_generics >, _: usize ) -> * mut #elem #ty_generics ;
1385
1421
}
1386
1422
__get_unchecked( v, pos)
1387
1423
}
@@ -1397,7 +1433,7 @@ fn expand_cxx_vector(elem: &Ident, explicit_impl: Option<&Impl>, types: &Types)
1397
1433
unsafe fn __unique_ptr_raw( raw: * mut :: cxx:: CxxVector <Self >) -> * mut :: std:: ffi:: c_void {
1398
1434
extern "C" {
1399
1435
#[ link_name = #link_unique_ptr_raw]
1400
- fn __unique_ptr_raw( this: * mut * mut :: std:: ffi:: c_void, raw: * mut :: cxx:: CxxVector <#elem>) ;
1436
+ fn __unique_ptr_raw #impl_generics ( this: * mut * mut :: std:: ffi:: c_void, raw: * mut :: cxx:: CxxVector <#elem #ty_generics >) ;
1401
1437
}
1402
1438
let mut repr = :: std:: ptr:: null_mut:: <:: std:: ffi:: c_void>( ) ;
1403
1439
__unique_ptr_raw( & mut repr, raw) ;
@@ -1406,14 +1442,14 @@ fn expand_cxx_vector(elem: &Ident, explicit_impl: Option<&Impl>, types: &Types)
1406
1442
unsafe fn __unique_ptr_get( repr: * mut :: std:: ffi:: c_void) -> * const :: cxx:: CxxVector <Self > {
1407
1443
extern "C" {
1408
1444
#[ link_name = #link_unique_ptr_get]
1409
- fn __unique_ptr_get( this: * const * mut :: std:: ffi:: c_void) -> * const :: cxx:: CxxVector <#elem>;
1445
+ fn __unique_ptr_get #impl_generics ( this: * const * mut :: std:: ffi:: c_void) -> * const :: cxx:: CxxVector <#elem #ty_generics >;
1410
1446
}
1411
1447
__unique_ptr_get( & repr)
1412
1448
}
1413
1449
unsafe fn __unique_ptr_release( mut repr: * mut :: std:: ffi:: c_void) -> * mut :: cxx:: CxxVector <Self > {
1414
1450
extern "C" {
1415
1451
#[ link_name = #link_unique_ptr_release]
1416
- fn __unique_ptr_release( this: * mut * mut :: std:: ffi:: c_void) -> * mut :: cxx:: CxxVector <#elem>;
1452
+ fn __unique_ptr_release #impl_generics ( this: * mut * mut :: std:: ffi:: c_void) -> * mut :: cxx:: CxxVector <#elem #ty_generics >;
1417
1453
}
1418
1454
__unique_ptr_release( & mut repr)
1419
1455
}
0 commit comments