change the way PVField::getFieldName is implemented
This commit is contained in:
@@ -60,16 +60,7 @@ void PVField::message(String message,MessageType messageType)
|
||||
|
||||
String PVField::getFieldName()
|
||||
{
|
||||
if(parent==NULL) return fieldName;
|
||||
PVFieldPtrArray pvFields = parent->getPVFields();
|
||||
StringArray const & fieldNames = parent->getStructure()->getFieldNames();
|
||||
for(size_t i=0; i<pvFields.size(); i++) {
|
||||
if(pvFields[i].get()==this) {
|
||||
fieldName = fieldNames[i];
|
||||
return fieldName;
|
||||
}
|
||||
}
|
||||
throw std::logic_error("PVField::PVField did not find fieldName");
|
||||
return fieldName;
|
||||
}
|
||||
|
||||
void PVField::setRequester(Requester *requester)
|
||||
@@ -152,6 +143,7 @@ void PVField::renameField(String newName)
|
||||
for(size_t i=0; i<fields.size(); i++) {
|
||||
if(fields[i].get()==field.get()) {
|
||||
parentStructure->renameField(i,newName);
|
||||
fieldName = newName;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -174,9 +166,10 @@ void PVField::setPostHandler(PostHandler *postHandler)
|
||||
postHandler = postHandler;
|
||||
}
|
||||
|
||||
void PVField::setParent(PVStructure * xxx)
|
||||
void PVField::setParentAndName(PVStructure * xxx,String & name)
|
||||
{
|
||||
parent = xxx;
|
||||
fieldName = name;
|
||||
}
|
||||
|
||||
bool PVField::equals(PVField &pv)
|
||||
|
||||
@@ -47,13 +47,14 @@ PVStructure::PVStructure(StructureConstPtr& structurePtr)
|
||||
{
|
||||
size_t numberFields = structurePtr->getNumberFields();
|
||||
FieldConstPtrArray fields = structurePtr->getFields();
|
||||
StringArray fieldNames = structurePtr->getFieldNames();
|
||||
pvFields.reserve(numberFields);
|
||||
PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
||||
for(size_t i=0; i<numberFields; i++) {
|
||||
pvFields.push_back(pvDataCreate->createPVField(fields[i]));
|
||||
}
|
||||
for(size_t i=0; i<numberFields; i++) {
|
||||
pvFields[i]->setParent(this);
|
||||
pvFields[i]->setParentAndName(this,fieldNames[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,9 +66,10 @@ PVStructure::PVStructure(StructureConstPtr structurePtr,
|
||||
extendsStructureName("")
|
||||
{
|
||||
size_t numberFields = structurePtr->getNumberFields();
|
||||
StringArray fieldNames = structurePtr->getFieldNames();
|
||||
pvFields = pvs;
|
||||
for(size_t i=0; i<numberFields; i++) {
|
||||
pvFields[i]->setParent(this);
|
||||
pvFields[i]->setParentAndName(this,fieldNames[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +126,10 @@ void PVStructure::appendPVField(String fieldName,PVFieldPtr & pvField )
|
||||
FieldConstPtr field = getFieldCreate()->appendField(structurePtr,fieldName,pvField->getField());
|
||||
replaceField(field);
|
||||
structurePtr = static_pointer_cast<const Structure>(field);
|
||||
for(size_t i=0; i<newLength; i++) pvFields[i]->setParent(this);
|
||||
StringArray fieldNames = structurePtr->getFieldNames();
|
||||
for(size_t i=0; i<newLength; i++) {
|
||||
pvFields[i]->setParentAndName(this,fieldNames[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void PVStructure::appendPVFields(StringArray &fieldNames,PVFieldPtrArray &pvFields)
|
||||
@@ -148,7 +153,10 @@ void PVStructure::appendPVFields(StringArray &fieldNames,PVFieldPtrArray &pvFiel
|
||||
FieldConstPtr field = getFieldCreate()->appendFields(structurePtr,fieldNames,fields);
|
||||
replaceField(field);
|
||||
structurePtr = static_pointer_cast<const Structure>(field);
|
||||
for(size_t i=0; i<newLength; i++) pvFields[i]->setParent(this);
|
||||
StringArray names = structurePtr->getFieldNames();
|
||||
for(size_t i=0; i<newLength; i++) {
|
||||
pvFields[i]->setParentAndName(this,names[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void PVStructure::removePVField(String fieldName)
|
||||
@@ -181,7 +189,10 @@ void PVStructure::removePVField(String fieldName)
|
||||
FieldConstPtr field = getFieldCreate()->createStructure(newFieldNames,fields);
|
||||
replaceField(field);
|
||||
structurePtr = static_pointer_cast<const Structure>(field);
|
||||
for(size_t i=0; i<newLength; i++) pvFields[i]->setParent(this);
|
||||
StringArray fieldNames = structurePtr->getFieldNames();
|
||||
for(size_t i=0; i<newLength; i++) {
|
||||
pvFields[i]->setParentAndName(this,fieldNames[i]);
|
||||
}
|
||||
}
|
||||
|
||||
PVBooleanPtr PVStructure::getBooleanField(String fieldName)
|
||||
@@ -629,9 +640,14 @@ static PVFieldPtr &findSubField(String fieldName,PVStructure *pvStructure) {
|
||||
pvField = pvFields[i];
|
||||
size_t result = pvField->getFieldName().compare(name);
|
||||
if(result==0) {
|
||||
if(restOfName.length()==0) return pvFields[i];
|
||||
if(restOfName.length()==0) {
|
||||
PVFieldPtr & xxx = pvFields[i];
|
||||
printf("%p %p\n",pvFields[i].get(),xxx.get());
|
||||
return pvFields[i];
|
||||
}
|
||||
if(pvField->getField()->getType()!=structure) return nullPVField;
|
||||
PVStructurePtr pvStructure = std::tr1::static_pointer_cast<PVStructure>(pvField);
|
||||
PVStructurePtr pvStructure =
|
||||
std::tr1::static_pointer_cast<PVStructure>(pvField);
|
||||
return findSubField(restOfName,pvStructure.get());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,7 +254,7 @@ public:
|
||||
virtual void toString(StringBuilder buf,int indentLevel) ;
|
||||
protected:
|
||||
PVField(FieldConstPtr field);
|
||||
void setParent(PVStructure *parent);
|
||||
void setParentAndName(PVStructure *parent, String & fieldName);
|
||||
void replaceField(FieldConstPtr &field);
|
||||
private:
|
||||
void message(String fieldName,String message,MessageType messageType);
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
using namespace epics::pvData;
|
||||
using std::tr1::static_pointer_cast;
|
||||
using std::size_t;
|
||||
|
||||
static FieldCreatePtr fieldCreate;
|
||||
static PVDataCreatePtr pvDataCreate;
|
||||
@@ -35,6 +36,34 @@ static String alarmTimeStamp("alarm,timeStamp");
|
||||
static String alarmTimeStampValueAlarm("alarm,timeStamp,valueAlarm");
|
||||
static String allProperties("alarm,timeStamp,display,control,valueAlarm");
|
||||
|
||||
static void checkNameAndParent(
|
||||
FILE *fd,PVStructurePtr & pvStructure, int indentLevel)
|
||||
{
|
||||
builder.clear();
|
||||
// convert->newLine(&builder,indentLevel);
|
||||
// fprintf(fd,"%s this %p indentLevel %d",
|
||||
// builder.c_str(),pvStructure.get(),indentLevel);
|
||||
PVFieldPtrArray pvFields = pvStructure->getPVFields();
|
||||
StringArray fieldNames = pvStructure->getStructure()->getFieldNames();
|
||||
for(size_t i = 0; i<pvFields.size(); i++) {
|
||||
PVFieldPtr pvField = pvFields[i];
|
||||
assert(pvField->getParent()==pvStructure.get());
|
||||
assert(pvField->getFieldName().compare(fieldNames[i])==0);
|
||||
// builder.clear();
|
||||
// convert->newLine(&builder,indentLevel);
|
||||
// fprintf(fd,"%s this %p name %s parent %p",
|
||||
// builder.c_str(),
|
||||
// pvField.get(),
|
||||
// pvField->getFieldName().c_str(),
|
||||
// pvField->getParent());
|
||||
if(pvField->getField()->getType()==structure) {
|
||||
PVStructurePtr xxx = static_pointer_cast<PVStructure>(pvField);
|
||||
checkNameAndParent(fd,xxx,indentLevel+1);
|
||||
}
|
||||
}
|
||||
builder.clear();
|
||||
}
|
||||
|
||||
static void testAppendSimple(FILE * fd)
|
||||
{
|
||||
PVFieldPtrArray fields;
|
||||
@@ -79,6 +108,7 @@ static void testAppendMore(FILE * fd)
|
||||
builder.clear();
|
||||
pvStructure->toString(&builder);
|
||||
fprintf(fd,"%s\n",builder.c_str());
|
||||
checkNameAndParent(fd,pvStructure,0);
|
||||
}
|
||||
|
||||
static void append2(PVStructurePtr pvStructure,
|
||||
@@ -124,8 +154,10 @@ static void testAppends(FILE * fd)
|
||||
builder.clear();
|
||||
pvStructure->toString(&builder);
|
||||
fprintf(fd,"%s\n",builder.c_str());
|
||||
checkNameAndParent(fd,pvStructure,0);
|
||||
PVFieldPtr pvField = pvStructure->getSubField("child2.Bill");
|
||||
assert(pvField.get()!=0);
|
||||
printf("pvField %p\n",pvField.get());
|
||||
assert(pvField.get()!=NULL);
|
||||
pvField->renameField("Joe");
|
||||
builder.clear();
|
||||
pvStructure->toString(&builder);
|
||||
@@ -134,6 +166,7 @@ static void testAppends(FILE * fd)
|
||||
builder.clear();
|
||||
pvStructure->toString(&builder);
|
||||
fprintf(fd,"%s\n",builder.c_str());
|
||||
checkNameAndParent(fd,pvStructure,0);
|
||||
}
|
||||
|
||||
int main(int argc,char *argv[])
|
||||
|
||||
Reference in New Issue
Block a user