X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fhla%2FHLAVariantRecordDataElement.cxx;h=704d4360d459e0e71f72627ea1f4e4e370979c00;hb=2c1fbd558b355cbe9f8902962cbeb492915236f3;hp=6acb9fd521f969235de98c13224fc8025e331c79;hpb=cc8977b83d5ba20a040d1f9d54d884f6c576985e;p=simgear.git diff --git a/simgear/hla/HLAVariantRecordDataElement.cxx b/simgear/hla/HLAVariantRecordDataElement.cxx index 6acb9fd5..704d4360 100644 --- a/simgear/hla/HLAVariantRecordDataElement.cxx +++ b/simgear/hla/HLAVariantRecordDataElement.cxx @@ -26,6 +26,7 @@ #include #include "HLADataElementVisitor.hxx" +#include "HLADataTypeVisitor.hxx" namespace simgear { @@ -122,6 +123,58 @@ HLAVariantRecordDataElement::~HLAVariantRecordDataElement() clearStamp(); } +bool +HLAVariantRecordDataElement::setDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end, HLADataElement* dataElement) +{ + // Must have happened in the parent + if (begin == end) + return false; + unsigned index = *begin; + if (++begin != end) { + if (!setAlternativeIndex(index)) + return false; + if (!_dataElement.valid() && getAlternativeDataType()) { + HLADataElementFactoryVisitor visitor; + getAlternativeDataType()->accept(visitor); + _dataElement = visitor.getDataElement(); + } + if (!_dataElement.valid()) + return false; + return _dataElement->setDataElement(begin, end, dataElement); + } else { + if (!setAlternativeIndex(index)) + return false; + if (!dataElement->setDataType(getAlternativeDataType())) + return false; + _dataElement = dataElement; + return true; + } +} + +HLADataElement* +HLAVariantRecordDataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end) +{ + if (begin == end) + return this; + if (getAlternativeIndex() != *begin) + return 0; + if (!_dataElement.valid()) + return 0; + return _dataElement->getDataElement(++begin, end); +} + +const HLADataElement* +HLAVariantRecordDataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end) const +{ + if (begin == end) + return this; + if (getAlternativeIndex() != *begin) + return 0; + if (!_dataElement.valid()) + return 0; + return _dataElement->getDataElement(++begin, end); +} + bool HLAVariantRecordDataElement::setAlternativeIndex(unsigned index) {