Pārlūkot izejas kodu

Move semantic should apply std::move on complex movable fields and exchange

Tatyana Borisova 6 gadi atpakaļ
vecāks
revīzija
4f61a6a27d
2 mainītis faili ar 8 papildinājumiem un 7 dzēšanām
  1. 4 4
      src/generator/classgeneratorbase.cpp
  2. 4 3
      src/generator/templates.h

+ 4 - 4
src/generator/classgeneratorbase.cpp

@@ -277,9 +277,9 @@ void ClassGeneratorBase::printMoveSemantic(const ::google::protobuf::Descriptor
     Indent();
     for (int i = 0; i < message->field_count(); i++) {
         if (isComplexType(message->field(i))) {
-            printField(message->field(i), MoveFieldTemplate);
+            printField(message->field(i), MoveComplexFieldTemplate);
         } else {
-            printField(message->field(i), CopyFieldTemplate);
+            printField(message->field(i), MoveFieldTemplate);
         }
     }
     Outdent();
@@ -291,9 +291,9 @@ void ClassGeneratorBase::printMoveSemantic(const ::google::protobuf::Descriptor
     Indent();
     for (int i = 0; i < message->field_count(); i++) {
         if (isComplexType(message->field(i))) {
-            printField(message->field(i), MoveFieldTemplate);
+            printField(message->field(i), MoveComplexFieldTemplate);
         } else {
-            printField(message->field(i), CopyFieldTemplate);
+            printField(message->field(i), MoveFieldTemplate);
         }
     }
     mPrinter.Print(AssignmentOperatorReturnTemplate);

+ 4 - 3
src/generator/templates.h

@@ -54,12 +54,13 @@ static const char *EnumDefinitionTemplate = "enum $enum$ {\n";
 static const char *EnumFieldTemplate = "$enumvalue$ = $value$,\n";
 static const char *ConstructorTemplate = "$classname$(QObject *parent = nullptr) : QObject(parent)\n";
 static const char *CopyConstructorTemplate = "$classname$(const $classname$ &other) : QObject() {\n";
-static const char *MoveConstructorTemplate = "$classname$(const $classname$ &&other) : QObject() {\n";
+static const char *MoveConstructorTemplate = "$classname$($classname$ &&other) : QObject() {\n";
 static const char *CopyFieldTemplate = "m_$property_name$ = other.m_$property_name$;\n";
-static const char *MoveFieldTemplate = "m_$property_name$ = std::move(other.m_$property_name$);\n";
+static const char *MoveComplexFieldTemplate = "m_$property_name$ = std::move(other.m_$property_name$);\n";
+static const char *MoveFieldTemplate = "m_$property_name$ = std::exchange(other.m_$property_name$, 0);\n";
 static const char *AssignmentOperatorTemplate = "$classname$ &operator =(const $classname$ &other) {\n";
 static const char *AssignmentOperatorReturnTemplate = "return *this;\n";
-static const char *MoveAssignmentOperatorTemplate = "$classname$ &operator =(const $classname$ &&other) {\n";
+static const char *MoveAssignmentOperatorTemplate = "$classname$ &operator =($classname$ &&other) {\n";
 static const char *EqualOperatorTemplate = "bool operator ==(const $type$ &other) const {\n"
                                           "    return ";
 static const char *EqualOperatorPropertyTemplate = "m_$property_name$ == other.m_$property_name$";