fix getSubField() by index

This commit is contained in:
Michael Davidsaver
2017-08-16 16:29:06 +02:00
parent 78b51ebe59
commit 0b262baf97
2 changed files with 73 additions and 15 deletions

View File

@@ -89,7 +89,8 @@ PVFieldPtr PVStructure::getSubFieldImpl(size_t fieldOffset, bool throws) const
const PVStructure *current = this;
recurse:
if(fieldOffset<=current->getFieldOffset() || fieldOffset>current->getNextFieldOffset()) {
// we don't permit self lookup
if(fieldOffset<=current->getFieldOffset() || fieldOffset>=current->getNextFieldOffset()) {
if(throws) {
std::stringstream ss;
ss << "Failed to get field with offset "
@@ -104,7 +105,7 @@ recurse:
const PVFieldPtr& pvField = current->pvFields[i];
if(pvField->getFieldOffset()==fieldOffset) {
return pvFields[i];
return pvField;
} else if(pvField->getNextFieldOffset()<=fieldOffset) {
continue;

View File

@@ -16,6 +16,7 @@
#include <pv/pvIntrospect.h>
#include <pv/pvData.h>
#include <pv/valueBuilder.h>
#include <pv/convert.h>
#include <pv/standardField.h>
#include <pv/standardPVField.h>
@@ -625,21 +626,77 @@ static void testFieldAccess()
}
}
static void testSubField()
{
PVStructurePtr value(ValueBuilder()
.add<pvInt>("a", 0)
.addNested("B")
.add<pvInt>("b", 0)
.addNested("C")
.add<pvInt>("c", 0)
.add<pvInt>("d", 0)
.endNested()
.add<pvInt>("e", 0)
.endNested()
.add<pvInt>("z", 0)
.buildPVStructure());
#define SHOW(FLD) testDiag("index '" FLD "' -> %u", unsigned(value->getSubFieldT(FLD)->getFieldOffset()))
SHOW("a");
SHOW("B");
SHOW("B.b");
SHOW("B.C");
SHOW("B.C.c");
SHOW("B.C.d");
SHOW("B.e");
SHOW("z");
#undef SHOW
#define SHOW(IDX) testDiag("index " #IDX " -> %s", value->getSubFieldT(IDX)->getFullName().c_str())
SHOW(1);
SHOW(2);
SHOW(3);
SHOW(4);
SHOW(5);
SHOW(6);
SHOW(7);
SHOW(8);
#undef SHOW
#define CHECK(FLD) testOk1(value->getSubFieldT(FLD)==value->getSubFieldT(value->getSubFieldT(FLD)->getFieldOffset()))
CHECK("a");
CHECK("B");
CHECK("B.b");
CHECK("B.C");
CHECK("B.C.c");
CHECK("B.C.d");
CHECK("B.e");
CHECK("z");
#undef CHECK
}
MAIN(testPVData)
{
testPlan(243);
fieldCreate = getFieldCreate();
pvDataCreate = getPVDataCreate();
standardField = getStandardField();
standardPVField = getStandardPVField();
convert = getConvert();
testCreatePVStructure();
testCreatePVStructureWithInvalidName();
testPVScalar();
testScalarArray();
testRequest();
testCopy();
testFieldAccess();
testPlan(251);
try{
fieldCreate = getFieldCreate();
pvDataCreate = getPVDataCreate();
standardField = getStandardField();
standardPVField = getStandardPVField();
convert = getConvert();
testCreatePVStructure();
testCreatePVStructureWithInvalidName();
testPVScalar();
testScalarArray();
testRequest();
testCopy();
testFieldAccess();
testSubField();
}catch(std::exception& e){
PRINT_EXCEPTION(e);
testAbort("Unhandled Exception: %s", e.what());
}
return testDone();
}