瀏覽代碼

Implement extra getter for container types

- Add referense non-constant getter for container types
- Implement and update tests
Alexey Edelev 5 年之前
父節點
當前提交
b657835251

+ 5 - 2
src/generator/protobufclassgenerator.cpp

@@ -421,8 +421,11 @@ void ProtobufClassGenerator::printProperties()
             }
         }
         printField(field, Templates::GetterTemplate);
-        if (field->type() == FieldDescriptor::TYPE_MESSAGE && field->is_repeated() && !field->is_map()) {
-             printField(field, Templates::QmlListGetterTemplate);
+        if (field->is_repeated()) {
+            printField(field, Templates::GetterContainerExtraTemplate);
+            if (field->type() == FieldDescriptor::TYPE_MESSAGE && !field->is_map()) {
+                printField(field, Templates::QmlListGetterTemplate);
+            }
         }
     }
     for (int i = 0; i < mMessage->field_count(); i++) {

+ 4 - 0
src/generator/templates.cpp

@@ -111,6 +111,10 @@ const char *Templates::GetterTemplate = "$type$ $property_name$() const {\n"
                                         "    return m_$property_name$;\n"
                                         "}\n\n";
 
+const char *Templates::GetterContainerExtraTemplate = "$type$ &$property_name$() {\n"
+                                        "    return m_$property_name$;\n"
+                                        "}\n\n";
+
 const char *Templates::QmlListGetterTemplate = "QQmlListProperty<$type_nolist$> $property_name$_l() {\n"
                                                "    return qtprotobuf::ProtobufObjectPrivate::constructQmlListProperty<$type_nolist$>(this, &m_$property_name$);\n"
                                                "}\n\n";

+ 1 - 0
src/generator/templates.h

@@ -79,6 +79,7 @@ public:
     static const char *EqualOperatorPropertyTemplate;
     static const char *NotEqualOperatorTemplate;
     static const char *GetterTemplate;
+    static const char *GetterContainerExtraTemplate;
     static const char *GetterMessageTemplate;
     static const char *SetterTemplateSimpleType;
     static const char *SetterTemplateComplexType;

+ 93 - 0
tests/test_protobuf/simpletest.cpp

@@ -438,6 +438,12 @@ TEST_F(SimpleTest, RepeatedIntMessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<int32List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<int32List>() == int32List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == int32List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt().append(66);
+    ASSERT_TRUE(test.testRepeatedInt() == int32List({1, 2, 3, 4, 5, 66}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == int32List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, RepeatedDoubleMessageTest)
@@ -451,6 +457,12 @@ TEST_F(SimpleTest, RepeatedDoubleMessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<qtprotobuf::DoubleList>({1.0, 2.3, 3, 4.7, 5.9})));
     ASSERT_TRUE(test.property(propertyName).value<qtprotobuf::DoubleList>() == qtprotobuf::DoubleList({1.0, 2.3, 3, 4.7, 5.9}));
     ASSERT_TRUE(test.testRepeatedDouble() == qtprotobuf::DoubleList({1.0, 2.3, 3, 4.7, 5.9}));
+
+    test.testRepeatedDouble().append(6.6);
+    ASSERT_TRUE(test.testRepeatedDouble() == qtprotobuf::DoubleList({1.0, 2.3, 3, 4.7, 5.9, 6.6}));
+
+    test.testRepeatedDouble().pop_back();
+    ASSERT_TRUE(test.testRepeatedDouble() == qtprotobuf::DoubleList({1.0, 2.3, 3, 4.7, 5.9}));
 }
 
 TEST_F(SimpleTest, RepeatedFloatMessageTest)
@@ -464,6 +476,12 @@ TEST_F(SimpleTest, RepeatedFloatMessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<qtprotobuf::FloatList>({1.0f, 2.3f, 3, 4.7f, 5.9f})));
     ASSERT_TRUE(test.property(propertyName).value<qtprotobuf::FloatList>() == qtprotobuf::FloatList({1.0f, 2.3f, 3, 4.7f, 5.9f}));
     ASSERT_TRUE(test.testRepeatedFloat() == qtprotobuf::FloatList({1.0f, 2.3f, 3, 4.7f, 5.9f}));
+
+    test.testRepeatedFloat().append(6.6f);
+    ASSERT_TRUE(test.testRepeatedFloat() == qtprotobuf::FloatList({1.0f, 2.3f, 3, 4.7f, 5.9f, 6.6f}));
+
+    test.testRepeatedFloat().pop_back();
+    ASSERT_TRUE(test.testRepeatedFloat() == qtprotobuf::FloatList({1.0f, 2.3f, 3, 4.7f, 5.9f}));
 }
 
 TEST_F(SimpleTest, RepeatedBytesMessageTest)
@@ -481,6 +499,15 @@ TEST_F(SimpleTest, RepeatedBytesMessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<QByteArrayList>(bList)));
     ASSERT_TRUE(test.property(propertyName).value<QByteArrayList>() == bList);
     ASSERT_TRUE(test.testRepeatedBytes() == bList);
+
+    bList << "\x01\x05\x03\x03";
+    test.testRepeatedBytes() << "\x01\x05\x03\x03";
+    ASSERT_TRUE(test.testRepeatedBytes() == bList);
+
+
+    bList.pop_back();
+    test.testRepeatedBytes().pop_back();
+    ASSERT_TRUE(test.testRepeatedBytes() == bList);
 }
 
 TEST_F(SimpleTest, RepeatedSIntMessageTest)
