@@ -552,15 +552,16 @@ static bool recordDerivesCopy(const clang::RecordDecl *decl) {
552552 for (auto f : decl->fields ()) {
553553 // Records that contain std::vector, std::array, std::string or anything
554554 // that is translated to Vec<>, do not derive Copy
555- if (Mapper::Map (f->getType ()).starts_with (" Vec<" )) {
555+ auto mapped = Mapper::Map (f->getType ());
556+ if (mapped.starts_with (" Vec<" )) {
556557 return false ;
557558 }
558559
559560 if (IsUniquePtr (f->getType ())) {
560561 return false ;
561562 }
562563
563- if (Mapper::Map (f-> getType ()) .starts_with (" BTreeMap<" )) {
564+ if (mapped .starts_with (" BTreeMap<" )) {
564565 return false ;
565566 }
566567
@@ -653,7 +654,7 @@ void Converter::EmitRustStruct(clang::RecordDecl *decl) {
653654 auto struct_name = GetRecordName (cxx);
654655
655656 ConvertCXXMethodDecls (
656- cxx, std::string ( keyword::kImpl ) + ' ' + struct_name,
657+ cxx, std::format ( " {} {} " , keyword::kImpl , struct_name) ,
657658 [](const auto *method) {
658659 return !method->isImplicit () &&
659660 !(method->getDefinition () &&
@@ -701,7 +702,7 @@ bool Converter::VisitCXXRecordDecl(clang::CXXRecordDecl *decl) {
701702 if (decl->isStruct () || decl->isClass ()) {
702703 for (auto c : GetTemplateInstantiatedCtors (decl)) {
703704 if (!decl_ids_.contains (GetID (c))) {
704- StrCat (std::string ( keyword::kImpl ) + ' ' + GetRecordName (decl));
705+ StrCat (keyword::kImpl , GetRecordName (decl));
705706 PushBrace brace (*this );
706707 VisitCXXMethodDecl (c);
707708 }
@@ -1875,7 +1876,7 @@ bool Converter::VisitBinaryOperator(clang::BinaryOperator *expr) {
18751876 auto *rhs = expr->getRHS ();
18761877 auto lhs_type = lhs->getType ();
18771878 auto rhs_type = rhs->getType ();
1878- std::string opcode_as_string = expr->getOpcodeStr (). str ();
1879+ std::string_view opcode_as_string = expr->getOpcodeStr ();
18791880
18801881 if (auto *cmpd_assign_op =
18811882 llvm::dyn_cast<clang::CompoundAssignOperator>(expr);
@@ -1901,7 +1902,9 @@ bool Converter::VisitBinaryOperator(clang::BinaryOperator *expr) {
19011902 Convert (lhs);
19021903 ConvertCast (computation_result_type);
19031904 }
1904- StrCat (std::regex_replace (opcode_as_string, std::regex (" =" ), " " ));
1905+ std::string op (opcode_as_string);
1906+ op.erase (std::remove (op.begin (), op.end (), ' =' ), op.end ());
1907+ StrCat (op);
19051908 Convert (rhs);
19061909 }
19071910 if (lhs_type->isBooleanType ()) {
@@ -2206,7 +2209,7 @@ bool Converter::VisitParenExpr(clang::ParenExpr *expr) {
22062209bool Converter::ConvertCXXOperatorCallExpr (clang::CXXOperatorCallExpr *expr) {
22072210 switch (expr->getOperator ()) {
22082211 case clang::OverloadedOperatorKind::OO_Equal:
2209- ConvertAssignment (expr->getArg (0 ), expr->getArg (1 ), token:: kAssign );
2212+ ConvertAssignment (expr->getArg (0 ), expr->getArg (1 ), " = " );
22102213 break ;
22112214 case clang::OverloadedOperatorKind::OO_Star:
22122215 case clang::OverloadedOperatorKind::OO_Arrow:
@@ -2785,40 +2788,43 @@ std::string Converter::GetDefaultAsString(clang::QualType qual_type) {
27852788 } else if (auto *array_type =
27862789 clang::dyn_cast<clang::IncompleteArrayType>(qual_type)) {
27872790 return GetDefaultAsString (array_type->getElementType ());
2788- } else if (Mapper::ToString (qual_type) == " struct std::pair" ) {
2789- auto template_args = *GetTemplateArgs (qual_type);
2790- auto first_type = template_args[0 ].getAsType ();
2791- auto second_type = template_args[1 ].getAsType ();
2792- return std::format (" ({}, {})" , GetDefaultAsString (first_type),
2793- GetDefaultAsString (second_type));
2794- } else if (Mapper::ToString (qual_type).contains (" std::array" )) {
2795- assert (GetTemplateArgs (qual_type).has_value ());
2796- auto template_args = *GetTemplateArgs (qual_type);
2797- assert (template_args.size () == 2 );
2798- auto array_size = template_args[1 ];
2799- unsigned size = 0 ;
2800- switch (array_size.getKind ()) {
2801- case clang::TemplateArgument::Expression: {
2802- auto array_size_expr = array_size.getAsExpr ();
2803- assert (array_size_expr && !array_size_expr->isValueDependent ());
2804- clang::Expr::EvalResult result;
2805- ENSURE (array_size_expr->EvaluateAsInt (result, ctx_));
2806- size = result.Val .getInt ().getZExtValue ();
2807- break ;
2808- }
2809- case clang::TemplateArgument::Integral: {
2810- size = array_size.getAsIntegral ().getZExtValue ();
2811- break ;
2812- }
2813- default :
2814- assert (0 && " Unsupported array size kind" );
2815- break ;
2816- }
2817- return std::format (
2818- " std::array::from_fn::<_, {}, _>(|_| Default::default()).to_vec()" ,
2819- size);
28202791 } else {
2821- return GetDefaultAsStringFallback (qual_type);
2792+ auto qual_type_str = Mapper::ToString (qual_type);
2793+ if (qual_type_str == " struct std::pair" ) {
2794+ auto template_args = *GetTemplateArgs (qual_type);
2795+ auto first_type = template_args[0 ].getAsType ();
2796+ auto second_type = template_args[1 ].getAsType ();
2797+ return std::format (" ({}, {})" , GetDefaultAsString (first_type),
2798+ GetDefaultAsString (second_type));
2799+ } else if (qual_type_str.contains (" std::array" )) {
2800+ assert (GetTemplateArgs (qual_type).has_value ());
2801+ auto template_args = *GetTemplateArgs (qual_type);
2802+ assert (template_args.size () == 2 );
2803+ auto array_size = template_args[1 ];
2804+ unsigned size = 0 ;
2805+ switch (array_size.getKind ()) {
2806+ case clang::TemplateArgument::Expression: {
2807+ auto array_size_expr = array_size.getAsExpr ();
2808+ assert (array_size_expr && !array_size_expr->isValueDependent ());
2809+ clang::Expr::EvalResult result;
2810+ ENSURE (array_size_expr->EvaluateAsInt (result, ctx_));
2811+ size = result.Val .getInt ().getZExtValue ();
2812+ break ;
2813+ }
2814+ case clang::TemplateArgument::Integral: {
2815+ size = array_size.getAsIntegral ().getZExtValue ();
2816+ break ;
2817+ }
2818+ default :
2819+ assert (0 && " Unsupported array size kind" );
2820+ break ;
2821+ }
2822+ return std::format (
2823+ " std::array::from_fn::<_, {}, _>(|_| Default::default()).to_vec()" ,
2824+ size);
2825+ } else {
2826+ return GetDefaultAsStringFallback (qual_type);
2827+ }
28222828 }
28232829}
28242830
0 commit comments