// 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 "HLAVariantRecordDataElement.hxx"
#include <simgear/debug/logstream.hxx>
#include "HLADataElementVisitor.hxx"
+#include "HLADataTypeVisitor.hxx"
namespace simgear {
HLAVariantRecordDataElement::~HLAVariantRecordDataElement()
{
+ clearStamp();
+}
+
+bool
+HLAVariantRecordDataElement::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 (!setAlternativeIndex(index))
+ return false;
+ if (!_dataElement.valid() && getAlternativeDataType()) {
+ HLADataElementFactoryVisitor visitor;
+ getAlternativeDataType()->accept(visitor);
+ _dataElement = visitor.getDataElement();
+ }
+ if (!_dataElement.valid())
+ return false;
+ return _dataElement->setDataElement(begin, end, dataElement);
+ } else {
+ if (!setAlternativeIndex(index))
+ return false;
+ if (!dataElement->setDataType(getAlternativeDataType()))
+ return false;
+ _dataElement = dataElement;
+ return true;
+ }
+}
+
+HLADataElement*
+HLAVariantRecordDataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end)
+{
+ if (begin == end)
+ return this;
+ if (getAlternativeIndex() != *begin)
+ return 0;
+ if (!_dataElement.valid())
+ return 0;
+ return _dataElement->getDataElement(++begin, end);
+}
+
+const HLADataElement*
+HLAVariantRecordDataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end) const
+{
+ if (begin == end)
+ return this;
+ if (getAlternativeIndex() != *begin)
+ return 0;
+ if (!_dataElement.valid())
+ return 0;
+ return _dataElement->getDataElement(++begin, end);
}
bool
return false;
_dataElement.swap(dataElement);
_alternativeIndex = index;
+ setDirty(true);
return true;
}
return _dataElementFactory;
}
+void
+HLAVariantRecordDataElement::_setStamp(Stamp* stamp)
+{
+ HLAAbstractVariantRecordDataElement::_setStamp(stamp);
+ if (!_dataElement.valid())
+ return;
+ _dataElement->attachStamp(*this);
+}
+
HLADataElement*
HLAVariantRecordDataElement::newElement(unsigned index)
{
if (!_dataElementFactory.valid())
return 0;
- return _dataElementFactory->createElement(*this, index);
+ HLADataElement* dataElement = _dataElementFactory->createElement(*this, index);
+ if (!dataElement)
+ return 0;
+ dataElement->attachStamp(*this);
+ return dataElement;
}
}