]> git.mxchange.org Git - simgear.git/blobdiff - simgear/hla/HLAArrayDataElement.cxx
math: Move lerp function into SGMisc.
[simgear.git] / simgear / hla / HLAArrayDataElement.cxx
index e2a7fc7365bcda52ff2cbd750ca03192ff94ed78..9f8f5aeb3fe095531baaaed924691a8add67b1fa 100644 (file)
@@ -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
@@ -19,6 +19,8 @@
 
 #include <simgear/debug/logstream.hxx>
 
+#include "HLADataElementVisitor.hxx"
+
 namespace simgear {
 
 HLAAbstractArrayDataElement::HLAAbstractArrayDataElement(const HLAArrayDataType* dataType) :
@@ -30,6 +32,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 +99,7 @@ HLAArrayDataElement::HLAArrayDataElement(const HLAArrayDataType* dataType) :
 
 HLAArrayDataElement::~HLAArrayDataElement()
 {
+    clearStamp();
 }
 
 bool
@@ -96,6 +111,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 +173,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 +193,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 +225,7 @@ HLAVariantArrayDataElement::HLAVariantArrayDataElement() :
 
 HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
 {
+    clearStamp();
 }
 
 bool
@@ -199,8 +236,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 +254,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 +282,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 +290,7 @@ HLAVariantArrayDataElement::getElement(unsigned index) const
     return _elementVector[index].get();
 }
 
-HLAVariantDataElement*
+HLAVariantRecordDataElement*
 HLAVariantArrayDataElement::getElement(unsigned index)
 {
     if (_elementVector.size() <= index)
@@ -260,7 +298,7 @@ HLAVariantArrayDataElement::getElement(unsigned index)
     return _elementVector[index].get();
 }
 
-HLAVariantDataElement*
+HLAVariantRecordDataElement*
 HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
 {
     if (_elementVector.size() <= index)
@@ -270,7 +308,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 +316,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 +336,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 +356,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;
 }
 
 }