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.
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;
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;
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;
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);
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_