From 08d99f2da2e7e5fe2e263d0c99c9254836f04c34 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 9 Feb 2011 19:55:53 -0500 Subject: [PATCH] Revert "specialized serialization for all (not nice)" --- pvDataApp/factory/PVDataCreateFactory.cpp | 220 ++++++---------------- 1 file changed, 57 insertions(+), 163 deletions(-) diff --git a/pvDataApp/factory/PVDataCreateFactory.cpp b/pvDataApp/factory/PVDataCreateFactory.cpp index 1bb1d3e..0f93a86 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 +// Specializations for scalar String template<> BasePVScalar::BasePVScalar(PVStructure *parent,ScalarConstPtr scalar) @@ -110,104 +110,6 @@ 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; @@ -333,6 +235,61 @@ 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) { @@ -347,70 +304,6 @@ 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>getCapacity()) 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 = 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) { @@ -426,6 +319,7 @@ void DefaultPVArray::deserialize(ByteBuffer *pbuffer, setLength(size); postPut(); } + // TODO null arrays (size == -1) not supported } template<>