]> git.mxchange.org Git - simgear.git/commitdiff
hla: add missing file fir the last commit.
authorMathias Froehlich <Mathias.Froehlich@web.de>
Tue, 4 Oct 2011 18:27:59 +0000 (20:27 +0200)
committerMathias Froehlich <Mathias.Froehlich@web.de>
Tue, 4 Oct 2011 18:27:59 +0000 (20:27 +0200)
simgear/hla/HLADataTypeVisitor.cxx [new file with mode: 0644]

diff --git a/simgear/hla/HLADataTypeVisitor.cxx b/simgear/hla/HLADataTypeVisitor.cxx
new file mode 100644 (file)
index 0000000..a13d12a
--- /dev/null
@@ -0,0 +1,188 @@
+// Copyright (C) 2009 - 2010  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
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//
+
+#include "HLADataTypeVisitor.hxx"
+
+#include "HLAArrayDataElement.hxx"
+#include "HLABasicDataElement.hxx"
+#include "HLADataTypeVisitor.hxx"
+#include "HLAEnumeratedDataElement.hxx"
+#include "HLAFixedRecordDataElement.hxx"
+#include "HLAVariantDataElement.hxx"
+
+namespace simgear {
+
+HLADataElementFactoryVisitor::~HLADataElementFactoryVisitor()
+{
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLADataType& dataType)
+{
+    SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Can not find a suitable data element for data type \""
+           << dataType.getName() << "\"");
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAInt8DataType& dataType)
+{
+    _dataElement = new HLASCharDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAUInt8DataType& dataType)
+{
+    _dataElement = new HLAUCharDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAInt16DataType& dataType)
+{
+    _dataElement = new HLAShortDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAUInt16DataType& dataType)
+{
+    _dataElement = new HLAUShortDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAInt32DataType& dataType)
+{
+    _dataElement = new HLAIntDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAUInt32DataType& dataType)
+{
+    _dataElement = new HLAUIntDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAInt64DataType& dataType)
+{
+    _dataElement = new HLALongDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAUInt64DataType& dataType)
+{
+    _dataElement = new HLAULongDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAFloat32DataType& dataType)
+{
+    _dataElement = new HLAFloatDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAFloat64DataType& dataType)
+{
+    _dataElement = new HLADoubleDataElement(&dataType);
+}
+
+class HLADataElementFactoryVisitor::ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
+public:
+    virtual HLADataElement* createElement(const HLAArrayDataElement& element, unsigned index)
+    {
+        const HLADataType* dataType = element.getElementDataType();
+        if (!dataType)
+            return 0;
+        
+        HLADataElementFactoryVisitor visitor;
+        dataType->accept(visitor);
+        return visitor.getDataElement();
+    }
+};
+
+void
+HLADataElementFactoryVisitor::apply(const HLAFixedArrayDataType& dataType)
+{
+    if (dataType.getIsString()) {
+        _dataElement = new HLAStringDataElement(&dataType);
+    } else {
+        SGSharedPtr<HLAArrayDataElement> arrayDataElement;
+        arrayDataElement = new HLAArrayDataElement(&dataType);
+        arrayDataElement->setDataElementFactory(new ArrayDataElementFactory);
+        arrayDataElement->setNumElements(dataType.getNumElements());
+        _dataElement = arrayDataElement;
+    }
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAVariableArrayDataType& dataType)
+{
+    if (dataType.getIsString()) {
+        _dataElement = new HLAStringDataElement(&dataType);
+    } else {
+        SGSharedPtr<HLAArrayDataElement> arrayDataElement;
+        arrayDataElement = new HLAArrayDataElement(&dataType);
+        arrayDataElement->setDataElementFactory(new ArrayDataElementFactory);
+        _dataElement = arrayDataElement;
+    }
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAEnumeratedDataType& dataType)
+{
+    _dataElement = new HLAEnumeratedDataElement(&dataType);
+}
+
+void
+HLADataElementFactoryVisitor::apply(const HLAFixedRecordDataType& dataType)
+{
+    SGSharedPtr<HLAFixedRecordDataElement> recordDataElement;
+    recordDataElement = new HLAFixedRecordDataElement(&dataType);
+
+    unsigned numFields = dataType.getNumFields();
+    for (unsigned i = 0; i < numFields; ++i) {
+        HLADataElementFactoryVisitor visitor;
+        dataType.getFieldDataType(i)->accept(visitor);
+        recordDataElement->setField(i, visitor._dataElement.get());
+    }
+
+    _dataElement = recordDataElement;
+}
+
+class HLADataElementFactoryVisitor::VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
+public:
+    virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
+    {
+        const HLAVariantDataType* dataType = element.getDataType();
+        if (!dataType)
+            return 0;
+        const HLADataType* alternativeDataType = element.getAlternativeDataType();
+        if (!alternativeDataType)
+            return 0;
+        HLADataElementFactoryVisitor visitor;
+        alternativeDataType->accept(visitor);
+        return visitor.getDataElement();
+    }
+};
+
+void
+HLADataElementFactoryVisitor::apply(const HLAVariantDataType& dataType)
+{
+    SGSharedPtr<HLAVariantDataElement> variantDataElement;
+    variantDataElement = new HLAVariantDataElement(&dataType);
+    variantDataElement->setDataElementFactory(new VariantDataElementFactory);
+    _dataElement = variantDataElement;
+}
+
+} // namespace simgear