@@ -2,7 +2,7 @@ use crate::syntax::atom::Atom::*;
2
2
use crate :: syntax:: attrs:: { self , OtherAttrs } ;
3
3
use crate :: syntax:: cfg:: CfgExpr ;
4
4
use crate :: syntax:: file:: Module ;
5
- use crate :: syntax:: instantiate:: { ImplKey , NamedImplKey } ;
5
+ use crate :: syntax:: instantiate:: { CxxVectorPayloadImplKey , ImplKey , NamedImplKey , PtrMutability } ;
6
6
use crate :: syntax:: qualified:: QualifiedName ;
7
7
use crate :: syntax:: report:: Errors ;
8
8
use crate :: syntax:: symbol:: Symbol ;
@@ -108,8 +108,8 @@ fn expand(ffi: Module, doc: Doc, attrs: OtherAttrs, apis: &[Api], types: &Types)
108
108
ImplKey :: WeakPtr ( ident) => {
109
109
expanded. extend ( expand_weak_ptr ( ident, types, explicit_impl) ) ;
110
110
}
111
- ImplKey :: CxxVector ( ident ) => {
112
- expanded. extend ( expand_cxx_vector ( ident , explicit_impl, types) ) ;
111
+ ImplKey :: CxxVector ( payload ) => {
112
+ expanded. extend ( expand_cxx_vector ( payload , explicit_impl, types) ) ;
113
113
}
114
114
}
115
115
}
@@ -1670,21 +1670,31 @@ fn expand_weak_ptr(key: NamedImplKey, types: &Types, explicit_impl: Option<&Impl
1670
1670
}
1671
1671
1672
1672
fn expand_cxx_vector (
1673
- key : NamedImplKey ,
1673
+ payload : CxxVectorPayloadImplKey ,
1674
1674
explicit_impl : Option < & Impl > ,
1675
1675
types : & Types ,
1676
1676
) -> TokenStream {
1677
+ let ( ptr_prefix, key, ty_prefix, elem_trait) = match payload {
1678
+ CxxVectorPayloadImplKey :: Named ( id) => ( "" , id, quote ! { } , quote ! { :: cxx:: private:: VectorElement } ) ,
1679
+ CxxVectorPayloadImplKey :: Ptr ( id, PtrMutability :: Const ) => ( "ptrc$" , id, quote ! { * const } , quote ! { :: cxx:: private:: ConstPtrVectorElement } ) ,
1680
+ CxxVectorPayloadImplKey :: Ptr ( id, PtrMutability :: Mut ) => ( "ptrm$" , id, quote ! { * mut } , quote ! { :: cxx:: private:: MutPtrVectorElement } ) ,
1681
+ } ;
1677
1682
let elem = key. rust ;
1678
1683
let name = elem. to_string ( ) ;
1679
1684
let resolve = types. resolve ( elem) ;
1680
- let prefix = format ! ( "cxxbridge1$std$vector${}$" , resolve. name. to_symbol( ) ) ;
1685
+ let prefix = format ! (
1686
+ "cxxbridge1$std$vector${}{}$" ,
1687
+ ptr_prefix,
1688
+ resolve. name. to_symbol( )
1689
+ ) ;
1681
1690
let link_new = format ! ( "{}new" , prefix) ;
1682
1691
let link_size = format ! ( "{}size" , prefix) ;
1683
1692
let link_get_unchecked = format ! ( "{}get_unchecked" , prefix) ;
1684
1693
let link_push_back = format ! ( "{}push_back" , prefix) ;
1685
1694
let link_pop_back = format ! ( "{}pop_back" , prefix) ;
1686
1695
let unique_ptr_prefix = format ! (
1687
- "cxxbridge1$unique_ptr$std$vector${}$" ,
1696
+ "cxxbridge1$unique_ptr$std$vector${}{}$" ,
1697
+ ptr_prefix,
1688
1698
resolve. name. to_symbol( ) ,
1689
1699
) ;
1690
1700
let link_unique_ptr_null = format ! ( "{}null" , unique_ptr_prefix) ;
@@ -1694,6 +1704,7 @@ fn expand_cxx_vector(
1694
1704
let link_unique_ptr_drop = format ! ( "{}drop" , unique_ptr_prefix) ;
1695
1705
1696
1706
let ( impl_generics, ty_generics) = generics:: split_for_impl ( key, explicit_impl, resolve) ;
1707
+ let impl_target = quote ! { #ty_prefix #elem #ty_generics } ;
1697
1708
1698
1709
let begin_span = explicit_impl. map_or ( key. begin_span , |explicit| explicit. impl_token . span ) ;
1699
1710
let end_span = explicit_impl. map_or ( key. end_span , |explicit| explicit. brace_token . span . join ( ) ) ;
@@ -1702,75 +1713,76 @@ fn expand_cxx_vector(
1702
1713
let can_pass_element_by_value = types. is_maybe_trivial ( elem) ;
1703
1714
let by_value_methods = if can_pass_element_by_value {
1704
1715
Some ( quote_spanned ! { end_span=>
1705
- unsafe fn __push_back(
1706
- this: :: cxx:: core:: pin:: Pin <& mut :: cxx:: CxxVector <Self >>,
1707
- value: & mut :: cxx:: core:: mem:: ManuallyDrop <Self >,
1708
- ) {
1709
- extern "C" {
1710
- #[ link_name = #link_push_back]
1711
- fn __push_back #impl_generics(
1712
- this: :: cxx:: core:: pin:: Pin <& mut :: cxx:: CxxVector <#elem #ty_generics>>,
1713
- value: * mut :: cxx:: core:: ffi:: c_void,
1714
- ) ;
1715
- }
1716
- unsafe {
1717
- __push_back(
1718
- this,
1719
- value as * mut :: cxx:: core:: mem:: ManuallyDrop <Self > as * mut :: cxx:: core:: ffi:: c_void,
1720
- ) ;
1721
- }
1722
- }
1723
- unsafe fn __pop_back(
1724
- this: :: cxx:: core:: pin:: Pin <& mut :: cxx:: CxxVector <Self >>,
1725
- out: & mut :: cxx:: core:: mem:: MaybeUninit <Self >,
1726
- ) {
1727
- extern "C" {
1728
- #[ link_name = #link_pop_back]
1729
- fn __pop_back #impl_generics(
1730
- this: :: cxx:: core:: pin:: Pin <& mut :: cxx:: CxxVector <#elem #ty_generics>>,
1731
- out: * mut :: cxx:: core:: ffi:: c_void,
1732
- ) ;
1716
+ unsafe fn __push_back(
1717
+ this: :: cxx:: core:: pin:: Pin <& mut :: cxx:: CxxVector <#ty_prefix Self >>,
1718
+ value: & mut :: cxx:: core:: mem:: ManuallyDrop <#ty_prefix Self >,
1719
+ ) {
1720
+ extern "C" {
1721
+ #[ link_name = #link_push_back]
1722
+ fn __push_back #impl_generics(
1723
+ this: :: cxx:: core:: pin:: Pin <& mut :: cxx:: CxxVector <#impl_target>>,
1724
+ value: * mut :: cxx:: core:: ffi:: c_void,
1725
+ ) ;
1726
+ }
1727
+ unsafe {
1728
+ __push_back(
1729
+ this,
1730
+ value as * mut :: cxx:: core:: mem:: ManuallyDrop <#ty_prefix Self > as * mut :: cxx:: core:: ffi:: c_void,
1731
+ ) ;
1732
+ }
1733
1733
}
1734
- unsafe {
1735
- __pop_back(
1736
- this,
1737
- out as * mut :: cxx:: core:: mem:: MaybeUninit <Self > as * mut :: cxx:: core:: ffi:: c_void,
1738
- ) ;
1734
+ unsafe fn __pop_back(
1735
+ this: :: cxx:: core:: pin:: Pin <& mut :: cxx:: CxxVector <#ty_prefix Self >>,
1736
+ out: & mut :: cxx:: core:: mem:: MaybeUninit <#ty_prefix Self >,
1737
+ ) {
1738
+ extern "C" {
1739
+ #[ link_name = #link_pop_back]
1740
+ fn __pop_back #impl_generics(
1741
+ this: :: cxx:: core:: pin:: Pin <& mut :: cxx:: CxxVector <#impl_target>>,
1742
+ out: * mut :: cxx:: core:: ffi:: c_void,
1743
+ ) ;
1744
+ }
1745
+ unsafe {
1746
+ __pop_back(
1747
+ this,
1748
+ out as * mut :: cxx:: core:: mem:: MaybeUninit <#ty_prefix Self > as * mut :: cxx:: core:: ffi:: c_void,
1749
+ ) ;
1750
+ }
1739
1751
}
1740
- }
1741
- } )
1752
+ } )
1742
1753
} else {
1743
1754
None
1744
1755
} ;
1745
1756
1746
1757
quote_spanned ! { end_span=>
1747
- #unsafe_token impl #impl_generics :: cxx:: private:: VectorElement for #elem #ty_generics {
1758
+ #unsafe_token impl #impl_generics #elem_trait for #elem #ty_generics {
1759
+ #[ doc( hidden) ]
1748
1760
fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter <' _>) -> :: cxx:: core:: fmt:: Result {
1749
1761
f. write_str( #name)
1750
1762
}
1751
- fn __vector_new( ) -> * mut :: cxx:: CxxVector <Self > {
1763
+ fn __vector_new( ) -> * mut :: cxx:: CxxVector <#ty_prefix Self > {
1752
1764
extern "C" {
1753
1765
#[ link_name = #link_new]
1754
- fn __vector_new #impl_generics( ) -> * mut :: cxx:: CxxVector <#elem #ty_generics >;
1766
+ fn __vector_new #impl_generics( ) -> * mut :: cxx:: CxxVector <#impl_target >;
1755
1767
}
1756
1768
unsafe { __vector_new( ) }
1757
1769
}
1758
- fn __vector_size( v: & :: cxx:: CxxVector <Self >) -> usize {
1770
+ fn __vector_size( v: & :: cxx:: CxxVector <#ty_prefix Self >) -> usize {
1759
1771
extern "C" {
1760
1772
#[ link_name = #link_size]
1761
- fn __vector_size #impl_generics( _: & :: cxx:: CxxVector <#elem #ty_generics >) -> usize ;
1773
+ fn __vector_size #impl_generics( _: & :: cxx:: CxxVector <#impl_target >) -> usize ;
1762
1774
}
1763
1775
unsafe { __vector_size( v) }
1764
1776
}
1765
- unsafe fn __get_unchecked( v: * mut :: cxx:: CxxVector <Self >, pos: usize ) -> * mut Self {
1777
+ unsafe fn __get_unchecked( v: * mut :: cxx:: CxxVector <#ty_prefix Self >, pos: usize ) -> * mut #ty_prefix Self {
1766
1778
extern "C" {
1767
1779
#[ link_name = #link_get_unchecked]
1768
1780
fn __get_unchecked #impl_generics(
1769
- v: * mut :: cxx:: CxxVector <#elem #ty_generics >,
1781
+ v: * mut :: cxx:: CxxVector <#impl_target >,
1770
1782
pos: usize ,
1771
1783
) -> * mut :: cxx:: core:: ffi:: c_void;
1772
1784
}
1773
- unsafe { __get_unchecked( v, pos) as * mut Self }
1785
+ unsafe { __get_unchecked( v, pos) as * mut #ty_prefix Self }
1774
1786
}
1775
1787
#by_value_methods
1776
1788
fn __unique_ptr_null( ) -> :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void> {
@@ -1784,28 +1796,28 @@ fn expand_cxx_vector(
1784
1796
}
1785
1797
repr
1786
1798
}
1787
- unsafe fn __unique_ptr_raw( raw: * mut :: cxx:: CxxVector <Self >) -> :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void> {
1799
+ unsafe fn __unique_ptr_raw( raw: * mut :: cxx:: CxxVector <#ty_prefix Self >) -> :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void> {
1788
1800
extern "C" {
1789
1801
#[ link_name = #link_unique_ptr_raw]
1790
- fn __unique_ptr_raw #impl_generics( this: * mut :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>, raw: * mut :: cxx:: CxxVector <#elem #ty_generics >) ;
1802
+ fn __unique_ptr_raw #impl_generics( this: * mut :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>, raw: * mut :: cxx:: CxxVector <#impl_target >) ;
1791
1803
}
1792
1804
let mut repr = :: cxx:: core:: mem:: MaybeUninit :: uninit( ) ;
1793
1805
unsafe {
1794
1806
__unique_ptr_raw( & mut repr, raw) ;
1795
1807
}
1796
1808
repr
1797
1809
}
1798
- unsafe fn __unique_ptr_get( repr: :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>) -> * const :: cxx:: CxxVector <Self > {
1810
+ unsafe fn __unique_ptr_get( repr: :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>) -> * const :: cxx:: CxxVector <#ty_prefix Self > {
1799
1811
extern "C" {
1800
1812
#[ link_name = #link_unique_ptr_get]
1801
- fn __unique_ptr_get #impl_generics( this: * const :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>) -> * const :: cxx:: CxxVector <#elem #ty_generics >;
1813
+ fn __unique_ptr_get #impl_generics( this: * const :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>) -> * const :: cxx:: CxxVector <#impl_target >;
1802
1814
}
1803
1815
unsafe { __unique_ptr_get( & repr) }
1804
1816
}
1805
- unsafe fn __unique_ptr_release( mut repr: :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>) -> * mut :: cxx:: CxxVector <Self > {
1817
+ unsafe fn __unique_ptr_release( mut repr: :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>) -> * mut :: cxx:: CxxVector <#ty_prefix Self > {
1806
1818
extern "C" {
1807
1819
#[ link_name = #link_unique_ptr_release]
1808
- fn __unique_ptr_release #impl_generics( this: * mut :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>) -> * mut :: cxx:: CxxVector <#elem #ty_generics >;
1820
+ fn __unique_ptr_release #impl_generics( this: * mut :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void>) -> * mut :: cxx:: CxxVector <#impl_target >;
1809
1821
}
1810
1822
unsafe { __unique_ptr_release( & mut repr) }
1811
1823
}
0 commit comments