X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fhla%2FHLAArrayDataElement.cxx;h=191a84eb1d766130bcbe0c789c710526d1c923e5;hb=7dc8bf3aa41655e8ae63a7193fe99b5a7802a6b7;hp=e2a7fc7365bcda52ff2cbd750ca03192ff94ed78;hpb=ce71b8c1cf761742ab88975442f4037b5e460114;p=simgear.git diff --git a/simgear/hla/HLAArrayDataElement.cxx b/simgear/hla/HLAArrayDataElement.cxx index e2a7fc73..191a84eb 100644 --- a/simgear/hla/HLAArrayDataElement.cxx +++ b/simgear/hla/HLAArrayDataElement.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,10 +15,18 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + #include "HLAArrayDataElement.hxx" #include +#include "HLADataElementVisitor.hxx" + namespace simgear { HLAAbstractArrayDataElement::HLAAbstractArrayDataElement(const HLAArrayDataType* dataType) : @@ -30,6 +38,18 @@ HLAAbstractArrayDataElement::~HLAAbstractArrayDataElement() { } +void +HLAAbstractArrayDataElement::accept(HLADataElementVisitor& visitor) +{ + visitor.apply(*this); +} + +void +HLAAbstractArrayDataElement::accept(HLAConstDataElementVisitor& visitor) const +{ + visitor.apply(*this); +} + bool HLAAbstractArrayDataElement::decode(HLADecodeStream& stream) { @@ -85,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 @@ -96,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; } @@ -157,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 @@ -172,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; } //////////////////////////////////////////////////////////////////////// @@ -189,6 +279,7 @@ HLAVariantArrayDataElement::HLAVariantArrayDataElement() : HLAVariantArrayDataElement::~HLAVariantArrayDataElement() { + clearStamp(); } bool @@ -199,8 +290,8 @@ HLAVariantArrayDataElement::setDataType(const HLADataType* dataType) SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type, dataType is not an array data type!"); return false; } - const HLAVariantDataType* variantDataType = arrayDataType->getElementDataType()->toVariantDataType(); - if (!variantDataType) { + const HLAVariantRecordDataType* variantRecordDataType = arrayDataType->getElementDataType()->toVariantRecordDataType(); + if (!variantRecordDataType) { SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type: arrayDataTypes element data type is no a variant data type!"); return false; } @@ -217,13 +308,14 @@ HLAVariantArrayDataElement::setNumElements(unsigned size) _elementVector.resize(size); for (unsigned i = oldSize; i < size; ++i) _elementVector[i] = newElement(); + setDirty(true); return true; } bool HLAVariantArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i) { - HLAVariantDataElement* dataElement = getElement(i); + HLAVariantRecordDataElement* dataElement = getElement(i); if (!dataElement) return false; return dataElement->decode(stream); @@ -244,7 +336,7 @@ HLAVariantArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) c return dataElement->encode(stream); } -const HLAVariantDataElement* +const HLAVariantRecordDataElement* HLAVariantArrayDataElement::getElement(unsigned index) const { if (_elementVector.size() <= index) @@ -252,7 +344,7 @@ HLAVariantArrayDataElement::getElement(unsigned index) const return _elementVector[index].get(); } -HLAVariantDataElement* +HLAVariantRecordDataElement* HLAVariantArrayDataElement::getElement(unsigned index) { if (_elementVector.size() <= index) @@ -260,7 +352,7 @@ HLAVariantArrayDataElement::getElement(unsigned index) return _elementVector[index].get(); } -HLAVariantDataElement* +HLAVariantRecordDataElement* HLAVariantArrayDataElement::getOrCreateElement(unsigned index) { if (_elementVector.size() <= index) @@ -270,7 +362,7 @@ HLAVariantArrayDataElement::getOrCreateElement(unsigned index) } void -HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantDataElement* value) +HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantRecordDataElement* value) { unsigned oldSize = _elementVector.size(); if (oldSize <= index) { @@ -278,7 +370,12 @@ HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantDataElement* va 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 @@ -293,7 +390,18 @@ HLAVariantArrayDataElement::getAlternativeDataElementFactory() return _alternativeDataElementFactory.get(); } -HLAVariantDataElement* +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() { const HLAArrayDataType* arrayDataType = getDataType(); @@ -302,12 +410,13 @@ HLAVariantArrayDataElement::newElement() const HLADataType* elementDataType = arrayDataType->getElementDataType(); if (!elementDataType) return 0; - const HLAVariantDataType* variantDataType = elementDataType->toVariantDataType(); - if (!variantDataType) + const HLAVariantRecordDataType* variantRecordDataType = elementDataType->toVariantRecordDataType(); + if (!variantRecordDataType) return 0; - HLAVariantDataElement* variantDataElement = new HLAVariantDataElement(variantDataType); - variantDataElement->setDataElementFactory(_alternativeDataElementFactory.get()); - return variantDataElement; + HLAVariantRecordDataElement* variantRecordDataElement = new HLAVariantRecordDataElement(variantRecordDataType); + variantRecordDataElement->setDataElementFactory(_alternativeDataElementFactory.get()); + variantRecordDataElement->attachStamp(*this); + return variantRecordDataElement; } }