From: Aleksandar Kanchev Date: Tue, 28 May 2013 08:32:16 +0000 (+0200) Subject: add polymorphic struct support X-Git-Tag: 2.1-pre1~9 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f8f42f23ed8cf0edd0f62bd04c85fff801413200;p=profile%2Fivi%2Fcommon-api-runtime.git add polymorphic struct support 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. --- diff --git a/src/CommonAPI/InputStream.h b/src/CommonAPI/InputStream.h index 302023d..798439c 100644 --- a/src/CommonAPI/InputStream.h +++ b/src/CommonAPI/InputStream.h @@ -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 std::enable_if::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; diff --git a/src/CommonAPI/OutputStream.h b/src/CommonAPI/OutputStream.h index 6158f12..58651b1 100644 --- a/src/CommonAPI/OutputStream.h +++ b/src/CommonAPI/OutputStream.h @@ -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& serializableStruct) = 0; + virtual void endWriteSerializablePolymorphicStruct(const std::shared_ptr& 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 std::enable_if::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); diff --git a/src/CommonAPI/SerializableStruct.h b/src/CommonAPI/SerializableStruct.h index d3749b1..0de7e15 100644 --- a/src/CommonAPI/SerializableStruct.h +++ b/src/CommonAPI/SerializableStruct.h @@ -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_