X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fhla%2FHLAFixedRecordDataElement.cxx;h=f1275808537b384a1c583652958438a2eb30d81d;hb=d4310a7f3b27b8403ba1ec030cfd3b4c6c565f24;hp=d04c273233ad843b703d7a2f3ea78883725f88bc;hpb=a07ca86207108af66ca3335e4fcc11935c5ef079;p=simgear.git diff --git a/simgear/hla/HLAFixedRecordDataElement.cxx b/simgear/hla/HLAFixedRecordDataElement.cxx index d04c2732..f1275808 100644 --- a/simgear/hla/HLAFixedRecordDataElement.cxx +++ b/simgear/hla/HLAFixedRecordDataElement.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de +// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public @@ -15,6 +15,12 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + #include "HLAFixedRecordDataElement.hxx" #include @@ -90,24 +96,32 @@ HLAAbstractFixedRecordDataElement::setDataType(const HLAFixedRecordDataType* dat unsigned HLAAbstractFixedRecordDataElement::getNumFields() const { + if (!_dataType.valid()) + return 0; return _dataType->getNumFields(); } unsigned HLAAbstractFixedRecordDataElement::getFieldNumber(const std::string& name) const { + if (!_dataType.valid()) + return ~0u; return _dataType->getFieldNumber(name); } const HLADataType* HLAAbstractFixedRecordDataElement::getFieldDataType(unsigned i) const { + if (!_dataType.valid()) + return 0; return _dataType->getFieldDataType(i); } const HLADataType* HLAAbstractFixedRecordDataElement::getFieldDataType(const std::string& name) const { + if (!_dataType.valid()) + return 0; return getFieldDataType(getFieldNumber(name)); } @@ -123,6 +137,63 @@ HLAFixedRecordDataElement::~HLAFixedRecordDataElement() clearStamp(); } +bool +HLAFixedRecordDataElement::setDataType(const HLADataType* dataType) +{ + if (!HLAAbstractFixedRecordDataElement::setDataType(dataType)) + return false; + _fieldVector.resize(getNumFields()); + return true; +} + +bool +HLAFixedRecordDataElement::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 (getNumFields() <= index) + return false; + if (!getField(index) && getFieldDataType(index)) { + HLADataElementFactoryVisitor visitor; + getFieldDataType(index)->accept(visitor); + setField(index, visitor.getDataElement()); + } + if (!getField(index)) + return false; + return getField(index)->setDataElement(begin, end, dataElement); + } else { + if (!dataElement->setDataType(getFieldDataType(index))) + return false; + setField(index, dataElement); + return true; + } +} + +HLADataElement* +HLAFixedRecordDataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end) +{ + if (begin == end) + return this; + HLADataElement* dataElement = getField(*begin); + if (!dataElement) + return 0; + return dataElement->getDataElement(++begin, end); +} + +const HLADataElement* +HLAFixedRecordDataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end) const +{ + if (begin == end) + return this; + const HLADataElement* dataElement = getField(*begin); + if (!dataElement) + return 0; + return dataElement->getDataElement(++begin, end); +} + bool HLAFixedRecordDataElement::decodeField(HLADecodeStream& stream, unsigned i) { @@ -187,6 +258,7 @@ HLAFixedRecordDataElement::setField(unsigned index, HLADataElement* value) _fieldVector[index] = value; if (value) value->attachStamp(*this); + setDirty(true); } void