@@ -2604,15 +2604,16 @@ ConverterRefCount::TraitName(const clang::CXXRecordDecl *decl) const {
26042604 return GetRecordName (decl) + " Impl" ;
26052605}
26062606
2607- std::string
2608- ConverterRefCount::TraitHeader (const clang::CXXRecordDecl *decl) const {
2609- return std::format (" pub trait {}" , TraitName (decl));
2610- }
2611-
2612- std::string
2613- ConverterRefCount::ImplHeader (const clang::CXXRecordDecl *decl) const {
2614- return std::format (" impl {} for Ptr<{}>" , TraitName (decl),
2615- GetRecordName (decl));
2607+ Converter::MethodsOnPtr &
2608+ ConverterRefCount::MethodsOnPtrFor (const clang::CXXRecordDecl *decl) {
2609+ auto name = GetRecordName (decl);
2610+ auto [it, inserted] = methods_on_ptr_.try_emplace (name);
2611+ if (inserted) {
2612+ it->second .trait_header = std::format (" pub trait {}" , TraitName (decl));
2613+ it->second .impl_header =
2614+ std::format (" impl {} for Ptr<{}>" , TraitName (decl), name);
2615+ }
2616+ return it->second ;
26162617}
26172618
26182619bool ConverterRefCount::ConvertOutOfLineMethod (clang::CXXMethodDecl *decl) {
@@ -2624,7 +2625,7 @@ bool ConverterRefCount::ConvertOutOfLineMethod(clang::CXXMethodDecl *decl) {
26242625 PushMethodTarget push (*this , MethodTarget::PtrImpl);
26252626 ConvertCXXMethodDecl (decl);
26262627 }
2627- deferred_impls_[ ImplHeader (decl->getParent ())] += std::move (buf).str ();
2628+ MethodsOnPtrFor (decl->getParent ()). impl_body += std::move (buf).str ();
26282629 return false ;
26292630}
26302631
@@ -2637,7 +2638,7 @@ void ConverterRefCount::ConvertMethodOnPtr(clang::CXXMethodDecl *method) {
26372638 PushMethodTarget push (*this , MethodTarget::TraitDecl);
26382639 ConvertCXXMethodDecl (method);
26392640 }
2640- deferred_impls_[ TraitHeader (record)] += std::move (buf).str ();
2641+ MethodsOnPtrFor (record). trait_body += std::move (buf).str ();
26412642 }
26422643 if (!method->isThisDeclarationADefinition ()) {
26432644 return ;
@@ -2647,7 +2648,7 @@ void ConverterRefCount::ConvertMethodOnPtr(clang::CXXMethodDecl *method) {
26472648 PushMethodTarget push (*this , MethodTarget::PtrImpl);
26482649 VisitCXXMethodDecl (method);
26492650 }
2650- deferred_impls_[ ImplHeader (record)] += std::move (buf).str ();
2651+ MethodsOnPtrFor (record). impl_body += std::move (buf).str ();
26512652}
26522653
26532654void ConverterRefCount::ConvertLateInstantiatedMethods (
@@ -2683,9 +2684,9 @@ void ConverterRefCount::ConvertCXXRecordMethods(clang::CXXRecordDecl *decl) {
26832684 }
26842685
26852686 if (!GetUserDefinedDestructor (decl) && HasFieldsNeedingDestruction (decl)) {
2686- deferred_impls_[ TraitHeader (decl)] +=
2687+ MethodsOnPtrFor (decl). trait_body +=
26872688 std::format (" fn {}(&self);\n " , kDestructorName );
2688- deferred_impls_[ ImplHeader (decl)] += std::format (
2689+ MethodsOnPtrFor (decl). impl_body += std::format (
26892690 " fn {}(&self) {{ {} }}\n " , kDestructorName , DestroyMembers (decl));
26902691 }
26912692}
0 commit comments