#include #include #include #include #include #include "pvData.h" namespace epics { namespace pvData { static void newLine(StringPtr buffer,int indentLevel) { *buffer += "\n"; for(int i=0; igetFieldName(); } } BaseStructure::~BaseStructure() { for(int i=0; icompare(*pfield->getFieldName()); if(result==0) return pfield; } return 0; } int BaseStructure::getFieldIndex(StringConstPtr fieldName) const { for(int i=0; icompare(*pfield->getFieldName()); if(result==0) return i; } return -1; } void BaseStructure::toString(StringPtr buffer,int indentLevel) const{ BaseField::toString(buffer,indentLevel); *buffer += " {"; for(int i=0; itoString(buffer,indentLevel+1); } newLine(buffer,indentLevel); *buffer += "}"; } StructureArray::~StructureArray(){} class BaseStructureArray: private BaseField,public StructureArray { public: BaseStructureArray(StringConstPtr fieldName,StructureConstPtr structure); virtual ~BaseStructureArray(); virtual StringConstPtr getFieldName() const{ return BaseField::getFieldName(); } virtual Type getType() const{return BaseField::getType();} virtual StructureConstPtr getStructure() const { return pstructure; } virtual void toString(StringPtr buf) const {toString(buf,0);} virtual void toString(StringPtr buf,int indentLevel) const; private: StructureConstPtr pstructure; }; BaseStructureArray::BaseStructureArray(StringConstPtr fieldName,StructureConstPtr structure) : BaseField(fieldName,structureArray),pstructure(structure) {} BaseStructureArray::~BaseStructureArray() {} void BaseStructureArray::toString(StringPtr buffer,int indentLevel) const { BaseField::toString(buffer,indentLevel); *buffer += " structure "; pstructure->toString(buffer,indentLevel + 1); } static std::string notImplemented = "not implemented"; static std::string logicError = "Logic Error. Should never get here"; FieldCreate::FieldCreate(){}; ScalarConstPtr FieldCreate::createScalar(StringConstPtr fieldName, ScalarType scalarType) const { BaseScalar *baseScalar = new BaseScalar(fieldName,scalarType); return baseScalar; } ScalarArrayConstPtr FieldCreate::createScalarArray( StringConstPtr fieldName,ScalarType elementType) const { BaseScalarArray *baseScalarArray = new BaseScalarArray(fieldName,elementType); return baseScalarArray; } StructureConstPtr FieldCreate::createStructure ( StringConstPtr fieldName,int numberFields, FieldConstPtr fields[]) const { BaseStructure *baseStructure = new BaseStructure( fieldName,numberFields,fields); return baseStructure; } StructureArrayConstPtr FieldCreate::createStructureArray( StringConstPtr fieldName,StructureConstPtr structure) const { throw std::invalid_argument(notImplemented); } FieldConstPtr FieldCreate::create(StringConstPtr fieldName, FieldConstPtr pfield) const { Type type = pfield->getType(); switch(type) { case scalar: { ScalarConstPtr pscalar = dynamic_cast(pfield); return createScalar(fieldName,pscalar->getScalarType()); } case scalarArray: { ScalarArrayConstPtr pscalarArray = dynamic_cast(pfield); return createScalarArray(fieldName,pscalarArray->getElementType()); } case structure: { StructureConstPtr pstructure = dynamic_cast(pfield); return createStructure(fieldName,pstructure->getNumberFields(),pstructure->getFields()); } case structureArray: { StructureArrayConstPtr pstructureArray = dynamic_cast(pfield); return createStructureArray(fieldName,pstructureArray->getStructure()); } } throw std::logic_error(logicError); } static FieldCreate* instance = 0; class FieldCreateExt : public FieldCreate { public: FieldCreateExt(): FieldCreate(){}; }; FieldCreate * getFieldCreate() { if(instance==0) instance = new FieldCreateExt(); return instance; } }}