@@ -494,6 +521,12 @@ TEST_F(SimpleTest, RepeatedSIntMessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<sint32List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<sint32List>() == sint32List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == sint32List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt() << 6;
+    ASSERT_TRUE(test.testRepeatedInt() == sint32List({1, 2, 3, 4, 5, 6}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == sint32List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, RepeatedUIntMessageTest)
@@ -507,6 +540,12 @@ TEST_F(SimpleTest, RepeatedUIntMessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<uint32List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<uint32List>() == uint32List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == uint32List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt().append(6);
+    ASSERT_TRUE(test.testRepeatedInt() == uint32List({1, 2, 3, 4, 5,6}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == uint32List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, RepeatedInt64MessageTest)
@@ -520,6 +559,12 @@ TEST_F(SimpleTest, RepeatedInt64MessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<int64List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<int64List>() == int64List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == int64List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt().append(69);
+    ASSERT_TRUE(test.testRepeatedInt() == int64List({1, 2, 3, 4, 5, 69}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == int64List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, RepeatedSInt64MessageTest)
@@ -533,6 +578,12 @@ TEST_F(SimpleTest, RepeatedSInt64MessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<sint64List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<sint64List>() == sint64List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == sint64List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt() << 96;
+    ASSERT_TRUE(test.testRepeatedInt() == sint64List({1, 2, 3, 4, 5, 96}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == sint64List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, RepeatedUInt64MessageTest)
@@ -546,6 +597,12 @@ TEST_F(SimpleTest, RepeatedUInt64MessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<uint64List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<uint64List>() == uint64List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == uint64List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt().append(96);
+    ASSERT_TRUE(test.testRepeatedInt() == uint64List({1, 2, 3, 4, 5, 96}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == uint64List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, RepeatedFixedIntMessageTest)
@@ -559,6 +616,12 @@ TEST_F(SimpleTest, RepeatedFixedIntMessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<fixed32List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<fixed32List>() == fixed32List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == fixed32List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt() << 0;
+    ASSERT_TRUE(test.testRepeatedInt() == fixed32List({1, 2, 3, 4, 5, 0}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == fixed32List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, RepeatedFixedInt64MessageTest)
@@ -572,6 +635,12 @@ TEST_F(SimpleTest, RepeatedFixedInt64MessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<fixed64List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<fixed64List>() == fixed64List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == fixed64List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt() << 0;
+    ASSERT_TRUE(test.testRepeatedInt() == fixed64List({1, 2, 3, 4, 5, 0}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == fixed64List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, RepeatedSFixedIntMessageTest)
@@ -585,6 +654,12 @@ TEST_F(SimpleTest, RepeatedSFixedIntMessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<sfixed32List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<sfixed32List>() == sfixed32List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == sfixed32List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt() << 0;
+    ASSERT_TRUE(test.testRepeatedInt() == sfixed32List({1, 2, 3, 4, 5, 0}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == sfixed32List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, RepeatedSFixedInt64MessageTest)
@@ -598,6 +673,12 @@ TEST_F(SimpleTest, RepeatedSFixedInt64MessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue<sfixed64List>({1, 2, 3, 4, 5})));
     ASSERT_TRUE(test.property(propertyName).value<sfixed64List>() == sfixed64List({1, 2, 3, 4, 5}));
     ASSERT_TRUE(test.testRepeatedInt() == sfixed64List({1, 2, 3, 4, 5}));
+
+    test.testRepeatedInt() << 0;
+    ASSERT_TRUE(test.testRepeatedInt() == sfixed64List({1, 2, 3, 4, 5, 0}));
+
+    test.testRepeatedInt().pop_back();
+    ASSERT_TRUE(test.testRepeatedInt() == sfixed64List({1, 2, 3, 4, 5}));
 }
 
 TEST_F(SimpleTest, StepChildEnumMessageTest)
@@ -649,6 +730,12 @@ TEST_F(SimpleTest, SimpleSInt32StringMapMessageTest)
     ASSERT_STREQ(test.mapField()[10].toStdString().c_str(), "Some 10");
     ASSERT_STREQ(test.mapField()[0].toStdString().c_str(), "Some 0");
     ASSERT_STREQ(test.mapField()[44].toStdString().c_str(), "Some 44");
+
+    test.mapField()[66] = "Some 66";
+    ASSERT_STREQ(test.mapField()[66].toStdString().c_str(), "Some 66");
+
+    test.mapField()[66] = "Some default";
+    ASSERT_STREQ(test.mapField()[66].toStdString().c_str(), "Some default");
 }
 
 TEST_F(SimpleTest, SimpleStringStringMapMessageTest)
@@ -668,4 +755,10 @@ TEST_F(SimpleTest, SimpleStringStringMapMessageTest)
     ASSERT_STREQ(test.mapField()["key 10"].toStdString().c_str(), "Some 10");
     ASSERT_STREQ(test.mapField()["key 0"].toStdString().c_str(), "Some 0");
     ASSERT_STREQ(test.mapField()["key 44"].toStdString().c_str(), "Some 44");
+
+    test.mapField()["key 66"] = "Some 66";
+    ASSERT_STREQ(test.mapField()["key 66"].toStdString().c_str(), "Some 66");
+
+    test.mapField()["key 66"] = "Some default";
+    ASSERT_STREQ(test.mapField()["key 66"].toStdString().c_str(), "Some default");
 }