_attributeVector[index]._dataElement->createStamp();
}
-class HLAObjectInstance::DataElementFactoryVisitor : public HLADataElementFactoryVisitor {
-public:
- DataElementFactoryVisitor(const HLAPathElementMap& pathElementMap) :
- _pathElementMap(pathElementMap)
- { }
- DataElementFactoryVisitor(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
- _pathElementMap(pathElementMap),
- _path(path)
- { }
- virtual ~DataElementFactoryVisitor() {}
-
- virtual void apply(const HLADataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Can not find a suitable data element for data type \""
- << dataType.getName() << "\"");
- }
-
- virtual void apply(const HLAInt8DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
- virtual void apply(const HLAUInt8DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
- virtual void apply(const HLAInt16DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
- virtual void apply(const HLAUInt16DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
- virtual void apply(const HLAInt32DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
- virtual void apply(const HLAUInt32DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
- virtual void apply(const HLAInt64DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
- virtual void apply(const HLAUInt64DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
- virtual void apply(const HLAFloat32DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
- virtual void apply(const HLAFloat64DataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
-
- class ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
- public:
- ArrayDataElementFactory(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
- _path(path)
- {
- for (HLAPathElementMap::const_iterator i = pathElementMap.lower_bound(path);
- i != pathElementMap.end(); ++i) {
- if (i->first.begin() != std::search(i->first.begin(), i->first.end(),
- path.begin(), path.end()))
- break;
- _pathElementMap.insert(*i);
- }
- }
- virtual HLADataElement* createElement(const HLAArrayDataElement& element, unsigned index)
- {
- const HLADataType* dataType = element.getElementDataType();
- if (!dataType)
- return 0;
- HLADataElement::Path path = _path;
- path.push_back(HLADataElement::PathElement(index));
- DataElementFactoryVisitor visitor(path, _pathElementMap);
- dataType->accept(visitor);
- return visitor._dataElement.release();
- }
- private:
- HLADataElement::Path _path;
- HLAPathElementMap _pathElementMap;
- };
-
- virtual void apply(const HLAFixedArrayDataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- SGSharedPtr<HLAArrayDataElement> arrayDataElement;
- arrayDataElement = new HLAArrayDataElement(&dataType);
- arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_path, _pathElementMap));
- arrayDataElement->setNumElements(dataType.getNumElements());
-
- _dataElement = arrayDataElement;
- }
-
- virtual void apply(const HLAVariableArrayDataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- SGSharedPtr<HLAArrayDataElement> arrayDataElement;
- arrayDataElement = new HLAArrayDataElement(&dataType);
- arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_path, _pathElementMap));
-
- _dataElement = arrayDataElement;
- }
-
- virtual void apply(const HLAEnumeratedDataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- HLADataElementFactoryVisitor::apply(dataType);
- }
-
- virtual void apply(const HLAFixedRecordDataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- SGSharedPtr<HLAFixedRecordDataElement> recordDataElement;
- recordDataElement = new HLAFixedRecordDataElement(&dataType);
-
- unsigned numFields = dataType.getNumFields();
- for (unsigned i = 0; i < numFields; ++i) {
-
- _path.push_back(HLADataElement::PathElement(dataType.getFieldName(i)));
-
- dataType.getFieldDataType(i)->accept(*this);
- recordDataElement->setField(i, _dataElement.release());
-
- _path.pop_back();
- }
- _dataElement = recordDataElement;
- }
-
- class VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory {
- public:
- VariantRecordDataElementFactory(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
- _path(path)
- {
- for (HLAPathElementMap::const_iterator i = pathElementMap.lower_bound(path);
- i != pathElementMap.end(); ++i) {
- if (i->first.begin() != std::search(i->first.begin(), i->first.end(),
- path.begin(), path.end()))
- break;
- _pathElementMap.insert(*i);
- }
- }
- virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index)
- {
- const HLAVariantRecordDataType* dataType = element.getDataType();
- if (!dataType)
- return 0;
- const HLADataType* alternativeDataType = element.getAlternativeDataType();
- if (!alternativeDataType)
- return 0;
- HLADataElement::Path path = _path;
- path.push_back(HLADataElement::PathElement(dataType->getAlternativeName(index)));
- DataElementFactoryVisitor visitor(path, _pathElementMap);
- alternativeDataType->accept(visitor);
- return visitor._dataElement.release();
- }
- private:
- HLADataElement::Path _path;
- HLAPathElementMap _pathElementMap;
- };
-
- virtual void apply(const HLAVariantRecordDataType& dataType)
- {
- _dataElement = createDataElement(_path, dataType);
- if (_dataElement.valid())
- return;
-
- SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement;
- variantRecordDataElement = new HLAVariantRecordDataElement(&dataType);
- variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory(_path, _pathElementMap));
-
- _dataElement = variantRecordDataElement;
- }
-
-private:
- SGSharedPtr<HLADataElement> createDataElement(const HLADataElement::Path& path, const HLADataType& dataType)
- {
- HLAPathElementMap::const_iterator i = _pathElementMap.find(path);
- if (i == _pathElementMap.end()) {
- SG_LOG(SG_IO, SG_WARN, "No dataElement provided for \""
- << HLADataElement::toString(path) << "\".");
-
- return 0;
- }
- SGSharedPtr<HLADataElement> dataElement = i->second.getDataElement(path);
- if (!dataElement->setDataType(&dataType)) {
- SG_LOG(SG_IO, SG_ALERT, "Cannot set data type for data element at \""
- << HLADataElement::toString(path) << "\"!");
- return 0;
- }
- SG_LOG(SG_IO, SG_DEBUG, "Using provided dataElement for \""
- << HLADataElement::toString(path) << "\".");
- return dataElement;
- }
-
- const HLAPathElementMap& _pathElementMap;
- HLADataElement::Path _path;
-};
-
-void
-HLAObjectInstance::setAttribute(unsigned index, const HLAPathElementMap& pathElementMap)
-{
- const HLADataType* dataType = getAttributeDataType(index);
- if (!dataType) {
- SG_LOG(SG_IO, SG_ALERT, "Cannot get attribute data type for setting attribute \""
- << getAttributeName(index) << "\" at index " << index << "!");
- return;
- }
-
- SG_LOG(SG_IO, SG_DEBUG, "Setting DataElement for attribute \""
- << getAttributeName(index) << "\".");
-
- DataElementFactoryVisitor visitor(pathElementMap);
- dataType->accept(visitor);
- setAttributeDataElement(index, visitor.getDataElement());
-}
-
-void
-HLAObjectInstance::setAttributes(const HLAAttributePathElementMap& attributePathElementMap)
-{
- for (HLAAttributePathElementMap::const_iterator i = attributePathElementMap.begin();
- i != attributePathElementMap.end(); ++i) {
- setAttribute(i->first, i->second);
- }
-}
-
bool
HLAObjectInstance::getDataElementIndex(HLADataElementIndex& index, const std::string& path) const
{