diff --git a/pvDataApp/factory/PVStructure.cpp b/pvDataApp/factory/PVStructure.cpp index b2777b1..64d47cc 100644 --- a/pvDataApp/factory/PVStructure.cpp +++ b/pvDataApp/factory/PVStructure.cpp @@ -208,9 +208,6 @@ void PVStructure::removePVField(String const &fieldName) { PVFieldPtr pvField = getSubField(fieldName); if(pvField.get()==NULL) { - String message("removePVField "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); return; } size_t origLength = pvFields.size(); @@ -244,302 +241,72 @@ void PVStructure::removePVField(String const &fieldName) PVBooleanPtr PVStructure::getBooleanField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVBoolean; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvBoolean) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type boolean "; - this->message(message, errorMessage); - return nullPVBoolean; + return getSubField(fieldName); } PVBytePtr PVStructure::getByteField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVByte; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvByte) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type byte "; - this->message(message, errorMessage); - return nullPVByte; + return getSubField(fieldName); } PVShortPtr PVStructure::getShortField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVShort; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvShort) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type short "; - this->message(message, errorMessage); - return nullPVShort; + return getSubField(fieldName); } PVIntPtr PVStructure::getIntField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVInt; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvInt) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type int "; - this->message(message, errorMessage); - return nullPVInt; + return getSubField(fieldName); } PVLongPtr PVStructure::getLongField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVLong; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvLong) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type long "; - this->message(message, errorMessage); - return nullPVLong; + return getSubField(fieldName); } PVUBytePtr PVStructure::getUByteField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVUByte; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvUByte) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type byte "; - this->message(message, errorMessage); - return nullPVUByte; + return getSubField(fieldName); } PVUShortPtr PVStructure::getUShortField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVUShort; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvUShort) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type short "; - this->message(message, errorMessage); - return nullPVUShort; + return getSubField(fieldName); } PVUIntPtr PVStructure::getUIntField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVUInt; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvUInt) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type int "; - this->message(message, errorMessage); - return nullPVUInt; + return getSubField(fieldName); } PVULongPtr PVStructure::getULongField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVULong; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvULong) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type long "; - this->message(message, errorMessage); - return nullPVULong; + return getSubField(fieldName); } PVFloatPtr PVStructure::getFloatField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVFloat; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvFloat) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type float "; - this->message(message, errorMessage); - return nullPVFloat; + return getSubField(fieldName); } PVDoublePtr PVStructure::getDoubleField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVDouble; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvDouble) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type double "; - this->message(message, errorMessage); - return nullPVDouble; + return getSubField(fieldName); } PVStringPtr PVStructure::getStringField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVString; - } - if(pvField->getField()->getType()==scalar) { - ScalarConstPtr pscalar = static_pointer_cast( - pvField->getField()); - if(pscalar->getScalarType()==pvString) { - return std::tr1::static_pointer_cast(pvField); - } - } - String message("fieldName "); - message += fieldName + " does not have type string "; - this->message(message, errorMessage); - return nullPVString; + return getSubField(fieldName); } PVStructurePtr PVStructure::getStructureField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVStructure; - } - if(pvField->getField()->getType()==structure) { - return std::tr1::static_pointer_cast(pvField); - } - String message("fieldName "); - message += fieldName + " does not have type structure "; - this->message(message, errorMessage); - return nullPVStructure; + return getSubField(fieldName); } PVUnionPtr PVStructure::getUnionField(String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVUnion; - } - if(pvField->getField()->getType()==union_) { - return std::tr1::static_pointer_cast(pvField); - } - String message("fieldName "); - message += fieldName + " does not have type union "; - this->message(message, errorMessage); - return nullPVUnion; + return getSubField(fieldName); } PVScalarArrayPtr PVStructure::getScalarArrayField( @@ -547,26 +314,16 @@ PVScalarArrayPtr PVStructure::getScalarArrayField( { PVFieldPtr pvField = findSubField(fieldName,this); if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); return nullPVScalarArray; } FieldConstPtr field = pvField->getField(); Type type = field->getType(); if(type!=scalarArray) { - String message("fieldName "); - message += fieldName + " does not have type array "; - this->message(message, errorMessage); return nullPVScalarArray; } ScalarArrayConstPtr pscalarArray = static_pointer_cast(pvField->getField()); if(pscalarArray->getElementType()!=elementType) { - String message("fieldName "); - message += fieldName + " is array but does not have elementType "; - ScalarTypeFunc::toString(&message,elementType); - this->message(message, errorMessage); return nullPVScalarArray; } return std::tr1::static_pointer_cast(pvField); @@ -575,39 +332,13 @@ PVScalarArrayPtr PVStructure::getScalarArrayField( PVStructureArrayPtr PVStructure::getStructureArrayField( String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVStructureArray; - } - if(pvField->getField()->getType()==structureArray) { - return std::tr1::static_pointer_cast(pvField); - } - String message("fieldName "); - message += fieldName + " does not have type structureArray "; - this->message(message, errorMessage); - return nullPVStructureArray; + return getSubField(fieldName); } PVUnionArrayPtr PVStructure::getUnionArrayField( String const &fieldName) { - PVFieldPtr pvField = findSubField(fieldName,this); - if(pvField.get()==NULL) { - String message("fieldName "); - message += fieldName + " does not exist"; - this->message(message, errorMessage); - return nullPVUnionArray; - } - if(pvField->getField()->getType()==unionArray) { - return std::tr1::static_pointer_cast(pvField); - } - String message("fieldName "); - message += fieldName + " does not have type unionArray "; - this->message(message, errorMessage); - return nullPVUnionArray; + return getSubField(fieldName); } String PVStructure::getExtendsStructureName() const diff --git a/testApp/pv/testPVStructureArray.cpp b/testApp/pv/testPVStructureArray.cpp index f5701fb..a55efa4 100644 --- a/testApp/pv/testPVStructureArray.cpp +++ b/testApp/pv/testPVStructureArray.cpp @@ -144,6 +144,19 @@ static void testRemove() testOk1(scont[3]==check[2]); } +static void testFromRaw() +{ + testDiag("Test structure array external allocation for shared_vector"); + + PVStructurePtr* raw = new PVStructurePtr[4]; + raw[0] = pvDataCreate->createPVStructure(standardField->alarm()); + raw[1] = pvDataCreate->createPVStructure(standardField->alarm()); + raw[2] = pvDataCreate->createPVStructure(standardField->alarm()); + raw[3] = pvDataCreate->createPVStructure(standardField->alarm()); + + PVStructureArray::svector cont(raw, 1, 2); +} + MAIN(testPVStructureArray) { testPlan(0); @@ -155,5 +168,6 @@ MAIN(testPVStructureArray) testBasic(); testCompress(); testRemove(); + testFromRaw(); return testDone(); }