diff --git a/pvDataApp/factory/FieldCreateFactory.cpp b/pvDataApp/factory/FieldCreateFactory.cpp index 6c81708..11bc2d0 100644 --- a/pvDataApp/factory/FieldCreateFactory.cpp +++ b/pvDataApp/factory/FieldCreateFactory.cpp @@ -118,6 +118,80 @@ void Field::toString(StringBuilder buffer,int indentLevel) const{ *buffer += pImpl->fieldName.c_str(); } +static bool fieldEquals(FieldConstPtr a,FieldConstPtr b); +inline bool scalarFieldEquals(ScalarConstPtr a,ScalarConstPtr b) +{ + ScalarType ascalarType = a->getScalarType(); + ScalarType bscalarType = b->getScalarType(); + if(ascalarType != bscalarType) + { + return false; + } + return true; +} + +inline bool scalarArrayFieldEquals(ScalarArrayConstPtr a,ScalarArrayConstPtr b) +{ + ScalarType aType = a->getElementType(); + ScalarType bType = b->getElementType(); + if(aType != bType) + { + return false; + } + return true; +} + +inline bool structureFieldEquals(StructureConstPtr a,StructureConstPtr b) +{ + int length = a->getNumberFields(); + if(length != b->getNumberFields()) return false; + FieldConstPtrArray aFields = a->getFields(); + FieldConstPtrArray bFields = b->getFields(); + for(int i=0; igetStructure(); + StructureConstPtr bStruct = b->getStructure(); + return fieldEquals(aStruct,bStruct); +} + +static bool fieldEquals(FieldConstPtr a,FieldConstPtr b) +{ + const void * avoid = static_cast(a); + const void * bvoid = static_cast(b); + if(avoid == bvoid) return true; + if(a->getFieldName() != b->getFieldName()) return false; + Type atype = a->getType(); + Type btype = b->getType(); + if(atype!=btype) return false; + if(atype==scalar) return scalarFieldEquals( + static_cast(a),static_cast(b)); + if(atype==scalarArray) return scalarArrayFieldEquals( + static_cast(a),static_cast(b)); + if(atype==structureArray) return structureArrayFieldEquals( + static_cast(a),static_cast(b)); + if(atype==structure) return structureFieldEquals( + static_cast(a),static_cast(b)); + String message("should not get here"); + throw std::logic_error(message); +} + +bool Field::operator==(const Field& field) const +{ + return fieldEquals(this, &field); +} + +bool Field::operator!=(const Field& field) const +{ + return !fieldEquals(this, &field); +} + Scalar::Scalar(String fieldName,ScalarType scalarType) : Field(fieldName,scalar),scalarType(scalarType){} diff --git a/pvDataApp/pv/pvIntrospect.h b/pvDataApp/pv/pvIntrospect.h index 1efd0b7..4bfe30b 100644 --- a/pvDataApp/pv/pvIntrospect.h +++ b/pvDataApp/pv/pvIntrospect.h @@ -68,6 +68,8 @@ public: virtual void toString(StringBuilder buf,int indentLevel) const; void incReferenceCount() const; void decReferenceCount() const; + virtual bool operator==(const Field& field) const; + virtual bool operator!=(const Field& field) const; protected: Field(String fieldName,Type type); virtual ~Field();