summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandar Kanchev <kanchev@itestra.com>2013-05-28 10:32:16 +0200
committerGerrit Code Review <qqmthk1@lpmodthk02.bmwgroup.net>2013-06-04 09:36:15 +0200
commitf8f42f23ed8cf0edd0f62bd04c85fff801413200 (patch)
treed29cc4f639a28c4bbf8bbe5e51bdb57e5e4047d5
parent66e45588704f1929c92e2c561a8b460c97869fb9 (diff)
downloadgenivi-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.h22
-rw-r--r--src/CommonAPI/OutputStream.h13
-rw-r--r--src/CommonAPI/SerializableStruct.h5
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_