hla: provide a data type visitor building a default data element tree.

This commit is contained in:
Mathias Froehlich
2011-10-04 20:21:12 +02:00
parent d951a55be0
commit 595328963a
4 changed files with 52 additions and 17 deletions

View File

@@ -32,6 +32,7 @@ set(HLA_SOURCES
HLABasicDataType.cxx
HLADataElement.cxx
HLADataType.cxx
HLADataTypeVisitor.cxx
HLAEnumeratedDataElement.cxx
HLAEnumeratedDataType.cxx
HLAFederate.cxx

View File

@@ -24,7 +24,7 @@
#include <simgear/math/SGMath.hxx>
#include "HLAArrayDataType.hxx"
#include "HLABasicDataType.hxx"
#include "HLADataTypeVisitor.hxx"
#include "HLADataElement.hxx"
#include "HLAEnumeratedDataType.hxx"
#include "HLAFixedRecordDataType.hxx"
#include "HLAVariantDataType.hxx"
@@ -629,6 +629,43 @@ inline void HLADataTypeEncodeVisitor::apply(const HLAVariableArrayDataType& data
dataType.getSizeDataType()->accept(numElementsVisitor);
}
/// Generate standard data elements according to the traversed type
class HLADataElementFactoryVisitor : public HLADataTypeVisitor {
public:
virtual ~HLADataElementFactoryVisitor();
virtual void apply(const HLADataType& dataType);
virtual void apply(const HLAInt8DataType& dataType);
virtual void apply(const HLAUInt8DataType& dataType);
virtual void apply(const HLAInt16DataType& dataType);
virtual void apply(const HLAUInt16DataType& dataType);
virtual void apply(const HLAInt32DataType& dataType);
virtual void apply(const HLAUInt32DataType& dataType);
virtual void apply(const HLAInt64DataType& dataType);
virtual void apply(const HLAUInt64DataType& dataType);
virtual void apply(const HLAFloat32DataType& dataType);
virtual void apply(const HLAFloat64DataType& dataType);
virtual void apply(const HLAFixedArrayDataType& dataType);
virtual void apply(const HLAVariableArrayDataType& dataType);
virtual void apply(const HLAEnumeratedDataType& dataType);
virtual void apply(const HLAFixedRecordDataType& dataType);
virtual void apply(const HLAVariantDataType& dataType);
HLADataElement* getDataElement()
{ return _dataElement.release(); }
protected:
class ArrayDataElementFactory;
class VariantDataElementFactory;
SGSharedPtr<HLADataElement> _dataElement;
};
} // namespace simgear
#endif

View File

@@ -123,7 +123,7 @@ HLAObjectInstance::getAttributeDataElement(unsigned index) const
return _rtiObjectInstance->getDataElement(index);
}
class HLAObjectInstance::DataElementFactoryVisitor : public HLADataTypeVisitor {
class HLAObjectInstance::DataElementFactoryVisitor : public HLADataElementFactoryVisitor {
public:
DataElementFactoryVisitor(const HLAPathElementMap& pathElementMap) :
_pathElementMap(pathElementMap)
@@ -150,7 +150,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLASCharDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt8DataType& dataType)
{
@@ -158,7 +158,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLAUCharDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAInt16DataType& dataType)
{
@@ -166,7 +166,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLAShortDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt16DataType& dataType)
{
@@ -174,7 +174,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLAUShortDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAInt32DataType& dataType)
{
@@ -182,7 +182,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLAIntDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt32DataType& dataType)
{
@@ -190,7 +190,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLAUIntDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAInt64DataType& dataType)
{
@@ -198,7 +198,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLALongDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt64DataType& dataType)
{
@@ -206,7 +206,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLAULongDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAFloat32DataType& dataType)
{
@@ -214,7 +214,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLAFloatDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAFloat64DataType& dataType)
{
@@ -222,7 +222,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLADoubleDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
class ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
@@ -287,7 +287,7 @@ public:
if (_dataElement.valid())
return;
_dataElement = new HLAEnumeratedDataElement(&dataType);
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAFixedRecordDataType& dataType)
@@ -357,9 +357,6 @@ public:
_dataElement = variantDataElement;
}
const SGSharedPtr<HLADataElement>& getDataElement() const
{ return _dataElement; }
private:
SGSharedPtr<HLADataElement> createDataElement(const HLADataElement::Path& path, const HLADataType& dataType)
{
@@ -381,7 +378,6 @@ private:
return dataElement;
}
SGSharedPtr<HLADataElement> _dataElement;
const HLAPathElementMap& _pathElementMap;
HLADataElement::Path _path;
};

View File

@@ -35,6 +35,7 @@ libsghla_a_SOURCES = \
HLABasicDataType.cxx \
HLADataElement.cxx \
HLADataType.cxx \
HLADataTypeVisitor.cxx \
HLAEnumeratedDataElement.cxx \
HLAEnumeratedDataType.cxx \
HLAFederate.cxx \