add polymorphic struct support
authorAleksandar Kanchev <kanchev@itestra.com>
Tue, 28 May 2013 08:32:16 +0000 (10:32 +0200)
committerGerrit Code Review <qqmthk1@lpmodthk02.bmwgroup.net>
Tue, 4 Jun 2013 07:36:15 +0000 (09:36 +0200)
SerializablePolymorphicStruct is a new sub type of SerializableStruct.
It makes sense to use SerializablePolymorphicStruct only with std::shared_ptr.
New stream operators added to support the polymorhic struct shared pointers.

src/CommonAPI/InputStream.h
src/CommonAPI/OutputStream.h
src/CommonAPI/SerializableStruct.h

index 302023d..798439c 100644 (file)
@@ -63,6 +63,9 @@ class InputStream {
        virtual void beginReadSerializableStruct(const SerializableStruct& serializableStruct) = 0;
        virtual void endReadSerializableStruct(const SerializableStruct& serializableStruct) = 0;
 
+       virtual void beginReadSerializablePolymorphicStruct(uint32_t& serialId) = 0;
+       virtual void endReadSerializablePolymorphicStruct(const uint32_t& serialId) = 0;
+
     virtual void readSerializableVariant(SerializableVariant& serializableVariant) = 0;
 
     virtual void beginReadBoolVector() = 0;
@@ -175,6 +178,25 @@ inline InputStream& operator>>(InputStream& inputStream, SerializableStruct& ser
     return inputStream;
 }
 
+template <typename _SerializablePolymorphicStructType>
+typename std::enable_if<std::is_base_of<SerializablePolymorphicStruct, _SerializablePolymorphicStructType>::value, InputStream>::type&
+operator>>(InputStream& inputStream, std::shared_ptr<_SerializablePolymorphicStructType>& serializablePolymorphicStruct) {
+       uint32_t serialId;
+
+       inputStream.beginReadSerializablePolymorphicStruct(serialId);
+       if (!inputStream.hasError()) {
+               _SerializablePolymorphicStructType* instancePtr = _SerializablePolymorphicStructType::createInstance(serialId);
+               serializablePolymorphicStruct.reset(instancePtr);
+               if (instancePtr != NULL) {
+                       instancePtr->readFromInputStream(inputStream);
+               }
+
+               inputStream.endReadSerializablePolymorphicStruct(serialId);
+       }
+
+       return inputStream;
+}
+
 inline InputStream& operator>>(InputStream& inputStream, SerializableVariant& serializableVariant) {
     inputStream.readSerializableVariant(serializableVariant);
     return inputStream;
index 6158f12..58651b1 100644 (file)
@@ -280,6 +280,9 @@ class OutputStream {
        virtual void beginWriteSerializableStruct(const SerializableStruct& serializableStruct) = 0;
        virtual void endWriteSerializableStruct(const SerializableStruct& serializableStruct) = 0;
 
+       virtual void beginWriteSerializablePolymorphicStruct(const std::shared_ptr<SerializablePolymorphicStruct>& serializableStruct) = 0;
+       virtual void endWriteSerializablePolymorphicStruct(const std::shared_ptr<SerializablePolymorphicStruct>& serializableStruct) = 0;
+
     virtual void beginWriteSerializableVariant(const SerializableVariant& serializableVariant) = 0;
     virtual void endWriteSerializableVariant(const SerializableVariant& serializableVariant) = 0;
 
@@ -373,6 +376,16 @@ inline OutputStream& operator<<(OutputStream& outputStream, const Version& versi
        return outputStream.writeVersionValue(versionValue);
 }
 
+template <typename _SerializablePolymorphicStructType>
+typename std::enable_if<std::is_base_of<SerializablePolymorphicStruct, _SerializablePolymorphicStructType>::value, OutputStream>::type&
+operator<<(OutputStream& outputStream, const std::shared_ptr<_SerializablePolymorphicStructType>& serializablePolymorphicStruct) {
+    outputStream.beginWriteSerializablePolymorphicStruct(serializablePolymorphicStruct);
+    serializablePolymorphicStruct->writeToOutputStream(outputStream);
+    outputStream.endWriteSerializablePolymorphicStruct(serializablePolymorphicStruct);
+
+    return outputStream;
+}
+
 inline OutputStream& operator<<(OutputStream& outputStream, const SerializableStruct& serializableStruct) {
     outputStream.beginWriteSerializableStruct(serializableStruct);
     serializableStruct.writeToOutputStream(outputStream);
index d3749b1..0de7e15 100644 (file)
@@ -24,6 +24,11 @@ struct SerializableStruct {
        virtual void writeToOutputStream(OutputStream& outputStream) const = 0;
 };
 
+struct SerializablePolymorphicStruct: SerializableStruct {
+       virtual uint32_t getSerialId() const = 0;
+       virtual void createTypeSignature(TypeOutputStream& typeOutputStream) const = 0;
+};
+
 } // namespace CommonAPI
 
 #endif // COMMONAPI_SERIALIZABLE_STRUCT_H_