@@ -3,7 +3,7 @@ use crate::gen::nested::NamespaceEntries;
3
3
use crate :: gen:: out:: OutFile ;
4
4
use crate :: gen:: { builtin, include, Opt } ;
5
5
use crate :: syntax:: atom:: Atom :: { self , * } ;
6
- use crate :: syntax:: instantiate:: { ImplKey , NamedImplKey } ;
6
+ use crate :: syntax:: instantiate:: { CxxVectorPayloadImplKey , ImplKey , NamedImplKey , PtrMutability } ;
7
7
use crate :: syntax:: map:: UnorderedMap as Map ;
8
8
use crate :: syntax:: set:: UnorderedSet ;
9
9
use crate :: syntax:: symbol:: { self , Symbol } ;
@@ -1352,6 +1352,7 @@ fn write_space_after_type(out: &mut OutFile, ty: &Type) {
1352
1352
enum UniquePtr < ' a > {
1353
1353
Ident ( & ' a Ident ) ,
1354
1354
CxxVector ( & ' a Ident ) ,
1355
+ CxxVectorPtr ( PtrMutability , & ' a Ident ) ,
1355
1356
}
1356
1357
1357
1358
trait ToTypename {
@@ -1371,6 +1372,17 @@ impl<'a> ToTypename for UniquePtr<'a> {
1371
1372
UniquePtr :: CxxVector ( element) => {
1372
1373
format ! ( "::std::vector<{}>" , element. to_typename( types) )
1373
1374
}
1375
+ UniquePtr :: CxxVectorPtr ( mutability, element) => {
1376
+ let const_prefix = match mutability {
1377
+ PtrMutability :: Const => "const " ,
1378
+ PtrMutability :: Mut => "" ,
1379
+ } ;
1380
+ format ! (
1381
+ "::std::vector<{}{}*>" ,
1382
+ const_prefix,
1383
+ element. to_typename( types)
1384
+ )
1385
+ }
1374
1386
}
1375
1387
}
1376
1388
}
@@ -1392,6 +1404,13 @@ impl<'a> ToMangled for UniquePtr<'a> {
1392
1404
UniquePtr :: CxxVector ( element) => {
1393
1405
symbol:: join ( & [ & "std" , & "vector" , & element. to_mangled ( types) ] )
1394
1406
}
1407
+ UniquePtr :: CxxVectorPtr ( mutability, element) => {
1408
+ let prefix = match mutability {
1409
+ PtrMutability :: Const => "ptrc" ,
1410
+ PtrMutability :: Mut => "ptrm" ,
1411
+ } ;
1412
+ symbol:: join ( & [ & "std" , & "vector" , & prefix, & element. to_mangled ( types) ] )
1413
+ }
1395
1414
}
1396
1415
}
1397
1416
}
@@ -1412,7 +1431,7 @@ fn write_generic_instantiations(out: &mut OutFile) {
1412
1431
ImplKey :: UniquePtr ( ident) => write_unique_ptr ( out, ident) ,
1413
1432
ImplKey :: SharedPtr ( ident) => write_shared_ptr ( out, ident) ,
1414
1433
ImplKey :: WeakPtr ( ident) => write_weak_ptr ( out, ident) ,
1415
- ImplKey :: CxxVector ( ident ) => write_cxx_vector ( out, ident ) ,
1434
+ ImplKey :: CxxVector ( payload ) => write_cxx_vector ( out, payload ) ,
1416
1435
}
1417
1436
}
1418
1437
out. end_block ( Block :: ExternC ) ;
@@ -1639,21 +1658,21 @@ fn write_unique_ptr_common(out: &mut OutFile, ty: UniquePtr) {
1639
1658
// bindings for a "new" method anyway. But the Rust code can't be called
1640
1659
// for Opaque types because the 'new' method is not implemented.
1641
1660
UniquePtr :: Ident ( ident) => out. types . is_maybe_trivial ( ident) ,
1642
- UniquePtr :: CxxVector ( _) => false ,
1661
+ UniquePtr :: CxxVector ( _) | UniquePtr :: CxxVectorPtr ( .. ) => false ,
1643
1662
} ;
1644
1663
1645
1664
let conditional_delete = match ty {
1646
1665
UniquePtr :: Ident ( ident) => {
1647
1666
!out. types . structs . contains_key ( ident) && !out. types . enums . contains_key ( ident)
1648
1667
}
1649
- UniquePtr :: CxxVector ( _) => false ,
1668
+ UniquePtr :: CxxVector ( _) | UniquePtr :: CxxVectorPtr ( .. ) => false ,
1650
1669
} ;
1651
1670
1652
1671
if conditional_delete {
1653
1672
out. builtin . is_complete = true ;
1654
1673
let definition = match ty {
1655
1674
UniquePtr :: Ident ( ty) => & out. types . resolve ( ty) . name . cxx ,
1656
- UniquePtr :: CxxVector ( _) => unreachable ! ( ) ,
1675
+ UniquePtr :: CxxVector ( _) | UniquePtr :: CxxVectorPtr ( .. ) => unreachable ! ( ) ,
1657
1676
} ;
1658
1677
writeln ! (
1659
1678
out,
@@ -1895,7 +1914,17 @@ fn write_weak_ptr(out: &mut OutFile, key: NamedImplKey) {
1895
1914
writeln ! ( out, "}}" ) ;
1896
1915
}
1897
1916
1898
- fn write_cxx_vector ( out : & mut OutFile , key : NamedImplKey ) {
1917
+ fn write_cxx_vector ( out : & mut OutFile , payload : CxxVectorPayloadImplKey ) {
1918
+ let ( key, ptr_prefix, unique_ptr_payload) = match payload {
1919
+ CxxVectorPayloadImplKey :: Named ( id) => ( id, "" , UniquePtr :: CxxVector ( id. rust ) ) ,
1920
+ CxxVectorPayloadImplKey :: Ptr ( id, mutability) => {
1921
+ let prefix = match mutability {
1922
+ PtrMutability :: Const => "ptrc$" ,
1923
+ PtrMutability :: Mut => "ptrm$" ,
1924
+ } ;
1925
+ ( id, prefix, UniquePtr :: CxxVectorPtr ( mutability, id. rust ) )
1926
+ }
1927
+ } ;
1899
1928
let element = key. rust ;
1900
1929
let inner = element. to_typename ( out. types ) ;
1901
1930
let instance = element. to_mangled ( out. types ) ;
@@ -1907,26 +1936,26 @@ fn write_cxx_vector(out: &mut OutFile, key: NamedImplKey) {
1907
1936
begin_function_definition ( out) ;
1908
1937
writeln ! (
1909
1938
out,
1910
- "::std::vector<{}> *cxxbridge1$std$vector${}$new() noexcept {{" ,
1911
- inner, instance,
1939
+ "::std::vector<{}> *cxxbridge1$std$vector${}{} $new() noexcept {{" ,
1940
+ inner, ptr_prefix , instance,
1912
1941
) ;
1913
1942
writeln ! ( out, " return new ::std::vector<{}>();" , inner) ;
1914
1943
writeln ! ( out, "}}" ) ;
1915
1944
1916
1945
begin_function_definition ( out) ;
1917
1946
writeln ! (
1918
1947
out,
1919
- "::std::size_t cxxbridge1$std$vector${}$size(::std::vector<{}> const &s) noexcept {{" ,
1920
- instance, inner,
1948
+ "::std::size_t cxxbridge1$std$vector${}{} $size(const ::std::vector<{}> &s) noexcept {{" ,
1949
+ ptr_prefix , instance, inner,
1921
1950
) ;
1922
1951
writeln ! ( out, " return s.size();" ) ;
1923
1952
writeln ! ( out, "}}" ) ;
1924
1953
1925
1954
begin_function_definition ( out) ;
1926
1955
writeln ! (
1927
1956
out,
1928
- "{} *cxxbridge1$std$vector${}$get_unchecked(::std::vector<{}> *s, ::std::size_t pos) noexcept {{" ,
1929
- inner, instance, inner,
1957
+ "{} *cxxbridge1$std$vector${}{} $get_unchecked(::std::vector<{}> *s, ::std::size_t pos) noexcept {{" ,
1958
+ inner, ptr_prefix , instance, inner,
1930
1959
) ;
1931
1960
writeln ! ( out, " return &(*s)[pos];" ) ;
1932
1961
writeln ! ( out, "}}" ) ;
@@ -1935,8 +1964,8 @@ fn write_cxx_vector(out: &mut OutFile, key: NamedImplKey) {
1935
1964
begin_function_definition ( out) ;
1936
1965
writeln ! (
1937
1966
out,
1938
- "void cxxbridge1$std$vector${}$push_back(::std::vector<{}> *v, {} *value) noexcept {{" ,
1939
- instance, inner, inner,
1967
+ "void cxxbridge1$std$vector${}{} $push_back(::std::vector<{}> *v, {} *value) noexcept {{" ,
1968
+ ptr_prefix , instance, inner, inner,
1940
1969
) ;
1941
1970
writeln ! ( out, " v->push_back(::std::move(*value));" ) ;
1942
1971
writeln ! ( out, " ::rust::destroy(value);" ) ;
@@ -1945,14 +1974,14 @@ fn write_cxx_vector(out: &mut OutFile, key: NamedImplKey) {
1945
1974
begin_function_definition ( out) ;
1946
1975
writeln ! (
1947
1976
out,
1948
- "void cxxbridge1$std$vector${}$pop_back(::std::vector<{}> *v, {} *out) noexcept {{" ,
1949
- instance, inner, inner,
1977
+ "void cxxbridge1$std$vector${}{} $pop_back(::std::vector<{}> *v, {} *out) noexcept {{" ,
1978
+ ptr_prefix , instance, inner, inner,
1950
1979
) ;
1951
1980
writeln ! ( out, " ::new (out) {}(::std::move(v->back()));" , inner) ;
1952
1981
writeln ! ( out, " v->pop_back();" ) ;
1953
1982
writeln ! ( out, "}}" ) ;
1954
1983
}
1955
1984
1956
1985
out. include . memory = true ;
1957
- write_unique_ptr_common ( out, UniquePtr :: CxxVector ( element ) ) ;
1986
+ write_unique_ptr_common ( out, unique_ptr_payload ) ;
1958
1987
}
0 commit comments