diff options
author | Aleksandar Kanchev <kanchev@itestra.com> | 2013-05-28 10:32:16 +0200 |
---|---|---|
committer | Gerrit Code Review <qqmthk1@lpmodthk02.bmwgroup.net> | 2013-06-04 09:36:15 +0200 |
commit | f8f42f23ed8cf0edd0f62bd04c85fff801413200 (patch) | |
tree | d29cc4f639a28c4bbf8bbe5e51bdb57e5e4047d5 | |
parent | 66e45588704f1929c92e2c561a8b460c97869fb9 (diff) | |
download | genivi-common-api-runtime-f8f42f23ed8cf0edd0f62bd04c85fff801413200.tar.gz |
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.
-rw-r--r-- | src/CommonAPI/InputStream.h | 22 | ||||
-rw-r--r-- | src/CommonAPI/OutputStream.h | 13 | ||||
-rw-r--r-- | src/CommonAPI/SerializableStruct.h | 5 |
3 files changed, 40 insertions, 0 deletions
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 _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; 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<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); 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_ |