diff --git a/pvDataApp/factory/Compare.cpp b/pvDataApp/factory/Compare.cpp index 12a80f9..b62f3c9 100644 --- a/pvDataApp/factory/Compare.cpp +++ b/pvDataApp/factory/Compare.cpp @@ -70,6 +70,8 @@ bool operator==(const Structure& a, const Structure& b) { if(&a==&b) return true; + if (a.getID()!=b.getID()) + return false; size_t nflds=a.getNumberFields(); if (b.getNumberFields()!=nflds) return false; diff --git a/pvDataApp/factory/FieldCreateFactory.cpp b/pvDataApp/factory/FieldCreateFactory.cpp index 54e4c99..9ac6453 100644 --- a/pvDataApp/factory/FieldCreateFactory.cpp +++ b/pvDataApp/factory/FieldCreateFactory.cpp @@ -71,6 +71,25 @@ void Scalar::toString(StringBuilder buffer,int indentLevel) const{ ScalarTypeFunc::toString(buffer,scalarType); } +static const String idScalarLUT[] = { + "boolean", // pvBoolean + "byte", // pvByte + "short", // pvShort + "int", // pvInt + "long", // pvLong + "ubyte", // pvUByte + "ushort", // pvUShort + "uint", // pvUInt + "ulong", // pvULong + "float", // pvFloat + "double", // pvDouble + "string" // pvString +}; + +String Scalar::getID() const +{ + return idScalarLUT[scalarType]; +} static const int8 typeCodeLUT[] = { 0x00, // pvBoolean @@ -99,6 +118,7 @@ void Scalar::deserialize(ByteBuffer *buffer, DeserializableControl *control) { static void serializeStructureField(const Structure* structure, ByteBuffer* buffer, SerializableControl* control) { + SerializeHelper::serializeString(structure->getID(), buffer, control); FieldConstPtrArray const & fields = structure->getFields(); StringArray const & fieldNames = structure->getFieldNames(); std::size_t len = fields.size(); @@ -112,6 +132,7 @@ static void serializeStructureField(const Structure* structure, ByteBuffer* buff static StructureConstPtr deserializeStructureField(const FieldCreate* fieldCreate, ByteBuffer* buffer, DeserializableControl* control) { + String id = SerializeHelper::deserializeString(buffer, control); const std::size_t size = SerializeHelper::readSize(buffer, control); FieldConstPtrArray fields; fields.reserve(size); StringArray fieldNames; fieldNames.reserve(size); @@ -121,7 +142,7 @@ static StructureConstPtr deserializeStructureField(const FieldCreate* fieldCreat fields.push_back(control->cachedDeserialize(buffer)); } - return fieldCreate->createStructure(fieldNames, fields); + return fieldCreate->createStructure(id, fieldNames, fields); } ScalarArray::ScalarArray(ScalarType elementType) @@ -129,6 +150,26 @@ ScalarArray::ScalarArray(ScalarType elementType) ScalarArray::~ScalarArray() {} +static const String idScalarArrayLUT[] = { + "boolean[]", // pvBoolean + "byte[]", // pvByte + "short[]", // pvShort + "int[]", // pvInt + "long[]", // pvLong + "ubyte[]", // pvUByte + "ushort[]", // pvUShort + "uint[]", // pvUInt + "ulong[]", // pvULong + "float[]", // pvFloat + "double[]", // pvDouble + "string[]" // pvString +}; + +String ScalarArray::getID() const +{ + return idScalarArrayLUT[elementType]; +} + void ScalarArray::toString(StringBuilder buffer,int indentLevel) const{ ScalarTypeFunc::toString(buffer,elementType); *buffer += "[]"; @@ -152,6 +193,12 @@ StructureArray::~StructureArray() { if(debugLevel==highDebug) printf("~StructureArray\n"); } +String StructureArray::getID() const +{ + // NOTE: structure->getID() can return an empty string + return pstructure->getID() + "[]"; +} + void StructureArray::toString(StringBuilder buffer,int indentLevel) const { if(indentLevel==0) { *buffer += "structure[]"; @@ -172,11 +219,11 @@ void StructureArray::deserialize(ByteBuffer *buffer, DeserializableControl *cont throw std::runtime_error("not valid operation, use FieldCreate::deserialize instead"); } - -Structure::Structure (StringArray const & fieldNames,FieldConstPtrArray const & infields) +Structure::Structure (StringArray const & fieldNames,FieldConstPtrArray const & infields, String inid) : Field(structure), fieldNames(fieldNames), - fields(infields) + fields(infields), + id(inid) { if(fieldNames.size()!=fields.size()) { throw std::invalid_argument("fieldNames.size()!=fields.size()"); @@ -203,6 +250,11 @@ Structure::Structure (StringArray const & fieldNames,FieldConstPtrArray const & Structure::~Structure() { } +String Structure::getID() const +{ + return id; +} + FieldConstPtr Structure::getField(String fieldName) const { size_t numberFields = fields.size(); for(size_t i=0; icreateScalar(pvLong)); + fields.push_back(fieldCreate->createScalar(pvInt)); + + StructureConstPtr structureWithNoId = fieldCreate->createStructure(fieldNames, fields); + StructureConstPtr structure1 = fieldCreate->createStructure("id1", fieldNames, fields); + StructureConstPtr structure2 = fieldCreate->createStructure("id2", fieldNames, fields); + + + assert(structureWithNoId!=structure1); + assert(structure1!=structure2); + + //serializationTest(structure1); + + PVStructurePtr pvStructure = getPVDataCreate()->createPVStructure(structure1); + serializationTest(pvStructure); + + ofile<<"!!! PASSED\n\n"; +} + void serializatioTest(FieldConstPtr const & field) { buffer->clear();