]> git.mxchange.org Git - simgear.git/blobdiff - simgear/hla/HLAFixedRecordDataElement.cxx
hla: Make use of SGLocation.
[simgear.git] / simgear / hla / HLAFixedRecordDataElement.cxx
index 9a0311bdec0a83b2ef8ee1447db031e291c36345..f1275808537b384a1c583652958438a2eb30d81d 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
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
+
+#include <simgear/compiler.h>
+
 #include "HLAFixedRecordDataElement.hxx"
 
 #include <string>
@@ -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)
 {