#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"
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
return _rtiObjectInstance->getDataElement(index);
}
-class HLAObjectInstance::DataElementFactoryVisitor : public HLADataTypeVisitor {
+class HLAObjectInstance::DataElementFactoryVisitor : public HLADataElementFactoryVisitor {
public:
DataElementFactoryVisitor(const HLAPathElementMap& pathElementMap) :
_pathElementMap(pathElementMap)
if (_dataElement.valid())
return;
- _dataElement = new HLASCharDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt8DataType& dataType)
{
if (_dataElement.valid())
return;
- _dataElement = new HLAUCharDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAInt16DataType& dataType)
{
if (_dataElement.valid())
return;
- _dataElement = new HLAShortDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt16DataType& dataType)
{
if (_dataElement.valid())
return;
- _dataElement = new HLAUShortDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAInt32DataType& dataType)
{
if (_dataElement.valid())
return;
- _dataElement = new HLAIntDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt32DataType& dataType)
{
if (_dataElement.valid())
return;
- _dataElement = new HLAUIntDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAInt64DataType& dataType)
{
if (_dataElement.valid())
return;
- _dataElement = new HLALongDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt64DataType& dataType)
{
if (_dataElement.valid())
return;
- _dataElement = new HLAULongDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAFloat32DataType& dataType)
{
if (_dataElement.valid())
return;
- _dataElement = new HLAFloatDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAFloat64DataType& dataType)
{
if (_dataElement.valid())
return;
- _dataElement = new HLADoubleDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
class ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
if (_dataElement.valid())
return;
- _dataElement = new HLAEnumeratedDataElement(&dataType);
+ HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAFixedRecordDataType& dataType)
_dataElement = variantDataElement;
}
- const SGSharedPtr<HLADataElement>& getDataElement() const
- { return _dataElement; }
-
private:
SGSharedPtr<HLADataElement> createDataElement(const HLADataElement::Path& path, const HLADataType& dataType)
{
return dataElement;
}
- SGSharedPtr<HLADataElement> _dataElement;
const HLAPathElementMap& _pathElementMap;
HLADataElement::Path _path;
};