Browse Source

Fix coding issues

- Add missed null-pointers check
- Use Q_DISABLE_COPY_MOVE where applicable
- Move protobuf serializers initilization to private class
Alexey Edelev 5 years ago
parent
commit
29cf5694f9

+ 2 - 0
src/protobuf/qabstractprotobufserializer.h

@@ -83,6 +83,7 @@ public:
      */
     template<typename T>
     QByteArray serialize(const QObject *object) {
+        Q_ASSERT(object != nullptr);
         qProtoDebug() << T::staticMetaObject.className() << "serialize";
         return serializeMessage(object, T::protobufMetaObject);
     }
@@ -98,6 +99,7 @@ public:
      */
     template<typename T>
     void deserialize(QObject *object, const QByteArray &array) {
+        Q_ASSERT(object != nullptr);
         qProtoDebug() << T::staticMetaObject.className() << "deserialize";
         deserializeMessage(object, T::protobufMetaObject, array);
     }

+ 12 - 10
src/protobuf/qabstractprotobufserializer_p.h

@@ -77,7 +77,7 @@ extern Q_PROTOBUF_EXPORT void registerHandler(int userType, const SerializationH
 template <typename T,
           typename std::enable_if_t<std::is_base_of<QObject, T>::value, int> = 0>
 void serializeObject(const QtProtobuf::QAbstractProtobufSerializer *serializer, const QVariant &value, const QtProtobuf::QProtobufMetaProperty &metaProperty, QByteArray &buffer) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     buffer.append(serializer->serializeObject(value.value<T *>(), T::protobufMetaObject, metaProperty));
 }
 
