diff --git a/src/nt/ntndarray.cpp b/src/nt/ntndarray.cpp index f225d6c..9c01444 100644 --- a/src/nt/ntndarray.cpp +++ b/src/nt/ntndarray.cpp @@ -62,6 +62,7 @@ StructureConstPtr NTNDArray::createStructure(bool hasDescriptor, const size_t NUMBER_OF_STRUCTURES = 1 << NUMBER_OF_INDICES; static epics::pvData::StructureConstPtr ntndarrayStruc[NUMBER_OF_STRUCTURES]; + static epics::pvData::UnionConstPtr valueType; static epics::pvData::StructureConstPtr codecStruc; static epics::pvData::StructureConstPtr dimensionStruc; static epics::pvData::StructureConstPtr attributeStruc; @@ -80,13 +81,21 @@ StructureConstPtr NTNDArray::createStructure(bool hasDescriptor, StandardFieldPtr standardField = getStandardField(); FieldBuilderPtr fb = fieldCreate->createFieldBuilder(); - UnionConstPtr codecParameters = fb->createUnion(); + if (valueType == NULL) + { + for (int i = pvBoolean; i < pvString; ++i) + { + ScalarType st = static_cast(i); + fb->addArray(std::string(ScalarTypeFunc::name(st)) + "Value", st); + } + valueType = fb->createUnion(); + } if (codecStruc == NULL) { codecStruc = fb->setId("codec_t")-> add("name", pvString)-> - add("parameters", codecParameters)-> + add("parameters", fieldCreate->createVariantUnion())-> createStructure(); } @@ -113,7 +122,7 @@ StructureConstPtr NTNDArray::createStructure(bool hasDescriptor, } fb->setId(URI)-> - add("value", makeValueType())-> + add("value", valueType)-> add("compressedSize", pvLong)-> add("uncompressedSize", pvLong)-> add("codec", codecStruc)-> @@ -133,26 +142,6 @@ StructureConstPtr NTNDArray::createStructure(bool hasDescriptor, return ntndarrayStruc[index]; } -UnionConstPtr NTNDArray::makeValueType() -{ - static epics::pvData::UnionConstPtr valueType; - - if (valueType == NULL) - { - FieldBuilderPtr fb = getFieldCreate()->createFieldBuilder(); - - for (int i = pvBoolean; i < pvString; ++i) - { - ScalarType st = static_cast(i); - fb->addArray(std::string(ScalarTypeFunc::name(st)) + "Value", st); - } - - valueType = fb->createUnion(); - } - return valueType; -} - - bool NTNDArray::attachTimeStamp(PVTimeStamp &pvTimeStamp) const { PVStructurePtr ts = getTimeStamp(); diff --git a/src/nt/ntndarray.h b/src/nt/ntndarray.h index feec21f..0562178 100644 --- a/src/nt/ntndarray.h +++ b/src/nt/ntndarray.h @@ -157,7 +157,6 @@ public: private: NTNDArray(epics::pvData::PVStructurePtr const & pvStructure); - static epics::pvData::UnionConstPtr makeValueType(); epics::pvData::PVStructurePtr pvNTNDArray; };