Browse Source

Align complex type serializer/deserializer interface

Alexey Edelev 5 years ago
parent
commit
c39511e7e1
1 changed files with 6 additions and 33 deletions
  1. 6 33
      src/protobuf/qprotobufobject_p.h

+ 6 - 33
src/protobuf/qprotobufobject_p.h

@@ -94,34 +94,6 @@ public:
         };
     }
 
-    template <typename T,
-              typename std::enable_if_t<std::is_base_of<QObject, T>::value, int> = 0>
-    static void wrapSerializer(const std::function<QByteArray(const T &, int &)> &s, const std::function<QVariant(SelfcheckIterator &)> &d, WireTypes type)
-    {
-        serializers[qMetaTypeId<T *>()] = {
-            [s](const QVariant &value, int &fieldIndex) {
-                return s(*(value.value<T *>()), fieldIndex);
-            },
-            [d](SelfcheckIterator &it, QVariant &value){
-                value = d(it);
-            },
-            type
-        };
-    }
-
-    template <typename T,
-              typename std::enable_if_t<std::is_base_of<QObject, T>::value, int> = 0>
-    static void wrapSerializer(const std::function<QByteArray(const T &, int &)> &s, const std::function<void(SelfcheckIterator &it, QVariant &value)> &d, WireTypes type)
-    {
-        serializers[qMetaTypeId<T *>()] = {
-            [s](const QVariant &value, int &fieldIndex) {
-                return s(*(value.value<T *>()), fieldIndex);
-            },
-            d,
-            type
-        };
-    }
-
     static QByteArray encodeHeader(int fieldIndex, WireTypes wireType);
     static bool decodeHeader(SelfcheckIterator &it, int &fieldIndex, WireTypes &wireType);
 
@@ -638,23 +610,24 @@ public:
     //-----------------------Functions to work with objects------------------------
     template<typename T>
     static void registerSerializers() {
-        ProtobufObjectPrivate::wrapSerializer<T>(serializeComplexType<T>, deserializeComplexType<T>, LengthDelimited);
+        ProtobufObjectPrivate::serializers[qMetaTypeId<T *>()] = {ProtobufObjectPrivate::Serializer(serializeComplexType<T>),
+                ProtobufObjectPrivate::Deserializer(deserializeComplexType<T>), LengthDelimited};
         ProtobufObjectPrivate::serializers[qMetaTypeId<QList<QSharedPointer<T>>>()] = {ProtobufObjectPrivate::Serializer(serializeComplexListType<T>),
                 ProtobufObjectPrivate::Deserializer(deserializeComplexListType<T>), LengthDelimited};
     }
 
     template <typename T,
               typename std::enable_if_t<std::is_base_of<QObject, T>::value, int> = 0>
-    static QByteArray serializeComplexType(const T &value, int &/*outFieldIndex*/) {
-        return ProtobufObjectPrivate::serializeLengthDelimited(value.serialize());
+    static QByteArray serializeComplexType(const QVariant &value, int &/*outFieldIndex*/) {
+        return ProtobufObjectPrivate::serializeLengthDelimited(value.value<T *>()->serialize());
     }
 
     template <typename T,
               typename std::enable_if_t<std::is_base_of<QObject, T>::value, int> = 0>
-    static QVariant deserializeComplexType(SelfcheckIterator &it) {
+    static void deserializeComplexType(SelfcheckIterator &it, QVariant &to) {
         T *value = new T;
         value->deserialize(ProtobufObjectPrivate::deserializeLengthDelimited(it));
-        return QVariant::fromValue<T *>(value);
+        to = QVariant::fromValue<T *>(value);
     }
 
     template <typename T,