@@ -2,7 +2,7 @@ use crate::syntax::atom::Atom::*;
22use crate :: syntax:: attrs:: { self , OtherAttrs } ;
33use crate :: syntax:: cfg:: CfgExpr ;
44use crate :: syntax:: file:: Module ;
5- use crate :: syntax:: instantiate:: { ImplKey , NamedImplKey } ;
5+ use crate :: syntax:: instantiate:: { CxxVectorPayloadImplKey , ImplKey , NamedImplKey , PtrMutability } ;
66use crate :: syntax:: qualified:: QualifiedName ;
77use crate :: syntax:: report:: Errors ;
88use crate :: syntax:: symbol:: Symbol ;
@@ -108,8 +108,8 @@ fn expand(ffi: Module, doc: Doc, attrs: OtherAttrs, apis: &[Api], types: &Types)
108108 ImplKey :: WeakPtr ( ident) => {
109109 expanded. extend ( expand_weak_ptr ( ident, types, explicit_impl) ) ;
110110 }
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) ) ;
113113 }
114114 }
115115 }
@@ -1670,21 +1670,31 @@ fn expand_weak_ptr(key: NamedImplKey, types: &Types, explicit_impl: Option<&Impl
16701670}
16711671
16721672fn expand_cxx_vector (
1673- key : NamedImplKey ,
1673+ payload : CxxVectorPayloadImplKey ,
16741674 explicit_impl : Option < & Impl > ,
16751675 types : & Types ,
16761676) -> 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+ } ;
16771682 let elem = key. rust ;
16781683 let name = elem. to_string ( ) ;
16791684 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+ ) ;
16811690 let link_new = format ! ( "{}new" , prefix) ;
16821691 let link_size = format ! ( "{}size" , prefix) ;
16831692 let link_get_unchecked = format ! ( "{}get_unchecked" , prefix) ;
16841693 let link_push_back = format ! ( "{}push_back" , prefix) ;
16851694 let link_pop_back = format ! ( "{}pop_back" , prefix) ;
16861695 let unique_ptr_prefix = format ! (
1687- "cxxbridge1$unique_ptr$std$vector${}$" ,
1696+ "cxxbridge1$unique_ptr$std$vector${}{}$" ,
1697+ ptr_prefix,
16881698 resolve. name. to_symbol( ) ,
16891699 ) ;
16901700 let link_unique_ptr_null = format ! ( "{}null" , unique_ptr_prefix) ;
@@ -1694,6 +1704,7 @@ fn expand_cxx_vector(
16941704 let link_unique_ptr_drop = format ! ( "{}drop" , unique_ptr_prefix) ;
16951705
16961706 let ( impl_generics, ty_generics) = generics:: split_for_impl ( key, explicit_impl, resolve) ;
1707+ let impl_target = quote ! { #ty_prefix #elem #ty_generics } ;
16971708
16981709 let begin_span = explicit_impl. map_or ( key. begin_span , |explicit| explicit. impl_token . span ) ;
16991710 let end_span = explicit_impl. map_or ( key. end_span , |explicit| explicit. brace_token . span . join ( ) ) ;
@@ -1702,75 +1713,76 @@ fn expand_cxx_vector(
17021713 let can_pass_element_by_value = types. is_maybe_trivial ( elem) ;
17031714 let by_value_methods = if can_pass_element_by_value {
17041715 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+ }
17331733 }
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+ }
17391751 }
1740- }
1741- } )
1752+ } )
17421753 } else {
17431754 None
17441755 } ;
17451756
17461757 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) ]
17481760 fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter <' _>) -> :: cxx:: core:: fmt:: Result {
17491761 f. write_str( #name)
17501762 }
1751- fn __vector_new( ) -> * mut :: cxx:: CxxVector <Self > {
1763+ fn __vector_new( ) -> * mut :: cxx:: CxxVector <#ty_prefix Self > {
17521764 extern "C" {
17531765 #[ 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 >;
17551767 }
17561768 unsafe { __vector_new( ) }
17571769 }
1758- fn __vector_size( v: & :: cxx:: CxxVector <Self >) -> usize {
1770+ fn __vector_size( v: & :: cxx:: CxxVector <#ty_prefix Self >) -> usize {
17591771 extern "C" {
17601772 #[ 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 ;
17621774 }
17631775 unsafe { __vector_size( v) }
17641776 }
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 {
17661778 extern "C" {
17671779 #[ link_name = #link_get_unchecked]
17681780 fn __get_unchecked #impl_generics(
1769- v: * mut :: cxx:: CxxVector <#elem #ty_generics >,
1781+ v: * mut :: cxx:: CxxVector <#impl_target >,
17701782 pos: usize ,
17711783 ) -> * mut :: cxx:: core:: ffi:: c_void;
17721784 }
1773- unsafe { __get_unchecked( v, pos) as * mut Self }
1785+ unsafe { __get_unchecked( v, pos) as * mut #ty_prefix Self }
17741786 }
17751787 #by_value_methods
17761788 fn __unique_ptr_null( ) -> :: cxx:: core:: mem:: MaybeUninit <* mut :: cxx:: core:: ffi:: c_void> {
@@ -1784,28 +1796,28 @@ fn expand_cxx_vector(
17841796 }
17851797 repr
17861798 }
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> {
17881800 extern "C" {
17891801 #[ 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 >) ;
17911803 }
17921804 let mut repr = :: cxx:: core:: mem:: MaybeUninit :: uninit( ) ;
17931805 unsafe {
17941806 __unique_ptr_raw( & mut repr, raw) ;
17951807 }
17961808 repr
17971809 }
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 > {
17991811 extern "C" {
18001812 #[ 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 >;
18021814 }
18031815 unsafe { __unique_ptr_get( & repr) }
18041816 }
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 > {
18061818 extern "C" {
18071819 #[ 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 >;
18091821 }
18101822 unsafe { __unique_ptr_release( & mut repr) }
18111823 }
0 commit comments