@@ -88,7 +88,7 @@ void serializeObject(const QtProtobuf::QAbstractProtobufSerializer *serializer,
 template<typename V,
          typename std::enable_if_t<std::is_base_of<QObject, V>::value, int> = 0>
 void serializeList(const QtProtobuf::QAbstractProtobufSerializer *serializer, const QVariant &listValue, const QtProtobuf::QProtobufMetaProperty &metaProperty, QByteArray &buffer) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     QList<QSharedPointer<V>> list = listValue.value<QList<QSharedPointer<V>>>();
 
     qProtoDebug() << __func__ << "listValue.count" << list.count();
@@ -113,7 +113,7 @@ void serializeList(const QtProtobuf::QAbstractProtobufSerializer *serializer, co
 template<typename K, typename V,
          typename std::enable_if_t<!std::is_base_of<QObject, V>::value, int> = 0>
 void serializeMap(const QtProtobuf::QAbstractProtobufSerializer *serializer, const QVariant &value, const QtProtobuf::QProtobufMetaProperty &metaProperty, QByteArray &buffer) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     QMap<K,V> mapValue = value.value<QMap<K,V>>();
     for (auto it = mapValue.constBegin(); it != mapValue.constEnd(); it++) {
         buffer.append(serializer->serializeMapPair(QVariant::fromValue<K>(it.key()), QVariant::fromValue<V>(it.value()), metaProperty));
@@ -127,7 +127,7 @@ void serializeMap(const QtProtobuf::QAbstractProtobufSerializer *serializer, con
 template<typename K, typename V,
          typename std::enable_if_t<std::is_base_of<QObject, V>::value, int> = 0>
 void serializeMap(const QtProtobuf::QAbstractProtobufSerializer *serializer, const QVariant &value, const QtProtobuf::QProtobufMetaProperty &metaProperty, QByteArray &buffer) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     QMap<K, QSharedPointer<V>> mapValue = value.value<QMap<K, QSharedPointer<V>>>();
     for (auto it = mapValue.constBegin(); it != mapValue.constEnd(); it++) {
         if (it.value().isNull()) {
@@ -145,7 +145,7 @@ void serializeMap(const QtProtobuf::QAbstractProtobufSerializer *serializer, con
 template<typename T,
          typename std::enable_if_t<std::is_enum<T>::value, int> = 0>
 void serializeEnum(const QtProtobuf::QAbstractProtobufSerializer *serializer, const QVariant &value, const QtProtobuf::QProtobufMetaProperty &metaProperty, QByteArray &buffer) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     buffer.append(serializer->serializeEnum(QtProtobuf::int64(value.value<T>()), QMetaEnum::fromType<T>(),  metaProperty));
 }
 
@@ -156,7 +156,7 @@ void serializeEnum(const QtProtobuf::QAbstractProtobufSerializer *serializer, co
 template<typename T,
          typename std::enable_if_t<std::is_enum<T>::value, int> = 0>
 void serializeEnumList(const QtProtobuf::QAbstractProtobufSerializer *serializer, const QVariant &value, const QtProtobuf::QProtobufMetaProperty &metaProperty, QByteArray &buffer) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     QList<QtProtobuf::int64> intList;
     for (auto enumValue : value.value<QList<T>>()) {
         intList.append(QtProtobuf::int64(enumValue));
@@ -171,7 +171,7 @@ void serializeEnumList(const QtProtobuf::QAbstractProtobufSerializer *serializer
 template <typename T,
           typename std::enable_if_t<std::is_base_of<QObject, T>::value, int> = 0>
 void deserializeObject(const QtProtobuf::QAbstractProtobufSerializer *serializer, QtProtobuf::QProtobufSelfcheckIterator &it, QVariant &to) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     T *value = new T;
     serializer->deserializeObject(value, T::protobufMetaObject, it);
     to = QVariant::fromValue<T *>(value);
@@ -184,7 +184,7 @@ void deserializeObject(const QtProtobuf::QAbstractProtobufSerializer *serializer
 template <typename V,
           typename std::enable_if_t<std::is_base_of<QObject, V>::value, int> = 0>
 void deserializeList(const QtProtobuf::QAbstractProtobufSerializer *serializer, QtProtobuf::QProtobufSelfcheckIterator &it, QVariant &previous) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     qProtoDebug() << __func__ << "currentByte:" << QString::number((*it), 16);
 
     V *newValue = new V;
@@ -202,7 +202,7 @@ void deserializeList(const QtProtobuf::QAbstractProtobufSerializer *serializer,
 template <typename K, typename V,
           typename std::enable_if_t<!std::is_base_of<QObject, V>::value, int> = 0>
 void deserializeMap(const QtProtobuf::QAbstractProtobufSerializer *serializer, QtProtobuf::QProtobufSelfcheckIterator &it, QVariant &previous) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     qProtoDebug() << __func__ << "currentByte:" << QString::number((*it), 16);
 
     QMap<K, V> out = previous.value<QMap<K, V>>();
@@ -223,7 +223,7 @@ void deserializeMap(const QtProtobuf::QAbstractProtobufSerializer *serializer, Q
 template <typename K, typename V,
           typename std::enable_if_t<std::is_base_of<QObject, V>::value, int> = 0>
 void deserializeMap(const QtProtobuf::QAbstractProtobufSerializer *serializer, QtProtobuf::QProtobufSelfcheckIterator &it, QVariant &previous) {
-    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "serializer set is not setup");
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     qProtoDebug() << __func__ << "currentByte:" << QString::number((*it), 16);
 
     auto out = previous.value<QMap<K, QSharedPointer<V>>>();
@@ -238,6 +238,7 @@ void deserializeMap(const QtProtobuf::QAbstractProtobufSerializer *serializer, Q
 template <typename T,
           typename std::enable_if_t<std::is_enum<T>::value, int> = 0>
 void deserializeEnum(const QtProtobuf::QAbstractProtobufSerializer *serializer, QtProtobuf::QProtobufSelfcheckIterator &it, QVariant &to) {
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     QtProtobuf::int64 intValue;
     serializer->deserializeEnum(intValue, QMetaEnum::fromType<T>(), it);
     to = QVariant::fromValue<T>(static_cast<T>(intValue._t));
@@ -246,6 +247,7 @@ void deserializeEnum(const QtProtobuf::QAbstractProtobufSerializer *serializer,
 template <typename T,
           typename std::enable_if_t<std::is_enum<T>::value, int> = 0>
 void deserializeEnumList(const QtProtobuf::QAbstractProtobufSerializer *serializer, QtProtobuf::QProtobufSelfcheckIterator &it, QVariant &previous) {
+    Q_ASSERT_X(serializer != nullptr, "QAbstractProtobufSerializer", "Serializer is null");
     QList<QtProtobuf::int64> intList;
     serializer->deserializeEnumList(intList, QMetaEnum::fromType<T>(), it);
     QList<T> enumList = previous.value<QList<T>>();

+ 2 - 2
src/protobuf/qprotobufobject.h

@@ -41,8 +41,8 @@
 
 #define Q_DECLARE_PROTOBUF_SERIALIZERS(T)\
     public:\
-        QByteArray serialize(QtProtobuf::QAbstractProtobufSerializer *serializer) const { return serializer->serialize<T>(this); }\
-        void deserialize(QtProtobuf::QAbstractProtobufSerializer *serializer, const QByteArray &array) { serializer->deserialize<T>(this, array); }\
+        QByteArray serialize(QtProtobuf::QAbstractProtobufSerializer *serializer) const { Q_ASSERT_X(serializer != nullptr, "QProtobufObject", "Serializer is null"); return serializer->serialize<T>(this); }\
+        void deserialize(QtProtobuf::QAbstractProtobufSerializer *serializer, const QByteArray &array) { Q_ASSERT_X(serializer != nullptr, "QProtobufObject", "Serializer is null"); serializer->deserialize<T>(this, array); }\
     private:
 
 /*!

+ 33 - 31
src/protobuf/qprotobufserializer.cpp

@@ -76,36 +76,6 @@ QProtobufSerializer::~QProtobufSerializer() = default;
 
 QProtobufSerializer::QProtobufSerializer() : d_ptr(new QProtobufSerializerPrivate(this))
 {
-    QProtobufSerializerPrivate::wrapSerializer<float, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<float>, Fixed32>();
-    QProtobufSerializerPrivate::wrapSerializer<double, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<double>, Fixed64>();
-    QProtobufSerializerPrivate::wrapSerializer<int32, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<int32>, Varint>();
-    QProtobufSerializerPrivate::wrapSerializer<int64, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<int64>, Varint>();
-    QProtobufSerializerPrivate::wrapSerializer<uint32, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<uint32>, Varint>();
-    QProtobufSerializerPrivate::wrapSerializer<uint64, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<uint64>, Varint>();
-    QProtobufSerializerPrivate::wrapSerializer<sint32, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<sint32>, Varint>();
-    QProtobufSerializerPrivate::wrapSerializer<sint64, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<sint64>, Varint>();
-    QProtobufSerializerPrivate::wrapSerializer<fixed32, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<fixed32>, Fixed32>();
-    QProtobufSerializerPrivate::wrapSerializer<fixed64, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<fixed64>, Fixed64>();
-    QProtobufSerializerPrivate::wrapSerializer<sfixed32, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<sfixed32>, Fixed32>();
-    QProtobufSerializerPrivate::wrapSerializer<sfixed64, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<sfixed64>, Fixed64>();
-    QProtobufSerializerPrivate::wrapSerializer<bool, uint32, QProtobufSerializerPrivate::serializeBasic<uint32>, QProtobufSerializerPrivate::deserializeBasic<uint32>, Varint>();
-    QProtobufSerializerPrivate::wrapSerializer<QString, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<QString>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<QByteArray, QProtobufSerializerPrivate::serializeBasic, QProtobufSerializerPrivate::deserializeBasic<QByteArray>, LengthDelimited>();
-
-    QProtobufSerializerPrivate::wrapSerializer<FloatList, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<float>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<DoubleList, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<double>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<fixed32List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<fixed32>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<fixed64List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<fixed64>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<sfixed32List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<sfixed32>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<sfixed64List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<sfixed64>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<int32List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<int32>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<int64List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<int64>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<sint32List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<sint32>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<sint64List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<sint64>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<uint32List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<uint32>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<uint64List, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<uint64>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<QStringList, QStringList, QProtobufSerializerPrivate::serializeListType<QString>, QProtobufSerializerPrivate::deserializeList<QString>, LengthDelimited>();
-    QProtobufSerializerPrivate::wrapSerializer<QByteArrayList, QProtobufSerializerPrivate::serializeListType, QProtobufSerializerPrivate::deserializeList<QByteArray>, LengthDelimited>();
 }
 
 QByteArray QProtobufSerializer::serializeMessage(const QObject *object, const QProtobufMetaObject &metaObject) const
@@ -227,7 +197,39 @@ void QProtobufSerializer::deserializeEnumList(QList<int64> &value, const QMetaEn
 
 QProtobufSerializerPrivate::QProtobufSerializerPrivate(QProtobufSerializer *q) : q_ptr(q)
 {
-
+    //if handlers is not empty intialization already done
+    if (handlers.empty()) {
+        wrapSerializer<float, serializeBasic, deserializeBasic<float>, Fixed32>();
+        wrapSerializer<double, serializeBasic, deserializeBasic<double>, Fixed64>();
+        wrapSerializer<int32, serializeBasic, deserializeBasic<int32>, Varint>();
+        wrapSerializer<int64, serializeBasic, deserializeBasic<int64>, Varint>();
+        wrapSerializer<uint32, serializeBasic, deserializeBasic<uint32>, Varint>();
+        wrapSerializer<uint64, serializeBasic, deserializeBasic<uint64>, Varint>();
+        wrapSerializer<sint32, serializeBasic, deserializeBasic<sint32>, Varint>();
+        wrapSerializer<sint64, serializeBasic, deserializeBasic<sint64>, Varint>();
+        wrapSerializer<fixed32, serializeBasic, deserializeBasic<fixed32>, Fixed32>();
+        wrapSerializer<fixed64, serializeBasic, deserializeBasic<fixed64>, Fixed64>();
+        wrapSerializer<sfixed32, serializeBasic, deserializeBasic<sfixed32>, Fixed32>();
+        wrapSerializer<sfixed64, serializeBasic, deserializeBasic<sfixed64>, Fixed64>();
+        wrapSerializer<bool, uint32, serializeBasic<uint32>, deserializeBasic<uint32>, Varint>();
+        wrapSerializer<QString, serializeBasic, deserializeBasic<QString>, LengthDelimited>();
+        wrapSerializer<QByteArray, serializeBasic, deserializeBasic<QByteArray>, LengthDelimited>();
+
+        wrapSerializer<FloatList, serializeListType, deserializeList<float>, LengthDelimited>();
+        wrapSerializer<DoubleList, serializeListType, deserializeList<double>, LengthDelimited>();
+        wrapSerializer<fixed32List, serializeListType, deserializeList<fixed32>, LengthDelimited>();
+        wrapSerializer<fixed64List, serializeListType, deserializeList<fixed64>, LengthDelimited>();
+        wrapSerializer<sfixed32List, serializeListType, deserializeList<sfixed32>, LengthDelimited>();
+        wrapSerializer<sfixed64List, serializeListType, deserializeList<sfixed64>, LengthDelimited>();
+        wrapSerializer<int32List, serializeListType, deserializeList<int32>, LengthDelimited>();
+        wrapSerializer<int64List, serializeListType, deserializeList<int64>, LengthDelimited>();
+        wrapSerializer<sint32List, serializeListType, deserializeList<sint32>, LengthDelimited>();
+        wrapSerializer<sint64List, serializeListType, deserializeList<sint64>, LengthDelimited>();
+        wrapSerializer<uint32List, serializeListType, deserializeList<uint32>, LengthDelimited>();
+        wrapSerializer<uint64List, serializeListType, deserializeList<uint64>, LengthDelimited>();
+        wrapSerializer<QStringList, QStringList, serializeListType<QString>, deserializeList<QString>, LengthDelimited>();
+        wrapSerializer<QByteArrayList, serializeListType, deserializeList<QByteArray>, LengthDelimited>();
+    }
 }
 
 void QProtobufSerializerPrivate::skipVarint(QProtobufSelfcheckIterator &it)

+ 1 - 3
src/protobuf/qprotobufserializerregistry_p.h

@@ -63,9 +63,7 @@ private:
     QProtobufSerializerRegistry();
     ~QProtobufSerializerRegistry();
 
-    Q_DISABLE_COPY(QProtobufSerializerRegistry)
-    QProtobufSerializerRegistry(QProtobufSerializerRegistry &&) = delete;
-    QProtobufSerializerRegistry &operator =(QProtobufSerializerRegistry &&) = delete;
+    Q_DISABLE_COPY_MOVE(QProtobufSerializerRegistry)
 
     std::unique_ptr<QProtobufSerializerRegistryPrivate> d;
 };

+ 1 - 1
src/protobuf/qqmllistpropertyconstructor.h

@@ -44,7 +44,7 @@ static int qmllistpropertyCount(QQmlListProperty<T> *p) {
 
 //! \private
 template<typename T>
-static T * qmllistpropertyAt(QQmlListProperty<T> *p, int index) {
+static T *qmllistpropertyAt(QQmlListProperty<T> *p, int index) {
     return reinterpret_cast<QList<QSharedPointer<T>> *>(p->data)->at(index).data();
 }