From 62b285e79d2fd7af3de7ef5cc0df08e941a89a37 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Wed, 9 Feb 2011 22:05:09 +0100 Subject: [PATCH] specialized serialization for all (not nice) --- pvDataApp/factory/PVDataCreateFactory.cpp | 220 ++++++++++++++++------ 1 file changed, 163 insertions(+), 57 deletions(-) diff --git a/pvDataApp/factory/PVDataCreateFactory.cpp b/pvDataApp/factory/PVDataCreateFactory.cpp index 0f93a86..59e1683 100644 --- a/pvDataApp/factory/PVDataCreateFactory.cpp +++ b/pvDataApp/factory/PVDataCreateFactory.cpp @@ -91,7 +91,7 @@ bool BasePVScalar::operator!=(PVField& pvField) return !(getConvert()->equals(this, &pvField)); } -// Specializations for scalar String +// Specializations template<> BasePVScalar::BasePVScalar(PVStructure *parent,ScalarConstPtr scalar) @@ -110,6 +110,104 @@ void BasePVScalar::deserialize(ByteBuffer *pbuffer, value = SerializeHelper::deserializeString(pbuffer, pflusher); } +template<> +void BasePVScalar::serialize(ByteBuffer *pbuffer, + SerializableControl *pflusher) { + pflusher->ensureBuffer(1); + pbuffer->putBoolean(value); +} + +template<> +void BasePVScalar::deserialize(ByteBuffer *pbuffer, + DeserializableControl *pflusher) { + pflusher->ensureData(1); + value = pbuffer->getBoolean(); +} + +template<> +void BasePVScalar::serialize(ByteBuffer *pbuffer, + SerializableControl *pflusher) { + pflusher->ensureBuffer(1); + pbuffer->putByte(value); +} + +template<> +void BasePVScalar::deserialize(ByteBuffer *pbuffer, + DeserializableControl *pflusher) { + pflusher->ensureData(1); + value = pbuffer->getByte(); +} + +template<> +void BasePVScalar::serialize(ByteBuffer *pbuffer, + SerializableControl *pflusher) { + pflusher->ensureBuffer(2); + pbuffer->putShort(value); +} + +template<> +void BasePVScalar::deserialize(ByteBuffer *pbuffer, + DeserializableControl *pflusher) { + pflusher->ensureData(2); + value = pbuffer->getShort(); +} + +template<> +void BasePVScalar::serialize(ByteBuffer *pbuffer, + SerializableControl *pflusher) { + pflusher->ensureBuffer(4); + pbuffer->putInt(value); +} + +template<> +void BasePVScalar::deserialize(ByteBuffer *pbuffer, + DeserializableControl *pflusher) { + pflusher->ensureData(4); + value = pbuffer->getInt(); +} + +template<> +void BasePVScalar::serialize(ByteBuffer *pbuffer, + SerializableControl *pflusher) { + pflusher->ensureBuffer(8); + pbuffer->putLong(value); +} + +template<> +void BasePVScalar::deserialize(ByteBuffer *pbuffer, + DeserializableControl *pflusher) { + pflusher->ensureData(8); + value = pbuffer->getLong(); +} + +template<> +void BasePVScalar::serialize(ByteBuffer *pbuffer, + SerializableControl *pflusher) { + pflusher->ensureBuffer(4); + pbuffer->putFloat(value); +} + +template<> +void BasePVScalar::deserialize(ByteBuffer *pbuffer, + DeserializableControl *pflusher) { + pflusher->ensureData(4); + value = pbuffer->getFloat(); +} + +template<> +void BasePVScalar::serialize(ByteBuffer *pbuffer, + SerializableControl *pflusher) { + pflusher->ensureBuffer(8); + pbuffer->putDouble(value); +} + +template<> +void BasePVScalar::deserialize(ByteBuffer *pbuffer, + DeserializableControl *pflusher) { + pflusher->ensureData(8); + value = pbuffer->getDouble(); +} + typedef BasePVScalar BasePVBoolean; typedef BasePVScalar BasePVByte; typedef BasePVScalar BasePVShort; @@ -235,61 +333,6 @@ void DefaultPVArray::serialize(ByteBuffer *pbuffer, serialize(pbuffer, pflusher, 0, PVArray::getLength()); } -template -void DefaultPVArray::deserialize(ByteBuffer *pbuffer, - DeserializableControl *pcontrol) { - int size = SerializeHelper::readSize(pbuffer, pcontrol); - if(size>=0) { - // prepare array, if necessary - if(size>PVArray::getCapacity()) PVArray::setCapacity(size); - // retrieve value from the buffer - int i = 0; - while(true) { - int maxIndex = std::min(size-i, pbuffer->getRemaining())+i; - for(; igetBoolean(); - if(iensureData(1); // // TODO is there a better way to ensureData? - else - break; - } - // set new length - PVArray::setLength(size); - PVField::postPut(); - } - // TODO null arrays (size == -1) not supported -} - -template -void DefaultPVArray::serialize(ByteBuffer *pbuffer, - SerializableControl *pflusher, int offset, int count) { - // cache - int length = PVArray::getLength(); - - // check bounds - if(offset<0) - offset = 0; - else if(offset>length) offset = length; - if(count<0) count = length; - - int maxCount = length-offset; - if(count>maxCount) count = maxCount; - - // write - SerializeHelper::writeSize(count, pbuffer, pflusher); - int end = offset+count; - int i = offset; - while(true) { - int maxIndex = std::min(end-i, pbuffer->getRemaining())+i; - for(; iputBoolean(value[i]); - if(iflushSerializeBuffer(); - else - break; - } -} - template bool DefaultPVArray::operator==(PVField& pv) { @@ -304,6 +347,70 @@ bool DefaultPVArray::operator!=(PVField& pv) // specializations for String + +#define DEFAULTPVARRAY_SERIALIZATION(T, NAME) \ +template<> \ +void DefaultPVArray::deserialize(ByteBuffer *pbuffer, \ + DeserializableControl *pcontrol) { \ + int size = SerializeHelper::readSize(pbuffer, pcontrol); \ + if(size>=0) { \ + if(size>PVArray::getCapacity()) PVArray::setCapacity(size); \ + int i = 0; \ + while(true) { \ + int maxIndex = std::min(size-i, pbuffer->getRemaining())+i; \ + for(; iget ## NAME (); \ + if(iensureData(sizeof(T)); \ + else \ + break; \ + } \ + PVArray::setLength(size); \ + PVField::postPut(); \ + } \ +} \ +\ +template<> \ +void DefaultPVArray::serialize(ByteBuffer *pbuffer, \ + SerializableControl *pflusher, int offset, int count) { \ + int length = PVArray::getLength(); \ +\ + if(offset<0) \ + offset = 0; \ + else if(offset>length) offset = length; \ + if(count<0) count = length; \ +\ + int maxCount = length-offset; \ + if(count>maxCount) count = maxCount; \ +\ + SerializeHelper::writeSize(count, pbuffer, pflusher); \ + int end = offset+count; \ + int i = offset; \ + while(true) { \ + int maxIndex = std::min(end-i, pbuffer->getRemaining())+i; \ + for(; iput ## NAME (value[i]); \ + if(iflushSerializeBuffer(); \ + else \ + break; \ + } \ +} + + +DEFAULTPVARRAY_SERIALIZATION(bool, Boolean); +DEFAULTPVARRAY_SERIALIZATION(int8, Byte); +DEFAULTPVARRAY_SERIALIZATION(int16, Short); +DEFAULTPVARRAY_SERIALIZATION(int32, Int); +DEFAULTPVARRAY_SERIALIZATION(int64, Long); +DEFAULTPVARRAY_SERIALIZATION(float, Float); +DEFAULTPVARRAY_SERIALIZATION(double, Double); + + +// TODO null arrays (size == -1) not supported + + + template<> void DefaultPVArray::deserialize(ByteBuffer *pbuffer, DeserializableControl *pcontrol) { @@ -319,7 +426,6 @@ void DefaultPVArray::deserialize(ByteBuffer *pbuffer, setLength(size); postPut(); } - // TODO null arrays (size == -1) not supported } template<>