testIntrospection now complete
This commit is contained in:
@@ -53,56 +53,56 @@ PVField::~PVField()
|
||||
|
||||
String PVField::getRequesterName()
|
||||
{
|
||||
static String none("none");
|
||||
if(pImpl->requester!=0) return pImpl->requester->getRequesterName();
|
||||
return none;
|
||||
static String none("none");
|
||||
if(pImpl->requester!=0) return pImpl->requester->getRequesterName();
|
||||
return none;
|
||||
}
|
||||
|
||||
void PVField::message(String message,MessageType messageType)
|
||||
{
|
||||
if(pImpl->requester) {
|
||||
pImpl->requester->message(message,messageType);
|
||||
} else {
|
||||
printf("%s %s %s\n",
|
||||
messageTypeName[messageType].c_str(),
|
||||
pImpl->field->getFieldName().c_str(),
|
||||
message.c_str());
|
||||
}
|
||||
if(pImpl->requester) {
|
||||
pImpl->requester->message(message,messageType);
|
||||
} else {
|
||||
printf("%s %s %s\n",
|
||||
messageTypeName[messageType].c_str(),
|
||||
pImpl->field->getFieldName().c_str(),
|
||||
message.c_str());
|
||||
}
|
||||
}
|
||||
void PVField::setRequester(Requester *prequester)
|
||||
{
|
||||
static String requesterPresent =
|
||||
"Logic Error. requester is already present";
|
||||
if(pImpl->requester==0) {
|
||||
pImpl->requester = prequester;
|
||||
return;
|
||||
}
|
||||
throw std::logic_error(requesterPresent);
|
||||
static String requesterPresent =
|
||||
"Logic Error. requester is already present";
|
||||
if(pImpl->requester==0) {
|
||||
pImpl->requester = prequester;
|
||||
return;
|
||||
}
|
||||
throw std::logic_error(requesterPresent);
|
||||
}
|
||||
|
||||
int PVField::getFieldOffset()
|
||||
{
|
||||
if(pImpl->nextFieldOffset==0) computeOffset(this);
|
||||
return pImpl->fieldOffset;
|
||||
if(pImpl->nextFieldOffset==0) computeOffset(this);
|
||||
return pImpl->fieldOffset;
|
||||
}
|
||||
|
||||
int PVField::getNextFieldOffset()
|
||||
{
|
||||
if(pImpl->nextFieldOffset==0) computeOffset(this);
|
||||
return pImpl->nextFieldOffset;
|
||||
if(pImpl->nextFieldOffset==0) computeOffset(this);
|
||||
return pImpl->nextFieldOffset;
|
||||
}
|
||||
|
||||
int PVField::getNumberFields()
|
||||
{
|
||||
if(pImpl->nextFieldOffset==0) computeOffset(this);
|
||||
return (pImpl->nextFieldOffset - pImpl->fieldOffset);
|
||||
if(pImpl->nextFieldOffset==0) computeOffset(this);
|
||||
return (pImpl->nextFieldOffset - pImpl->fieldOffset);
|
||||
}
|
||||
|
||||
PVAuxInfo * PVField::getPVAuxInfo(){
|
||||
if(pImpl->pvAuxInfo==0) {
|
||||
pImpl->pvAuxInfo = new PVAuxInfo(this);
|
||||
}
|
||||
return pImpl->pvAuxInfo;
|
||||
if(pImpl->pvAuxInfo==0) {
|
||||
pImpl->pvAuxInfo = new PVAuxInfo(this);
|
||||
}
|
||||
return pImpl->pvAuxInfo;
|
||||
}
|
||||
|
||||
bool PVField::isImmutable() {return pImpl->immutable;}
|
||||
@@ -198,44 +198,37 @@ void PVField::toString(StringBuilder buf,int indentLevel)
|
||||
}
|
||||
|
||||
void PVField::computeOffset(PVField * pvField) {
|
||||
PVStructure *pvTop = pvField->getParent();
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type!=structure) {
|
||||
pvField->pImpl->nextFieldOffset = 1;
|
||||
return;
|
||||
}
|
||||
if(pvTop==0) {
|
||||
pvTop = (PVStructure *)pvField;
|
||||
} else {
|
||||
while(pvTop->getParent()!=0) {
|
||||
pvTop = pvTop->getParent();
|
||||
}
|
||||
}
|
||||
int offset = 0;
|
||||
int nextOffset = 1;
|
||||
PVFieldPtrArray pvFields = pvTop->getPVFields();
|
||||
for(int i=0; i < pvTop->getStructure()->getNumberFields(); i++) {
|
||||
offset = nextOffset;
|
||||
PVField *pvField = pvFields[i];
|
||||
FieldConstPtr field = pvField->getField();
|
||||
switch(field->getType()) {
|
||||
case scalar:
|
||||
case scalarArray:
|
||||
case structureArray:{
|
||||
nextOffset++;
|
||||
pvField->pImpl->fieldOffset = offset;
|
||||
pvField->pImpl->nextFieldOffset = nextOffset;
|
||||
break;
|
||||
}
|
||||
case structure: {
|
||||
pvField->computeOffset(pvField,offset);
|
||||
nextOffset = pvField->getNextFieldOffset();
|
||||
}
|
||||
}
|
||||
}
|
||||
PVField *top = (PVField *)pvTop;
|
||||
top->pImpl->fieldOffset = 0;
|
||||
top->pImpl->nextFieldOffset = nextOffset;
|
||||
PVStructure *pvTop = pvField->getParent();
|
||||
if(pvTop==0) {
|
||||
pvTop = (PVStructure *)pvField;
|
||||
} else {
|
||||
while(pvTop->getParent()!=0) pvTop = pvTop->getParent();
|
||||
}
|
||||
int offset = 0;
|
||||
int nextOffset = 1;
|
||||
PVFieldPtrArray pvFields = pvTop->getPVFields();
|
||||
for(int i=0; i < pvTop->getStructure()->getNumberFields(); i++) {
|
||||
offset = nextOffset;
|
||||
PVField *pvField = pvFields[i];
|
||||
FieldConstPtr field = pvField->getField();
|
||||
switch(field->getType()) {
|
||||
case scalar:
|
||||
case scalarArray:
|
||||
case structureArray:{
|
||||
nextOffset++;
|
||||
pvField->pImpl->fieldOffset = offset;
|
||||
pvField->pImpl->nextFieldOffset = nextOffset;
|
||||
break;
|
||||
}
|
||||
case structure: {
|
||||
pvField->computeOffset(pvField,offset);
|
||||
nextOffset = pvField->getNextFieldOffset();
|
||||
}
|
||||
}
|
||||
}
|
||||
PVField *top = (PVField *)pvTop;
|
||||
top->pImpl->fieldOffset = 0;
|
||||
top->pImpl->nextFieldOffset = nextOffset;
|
||||
}
|
||||
|
||||
void PVField::computeOffset(PVField * pvField,int offset) {
|
||||
|
||||
@@ -54,11 +54,8 @@ namespace epics { namespace pvData {
|
||||
}
|
||||
|
||||
void BaseField::toString(StringBuilder buffer,int indentLevel) const{
|
||||
newLine(buffer,indentLevel);
|
||||
*buffer += "field ";
|
||||
*buffer += " ";
|
||||
*buffer += fieldName.c_str();
|
||||
*buffer += " type ";
|
||||
TypeFunc::toString(buffer,type);
|
||||
}
|
||||
|
||||
Scalar::~Scalar(){}
|
||||
@@ -85,9 +82,8 @@ namespace epics { namespace pvData {
|
||||
|
||||
|
||||
void BaseScalar::toString(StringBuilder buffer,int indentLevel) const{
|
||||
BaseField::toString(buffer,indentLevel);
|
||||
*buffer += " scalarType ";
|
||||
ScalarTypeFunc::toString(buffer,scalarType);
|
||||
BaseField::toString(buffer,indentLevel);
|
||||
}
|
||||
|
||||
ScalarArray::~ScalarArray(){}
|
||||
@@ -115,9 +111,11 @@ namespace epics { namespace pvData {
|
||||
|
||||
|
||||
void BaseScalarArray::toString(StringBuilder buffer,int indentLevel) const{
|
||||
String temp = String();
|
||||
ScalarTypeFunc::toString(&temp,elementType);
|
||||
temp += "Array";
|
||||
*buffer += temp;
|
||||
BaseField::toString(buffer,indentLevel);
|
||||
*buffer += " elementType ";
|
||||
ScalarTypeFunc::toString(buffer,elementType);
|
||||
}
|
||||
|
||||
Structure::~Structure(){}
|
||||
@@ -196,14 +194,14 @@ namespace epics { namespace pvData {
|
||||
}
|
||||
|
||||
void BaseStructure::toString(StringBuilder buffer,int indentLevel) const{
|
||||
*buffer += "structure";
|
||||
BaseField::toString(buffer,indentLevel);
|
||||
*buffer += " {";
|
||||
newLine(buffer,indentLevel+1);
|
||||
for(int i=0; i<numberFields; i++) {
|
||||
FieldConstPtr pfield = fields[i];
|
||||
pfield->toString(buffer,indentLevel+1);
|
||||
if(i<numberFields-1) newLine(buffer,indentLevel+1);
|
||||
}
|
||||
newLine(buffer,indentLevel);
|
||||
*buffer += "}";
|
||||
}
|
||||
|
||||
StructureArray::~StructureArray(){}
|
||||
@@ -239,8 +237,9 @@ namespace epics { namespace pvData {
|
||||
|
||||
|
||||
void BaseStructureArray::toString(StringBuilder buffer,int indentLevel) const {
|
||||
*buffer += " structureArray ";
|
||||
BaseField::toString(buffer,indentLevel);
|
||||
*buffer += " structure ";
|
||||
newLine(buffer,indentLevel + 1);
|
||||
pstructure->toString(buffer,indentLevel + 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -52,14 +52,14 @@ namespace epics { namespace pvData {
|
||||
void ScalarTypeFunc::toString(StringBuilder buf,const ScalarType scalarType) {
|
||||
static String unknownString = "logic error unknown ScalarType";
|
||||
switch(scalarType) {
|
||||
case pvBoolean : *buf += "pvBoolean"; return;
|
||||
case pvByte : *buf += "pvByte"; return;;
|
||||
case pvShort : *buf += "pvShort"; return;
|
||||
case pvInt : *buf += "pvInt"; return;
|
||||
case pvLong : *buf += "pvLong"; return;
|
||||
case pvFloat : *buf += "pvFloat"; return;
|
||||
case pvDouble : *buf += "pvDouble"; return;
|
||||
case pvString : *buf += "pvString"; return;
|
||||
case pvBoolean : *buf += "boolean"; return;
|
||||
case pvByte : *buf += "byte"; return;;
|
||||
case pvShort : *buf += "short"; return;
|
||||
case pvInt : *buf += "int"; return;
|
||||
case pvLong : *buf += "long"; return;
|
||||
case pvFloat : *buf += "float"; return;
|
||||
case pvDouble : *buf += "double"; return;
|
||||
case pvString : *buf += "string"; return;
|
||||
}
|
||||
throw std::invalid_argument(unknownString);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user