X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fhla%2FHLAArrayDataElement.cxx;h=191a84eb1d766130bcbe0c789c710526d1c923e5;hb=d4310a7f3b27b8403ba1ec030cfd3b4c6c565f24;hp=3746cbd88b4fecd875733e36a4e89e74d7df6c64;hpb=dc9163f8016047f29603c3d40032655132f5c109;p=simgear.git diff --git a/simgear/hla/HLAArrayDataElement.cxx b/simgear/hla/HLAArrayDataElement.cxx index 3746cbd8..191a84eb 100644 --- a/simgear/hla/HLAArrayDataElement.cxx +++ b/simgear/hla/HLAArrayDataElement.cxx @@ -15,6 +15,12 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + #include "HLAArrayDataElement.hxx" #include @@ -99,6 +105,55 @@ HLAArrayDataElement::HLAArrayDataElement(const HLAArrayDataType* dataType) : HLAArrayDataElement::~HLAArrayDataElement() { + clearStamp(); +} + +bool +HLAArrayDataElement::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 (getNumElements() <= index && !setNumElements(index + 1)) + return false; + if (!getElement(index) && getElementDataType()) { + HLADataElementFactoryVisitor visitor; + getElementDataType()->accept(visitor); + setElement(index, visitor.getDataElement()); + } + if (!getElement(index)) + return false; + return getElement(index)->setDataElement(begin, end, dataElement); + } else { + if (!dataElement->setDataType(getElementDataType())) + return false; + setElement(index, dataElement); + return true; + } +} + +HLADataElement* +HLAArrayDataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end) +{ + if (begin == end) + return this; + HLADataElement* dataElement = getElement(*begin); + if (!dataElement) + return 0; + return dataElement->getDataElement(++begin, end); +} + +const HLADataElement* +HLAArrayDataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end) const +{ + if (begin == end) + return this; + const HLADataElement* dataElement = getElement(*begin); + if (!dataElement) + return 0; + return dataElement->getDataElement(++begin, end); } bool @@ -110,6 +165,7 @@ HLAArrayDataElement::setNumElements(unsigned size) _elementVector.resize(size); for (unsigned i = oldSize; i < size; ++i) _elementVector[i] = newElement(i); + setDirty(true); return true; } @@ -171,7 +227,12 @@ HLAArrayDataElement::setElement(unsigned index, HLADataElement* value) for (unsigned j = oldSize; j < index; ++j) _elementVector[j] = newElement(j); } + if (_elementVector[index].valid()) + _elementVector[index]->clearStamp(); _elementVector[index] = value; + if (value) + value->attachStamp(*this); + setDirty(true); } void @@ -186,12 +247,27 @@ HLAArrayDataElement::getDataElementFactory() return _dataElementFactory.get(); } +void +HLAArrayDataElement::_setStamp(Stamp* stamp) +{ + HLAAbstractArrayDataElement::_setStamp(stamp); + for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) { + if (!i->valid()) + continue; + (*i)->attachStamp(*this); + } +} + HLADataElement* HLAArrayDataElement::newElement(unsigned index) { if (!_dataElementFactory.valid()) return 0; - return _dataElementFactory->createElement(*this, index); + HLADataElement* dataElement = _dataElementFactory->createElement(*this, index); + if (!dataElement) + return 0; + dataElement->attachStamp(*this); + return dataElement; } //////////////////////////////////////////////////////////////////////// @@ -203,6 +279,7 @@ HLAVariantArrayDataElement::HLAVariantArrayDataElement() : HLAVariantArrayDataElement::~HLAVariantArrayDataElement() { + clearStamp(); } bool @@ -231,6 +308,7 @@ HLAVariantArrayDataElement::setNumElements(unsigned size) _elementVector.resize(size); for (unsigned i = oldSize; i < size; ++i) _elementVector[i] = newElement(); + setDirty(true); return true; } @@ -292,7 +370,12 @@ HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantRecordDataEleme for (unsigned j = oldSize; j < index; ++j) _elementVector[j] = newElement(); } + if (_elementVector[index].valid()) + _elementVector[index]->clearStamp(); _elementVector[index] = value; + if (value) + value->attachStamp(*this); + setDirty(true); } void @@ -307,6 +390,17 @@ HLAVariantArrayDataElement::getAlternativeDataElementFactory() return _alternativeDataElementFactory.get(); } +void +HLAVariantArrayDataElement::_setStamp(Stamp* stamp) +{ + HLAAbstractArrayDataElement::_setStamp(stamp); + for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) { + if (!i->valid()) + continue; + (*i)->attachStamp(*this); + } +} + HLAVariantRecordDataElement* HLAVariantArrayDataElement::newElement() { @@ -321,6 +415,7 @@ HLAVariantArrayDataElement::newElement() return 0; HLAVariantRecordDataElement* variantRecordDataElement = new HLAVariantRecordDataElement(variantRecordDataType); variantRecordDataElement->setDataElementFactory(_alternativeDataElementFactory.get()); + variantRecordDataElement->attachStamp(*this); return variantRecordDataElement; }