HLAArrayDataElement::~HLAArrayDataElement()
{
+ clearStamp();
}
bool
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);
}
void
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;
}
////////////////////////////////////////////////////////////////////////
HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
{
+ clearStamp();
}
bool
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);
}
void
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()
{
return 0;
HLAVariantRecordDataElement* variantRecordDataElement = new HLAVariantRecordDataElement(variantRecordDataType);
variantRecordDataElement->setDataElementFactory(_alternativeDataElementFactory.get());
+ variantRecordDataElement->attachStamp(*this);
return variantRecordDataElement;
}
void setDataElementFactory(DataElementFactory* dataElementFactory);
DataElementFactory* getDataElementFactory();
+protected:
+ virtual void _setStamp(Stamp* stamp);
+
private:
HLADataElement* newElement(unsigned index);
void setAlternativeDataElementFactory(AlternativeDataElementFactory* alternativeDataElementFactory);
AlternativeDataElementFactory* getAlternativeDataElementFactory();
+protected:
+ virtual void _setStamp(Stamp* stamp);
+
private:
HLAVariantRecordDataElement* newElement();
{
}
+void
+HLADataElement::setTimeStamp(const SGTimeStamp& timeStamp)
+{
+ if (!_stamp.valid())
+ return;
+ _stamp->setTimeStamp(timeStamp);
+}
+
+void
+HLADataElement::setTimeStampValid(bool timeStampValid)
+{
+ if (!_stamp.valid())
+ return;
+ _stamp->setTimeStampValid(timeStampValid);
+}
+
+double
+HLADataElement::getTimeDifference(const SGTimeStamp& timeStamp) const
+{
+ if (!_stamp.valid())
+ return 0;
+ if (!_stamp->getTimeStampValid())
+ return 0;
+ return (timeStamp - _stamp->getTimeStamp()).toSecs();
+}
+
+void
+HLADataElement::createStamp()
+{
+ _setStamp(new Stamp);
+ setDirty(true);
+}
+
+void
+HLADataElement::attachStamp(HLADataElement& dataElement)
+{
+ _setStamp(dataElement._getStamp());
+}
+
+void
+HLADataElement::clearStamp()
+{
+ _setStamp(0);
+}
+
void
HLADataElement::accept(HLADataElementVisitor& visitor)
{
return StringPathPair(attribute, path);
}
+void
+HLADataElement::_setStamp(HLADataElement::Stamp* stamp)
+{
+ _stamp = stamp;
+}
+
}
virtual const HLADataType* getDataType() const = 0;
virtual bool setDataType(const HLADataType* dataType) = 0;
- // Container for the timestamp the originating attribute was last updated for
- // class TimeStamp : public SGReferenced {
- // public:
- // const SGTimeStamp& getTimeStamp() const
- // { return _timeStamp; }
- // void setTimeStamp(const SGTimeStamp& timeStamp)
- // { _timeStamp = timeStamp; }
- // private:
- // SGTimeStamp _timeStamp;
- // };
-
- // const TimeStamp* getTimeStamp() const
- // { return _timeStamp.get(); }
- // void setTimeStamp(const TimeStamp* timeStamp)
- // { _timeStamp = timeStamp; }
-
- // struct ChangeCount : public SGReferenced {
- // ChangeCount() : _value(0) {}
- // unsigned _value;
- // };
- // SGSharedPtr<ChangeCount> _changeCount;
- // unsigned getChangeCount() const
- // {
- // // If we don't have return allways the same
- // if (!_changeCount.valid())
- // return 0;
- // return _changeCount->_value;
- // }
+ /// Returns the time stamp if this data element.
+ /// Do not access this getter if the getTimeStampValid() method returns false.
+ const SGTimeStamp& getTimeStamp() const
+ { return _stamp->getTimeStamp(); }
+ void setTimeStamp(const SGTimeStamp& timeStamp);
+
+ bool getTimeStampValid() const
+ { if (!_stamp.valid()) return false; return _stamp->getTimeStampValid(); }
+ void setTimeStampValid(bool timeStampValid);
+
+ /// Convenience function that gives the time difference in seconds to a given timestamp
+ /// This function returns 0 if the timestamp is not valid.
+ double getTimeDifference(const SGTimeStamp& timeStamp) const;
+
+ /// Dirty tracking of the attribute/parameter that this data element belongs to
+ bool getDirty() const
+ { if (!_stamp.valid()) return true; return _stamp->getDirty(); }
+ void setDirty(bool dirty)
+ { if (!_stamp.valid()) return; _stamp->setDirty(dirty); }
+
+ /// Stamp handling
+ void createStamp();
+ void attachStamp(HLADataElement& dataElement);
+ void clearStamp();
/// HLADataElements could be identified by path
/// These paths are composed of structure field names and array indices in the
static Path toPath(const std::string& s)
{ return toStringPathPair(s).second; }
+protected:
+ // Container for the timestamp the originating attribute was last updated for
+ class Stamp : public SGReferenced {
+ public:
+ Stamp() : _timeStampValid(false), _dirty(true)
+ { }
+
+ const SGTimeStamp& getTimeStamp() const
+ { return _timeStamp; }
+ void setTimeStamp(const SGTimeStamp& timeStamp)
+ { _timeStamp = timeStamp; }
+
+ bool getTimeStampValid() const
+ { return _timeStampValid; }
+ void setTimeStampValid(bool timeStampValid)
+ { _timeStampValid = timeStampValid; }
+
+ bool getDirty() const
+ { return _dirty; }
+ void setDirty(bool dirty)
+ { _dirty = dirty; }
+
+ private:
+ SGTimeStamp _timeStamp;
+ bool _timeStampValid;
+ bool _dirty;
+ };
+
+ /// get the stamp
+ Stamp* _getStamp() const
+ { return _stamp.get(); }
+ /// Set the stamp
+ virtual void _setStamp(Stamp* stamp);
+
private:
- // SGSharedPtr<const TimeStamp> _timeStamp;
+ SGSharedPtr<Stamp> _stamp;
};
class HLADataElementProvider {
HLAFixedRecordDataElement::~HLAFixedRecordDataElement()
{
+ clearStamp();
}
bool
{
if (getNumFields() <= index)
return;
+ if (_fieldVector[index].valid())
+ _fieldVector[index]->clearStamp();
_fieldVector[index] = value;
+ if (value)
+ value->attachStamp(*this);
}
void
setField(getFieldNumber(name), value);
}
+void
+HLAFixedRecordDataElement::_setStamp(Stamp* stamp)
+{
+ HLAAbstractFixedRecordDataElement::_setStamp(stamp);
+ for (FieldVector::iterator i = _fieldVector.begin(); i != _fieldVector.end(); ++i) {
+ if (!i->valid())
+ continue;
+ (*i)->attachStamp(*this);
+ }
+}
+
}
void setField(unsigned index, HLADataElement* value);
void setField(const std::string& name, HLADataElement* value);
+protected:
+ virtual void _setStamp(Stamp* stamp);
+
private:
typedef std::vector<SGSharedPtr<HLADataElement> > FieldVector;
FieldVector _fieldVector;
if (numAttributes <= index)
return;
_attributeVector.resize(numAttributes);
+ if (_attributeVector[index]._dataElement.valid())
+ _attributeVector[index]._dataElement->clearStamp();
_attributeVector[index]._dataElement = dataElement;
+ if (_attributeVector[index]._dataElement.valid())
+ _attributeVector[index]._dataElement->createStamp();
if (getAttributeOwned(index))
encodeAttributeValue(index);
}
HLADataElement* dataElement = getAttributeDataElement(index);
if (!dataElement)
return;
+ dataElement->setTimeStampValid(false);
_rtiObjectInstance->decodeAttributeData(index, *dataElement);
}
HLADataElement* dataElement = getAttributeDataElement(index);
if (!dataElement)
return;
- // dataElement->setTimeStamp(timeStamp);
+ dataElement->setTimeStamp(timeStamp);
+ dataElement->setTimeStampValid(true);
_rtiObjectInstance->decodeAttributeData(index, *dataElement);
}
HLAVariantRecordDataElement::~HLAVariantRecordDataElement()
{
+ clearStamp();
}
bool
return _dataElementFactory;
}
+void
+HLAVariantRecordDataElement::_setStamp(Stamp* stamp)
+{
+ HLAAbstractVariantRecordDataElement::_setStamp(stamp);
+ if (!_dataElement.valid())
+ return;
+ _dataElement->attachStamp(*this);
+}
+
HLADataElement*
HLAVariantRecordDataElement::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;
}
}
void setDataElementFactory(DataElementFactory* dataElementFactory);
DataElementFactory* getDataElementFactory();
+protected:
+ virtual void _setStamp(Stamp* stamp);
+
private:
HLADataElement* newElement(unsigned index);