1 // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Library General Public
5 // License as published by the Free Software Foundation; either
6 // version 2 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Library General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 #ifndef HLADataTypeVisitor_hxx
19 #define HLADataTypeVisitor_hxx
23 #include <simgear/debug/logstream.hxx>
24 #include <simgear/math/SGMath.hxx>
25 #include "HLAArrayDataType.hxx"
26 #include "HLABasicDataType.hxx"
27 #include "HLADataElement.hxx"
28 #include "HLAEnumeratedDataType.hxx"
29 #include "HLAFixedRecordDataType.hxx"
30 #include "HLAVariantDataType.hxx"
34 class HLADataTypeVisitor {
36 virtual ~HLADataTypeVisitor() {}
38 virtual void apply(const HLADataType& dataType)
41 virtual void apply(const HLADataTypeReference& dataType)
43 SGSharedPtr<const HLADataType> dataTypeReference = dataType.getDataType();
44 if (!dataTypeReference.valid()) {
45 SG_LOG(SG_NETWORK, SG_WARN, "HLADataTypeReference weak reference vanished!");
48 dataTypeReference->accept(*this);
51 virtual void apply(const HLABasicDataType& dataType)
52 { apply(static_cast<const HLADataType&>(dataType)); }
53 virtual void apply(const HLAInt8DataType& dataType)
54 { apply(static_cast<const HLABasicDataType&>(dataType)); }
55 virtual void apply(const HLAUInt8DataType& dataType)
56 { apply(static_cast<const HLABasicDataType&>(dataType)); }
57 virtual void apply(const HLAInt16DataType& dataType)
58 { apply(static_cast<const HLABasicDataType&>(dataType)); }
59 virtual void apply(const HLAUInt16DataType& dataType)
60 { apply(static_cast<const HLABasicDataType&>(dataType)); }
61 virtual void apply(const HLAInt32DataType& dataType)
62 { apply(static_cast<const HLABasicDataType&>(dataType)); }
63 virtual void apply(const HLAUInt32DataType& dataType)
64 { apply(static_cast<const HLABasicDataType&>(dataType)); }
65 virtual void apply(const HLAInt64DataType& dataType)
66 { apply(static_cast<const HLABasicDataType&>(dataType)); }
67 virtual void apply(const HLAUInt64DataType& dataType)
68 { apply(static_cast<const HLABasicDataType&>(dataType)); }
69 virtual void apply(const HLAFloat32DataType& dataType)
70 { apply(static_cast<const HLABasicDataType&>(dataType)); }
71 virtual void apply(const HLAFloat64DataType& dataType)
72 { apply(static_cast<const HLABasicDataType&>(dataType)); }
74 virtual void apply(const HLAArrayDataType& dataType)
75 { apply(static_cast<const HLADataType&>(dataType)); }
76 virtual void apply(const HLAFixedArrayDataType& dataType)
77 { apply(static_cast<const HLAArrayDataType&>(dataType)); }
78 virtual void apply(const HLAVariableArrayDataType& dataType)
79 { apply(static_cast<const HLAArrayDataType&>(dataType)); }
81 virtual void apply(const HLAEnumeratedDataType& dataType)
82 { apply(static_cast<const HLADataType&>(dataType)); }
84 virtual void apply(const HLAFixedRecordDataType& dataType)
85 { apply(static_cast<const HLADataType&>(dataType)); }
87 virtual void apply(const HLAVariantDataType& dataType)
88 { apply(static_cast<const HLADataType&>(dataType)); }
91 /// Walks the datatype tree and checks if it is completely defined
92 class HLADataTypeCheckVisitor : public HLADataTypeVisitor {
94 HLADataTypeCheckVisitor() : _valid(true) {}
96 bool valid() const { return _valid; }
98 virtual void apply(const HLAInt8DataType& dataType) { }
99 virtual void apply(const HLAUInt8DataType& dataType) { }
100 virtual void apply(const HLAInt16DataType& dataType) { }
101 virtual void apply(const HLAUInt16DataType& dataType) { }
102 virtual void apply(const HLAInt32DataType& dataType) { }
103 virtual void apply(const HLAUInt32DataType& dataType) { }
104 virtual void apply(const HLAInt64DataType& dataType) { }
105 virtual void apply(const HLAUInt64DataType& dataType) { }
106 virtual void apply(const HLAFloat32DataType& dataType) { }
107 virtual void apply(const HLAFloat64DataType& dataType) { }
109 virtual void apply(const HLAFixedArrayDataType& dataType)
111 if (!dataType.getElementDataType())
114 dataType.getElementDataType()->accept(*this);
116 virtual void apply(const HLAVariableArrayDataType& dataType)
118 if (!dataType.getElementDataType())
121 dataType.getElementDataType()->accept(*this);
123 if (!dataType.getSizeDataType())
126 dataType.getSizeDataType()->accept(*this);
129 virtual void apply(const HLAEnumeratedDataType& dataType)
131 if (!dataType.getRepresentation())
134 dataType.getRepresentation()->accept(*this);
137 virtual void apply(const HLAFixedRecordDataType& dataType)
139 unsigned numFields = dataType.getNumFields();
140 for (unsigned i = 0; i < numFields; ++i) {
141 if (!dataType.getFieldDataType(i))
144 dataType.getFieldDataType(i)->accept(*this);
148 virtual void apply(const HLAVariantDataType& dataType)
155 class HLADataTypeDecodeVisitor : public HLADataTypeVisitor {
157 HLADataTypeDecodeVisitor(HLADecodeStream& stream) : _stream(stream) {}
158 virtual ~HLADataTypeDecodeVisitor() {}
160 virtual void apply(const HLAInt8DataType& dataType) { dataType.skip(_stream); }
161 virtual void apply(const HLAUInt8DataType& dataType) { dataType.skip(_stream); }
162 virtual void apply(const HLAInt16DataType& dataType) { dataType.skip(_stream); }
163 virtual void apply(const HLAUInt16DataType& dataType) { dataType.skip(_stream); }
164 virtual void apply(const HLAInt32DataType& dataType) { dataType.skip(_stream); }
165 virtual void apply(const HLAUInt32DataType& dataType) { dataType.skip(_stream); }
166 virtual void apply(const HLAInt64DataType& dataType) { dataType.skip(_stream); }
167 virtual void apply(const HLAUInt64DataType& dataType) { dataType.skip(_stream); }
168 virtual void apply(const HLAFloat32DataType& dataType) { dataType.skip(_stream); }
169 virtual void apply(const HLAFloat64DataType& dataType) { dataType.skip(_stream); }
171 virtual void apply(const HLAFixedArrayDataType& dataType)
173 unsigned numElements = dataType.getNumElements();
174 for (unsigned i = 0; i < numElements; ++i)
175 dataType.getElementDataType()->accept(*this);
177 virtual void apply(const HLAVariableArrayDataType& dataType);
179 virtual void apply(const HLAEnumeratedDataType& dataType)
181 dataType.getRepresentation()->accept(*this);
184 virtual void apply(const HLAFixedRecordDataType& dataType)
186 unsigned numFields = dataType.getNumFields();
187 for (unsigned i = 0; i < numFields; ++i)
188 dataType.getFieldDataType(i)->accept(*this);
191 virtual void apply(const HLAVariantDataType& dataType) { assert(0); }
194 HLADecodeStream& _stream;
197 class HLADataTypeEncodeVisitor : public HLADataTypeVisitor {
199 HLADataTypeEncodeVisitor(HLAEncodeStream& stream) : _stream(stream) {}
200 virtual ~HLADataTypeEncodeVisitor() {}
202 virtual void apply(const HLAInt8DataType& dataType) { dataType.skip(_stream); }
203 virtual void apply(const HLAUInt8DataType& dataType) { dataType.skip(_stream); }
204 virtual void apply(const HLAInt16DataType& dataType) { dataType.skip(_stream); }
205 virtual void apply(const HLAUInt16DataType& dataType) { dataType.skip(_stream); }
206 virtual void apply(const HLAInt32DataType& dataType) { dataType.skip(_stream); }
207 virtual void apply(const HLAUInt32DataType& dataType) { dataType.skip(_stream); }
208 virtual void apply(const HLAInt64DataType& dataType) { dataType.skip(_stream); }
209 virtual void apply(const HLAUInt64DataType& dataType) { dataType.skip(_stream); }
210 virtual void apply(const HLAFloat32DataType& dataType) { dataType.skip(_stream); }
211 virtual void apply(const HLAFloat64DataType& dataType) { dataType.skip(_stream); }
213 virtual void apply(const HLAFixedArrayDataType& dataType)
215 /// FIXME, might vanish in this sense ...
216 // dataType.encode(_stream, *this);
217 unsigned numElements = dataType.getNumElements();
218 for (unsigned i = 0; i < numElements; ++i)
219 dataType.getElementDataType()->accept(*this);
221 virtual void apply(const HLAVariableArrayDataType& dataType);
223 virtual void apply(const HLAEnumeratedDataType& dataType)
225 dataType.getRepresentation()->accept(*this);
228 virtual void apply(const HLAFixedRecordDataType& dataType)
230 unsigned numFields = dataType.getNumFields();
231 for (unsigned i = 0; i < numFields; ++i)
232 dataType.getFieldDataType(i)->accept(*this);
235 virtual void apply(const HLAVariantDataType& dataType) { assert(0); }
238 HLAEncodeStream& _stream;
241 /// Begin implementation of some get/set visitors
243 class HLAScalarDecodeVisitor : public HLADataTypeDecodeVisitor {
245 HLAScalarDecodeVisitor(HLADecodeStream& stream) :
246 HLADataTypeDecodeVisitor(stream)
249 virtual void apply(const HLAFixedArrayDataType& dataType)
251 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
252 HLADataTypeDecodeVisitor::apply(dataType);
254 virtual void apply(const HLAVariableArrayDataType& dataType)
256 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
257 HLADataTypeDecodeVisitor::apply(dataType);
260 virtual void apply(const HLAEnumeratedDataType& dataType)
262 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
263 HLADataTypeDecodeVisitor::apply(dataType);
266 virtual void apply(const HLAFixedRecordDataType& dataType)
268 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
269 HLADataTypeDecodeVisitor::apply(dataType);
272 virtual void apply(const HLAVariantDataType& dataType)
274 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
275 HLADataTypeDecodeVisitor::apply(dataType);
279 class HLAScalarEncodeVisitor : public HLADataTypeEncodeVisitor {
281 HLAScalarEncodeVisitor(HLAEncodeStream& stream) :
282 HLADataTypeEncodeVisitor(stream)
285 virtual void apply(const HLAFixedArrayDataType& dataType)
287 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
288 HLADataTypeEncodeVisitor::apply(dataType);
290 virtual void apply(const HLAVariableArrayDataType& dataType)
292 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
293 HLADataTypeEncodeVisitor::apply(dataType);
296 virtual void apply(const HLAEnumeratedDataType& dataType)
298 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
299 HLADataTypeEncodeVisitor::apply(dataType);
302 virtual void apply(const HLAFixedRecordDataType& dataType)
304 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
305 HLADataTypeEncodeVisitor::apply(dataType);
308 virtual void apply(const HLAVariantDataType& dataType)
310 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
311 HLADataTypeEncodeVisitor::apply(dataType);
315 class HLAFixedRecordDecodeVisitor : public HLADataTypeDecodeVisitor {
317 HLAFixedRecordDecodeVisitor(HLADecodeStream& stream) :
318 HLADataTypeDecodeVisitor(stream)
321 virtual void apply(const HLAInt8DataType& dataType)
323 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
324 HLADataTypeDecodeVisitor::apply(dataType);
326 virtual void apply(const HLAUInt8DataType& dataType)
328 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
329 HLADataTypeDecodeVisitor::apply(dataType);
331 virtual void apply(const HLAInt16DataType& dataType)
333 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
334 HLADataTypeDecodeVisitor::apply(dataType);
336 virtual void apply(const HLAUInt16DataType& dataType)
338 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
339 HLADataTypeDecodeVisitor::apply(dataType);
341 virtual void apply(const HLAInt32DataType& dataType)
343 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
344 HLADataTypeDecodeVisitor::apply(dataType);
346 virtual void apply(const HLAUInt32DataType& dataType)
348 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
349 HLADataTypeDecodeVisitor::apply(dataType);
351 virtual void apply(const HLAInt64DataType& dataType)
353 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
354 HLADataTypeDecodeVisitor::apply(dataType);
356 virtual void apply(const HLAUInt64DataType& dataType)
358 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
359 HLADataTypeDecodeVisitor::apply(dataType);
361 virtual void apply(const HLAFloat32DataType& dataType)
363 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
364 HLADataTypeDecodeVisitor::apply(dataType);
366 virtual void apply(const HLAFloat64DataType& dataType)
368 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
369 HLADataTypeDecodeVisitor::apply(dataType);
372 virtual void apply(const HLAFixedArrayDataType& dataType)
374 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
375 HLADataTypeDecodeVisitor::apply(dataType);
377 virtual void apply(const HLAVariableArrayDataType& dataType)
379 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
380 HLADataTypeDecodeVisitor::apply(dataType);
383 virtual void apply(const HLAEnumeratedDataType& dataType)
385 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
386 HLADataTypeDecodeVisitor::apply(dataType);
389 virtual void apply(const HLAVariantDataType& dataType)
391 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
392 HLADataTypeDecodeVisitor::apply(dataType);
396 class HLAFixedRecordEncodeVisitor : public HLADataTypeEncodeVisitor {
398 HLAFixedRecordEncodeVisitor(HLAEncodeStream& stream) :
399 HLADataTypeEncodeVisitor(stream)
402 virtual void apply(const HLAInt8DataType& dataType)
404 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
405 HLADataTypeEncodeVisitor::apply(dataType);
407 virtual void apply(const HLAUInt8DataType& dataType)
409 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
410 HLADataTypeEncodeVisitor::apply(dataType);
412 virtual void apply(const HLAInt16DataType& dataType)
414 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
415 HLADataTypeEncodeVisitor::apply(dataType);
417 virtual void apply(const HLAUInt16DataType& dataType)
419 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
420 HLADataTypeEncodeVisitor::apply(dataType);
422 virtual void apply(const HLAInt32DataType& dataType)
424 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
425 HLADataTypeEncodeVisitor::apply(dataType);
427 virtual void apply(const HLAUInt32DataType& dataType)
429 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
430 HLADataTypeEncodeVisitor::apply(dataType);
432 virtual void apply(const HLAInt64DataType& dataType)
434 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
435 HLADataTypeEncodeVisitor::apply(dataType);
437 virtual void apply(const HLAUInt64DataType& dataType)
439 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
440 HLADataTypeEncodeVisitor::apply(dataType);
442 virtual void apply(const HLAFloat32DataType& dataType)
444 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
445 HLADataTypeEncodeVisitor::apply(dataType);
447 virtual void apply(const HLAFloat64DataType& dataType)
449 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
450 HLADataTypeEncodeVisitor::apply(dataType);
453 virtual void apply(const HLAFixedArrayDataType& dataType)
455 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
456 HLADataTypeEncodeVisitor::apply(dataType);
458 virtual void apply(const HLAVariableArrayDataType& dataType)
460 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
461 HLADataTypeEncodeVisitor::apply(dataType);
464 virtual void apply(const HLAEnumeratedDataType& dataType)
466 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
467 HLADataTypeEncodeVisitor::apply(dataType);
470 virtual void apply(const HLAVariantDataType& dataType)
472 SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
473 HLADataTypeEncodeVisitor::apply(dataType);
478 class HLATemplateDecodeVisitor : public HLAScalarDecodeVisitor {
480 typedef T value_type;
482 HLATemplateDecodeVisitor(HLADecodeStream& stream, const value_type& value = value_type()) :
483 HLAScalarDecodeVisitor(stream),
487 void setValue(const value_type& value)
489 const value_type& getValue() const
492 virtual void apply(const HLAInt8DataType& dataType)
495 dataType.decode(_stream, value);
496 _value = value_type(value);
498 virtual void apply(const HLAUInt8DataType& dataType)
501 dataType.decode(_stream, value);
502 _value = value_type(value);
504 virtual void apply(const HLAInt16DataType& dataType)
507 dataType.decode(_stream, value);
508 _value = value_type(value);
510 virtual void apply(const HLAUInt16DataType& dataType)
513 dataType.decode(_stream, value);
514 _value = value_type(value);
516 virtual void apply(const HLAInt32DataType& dataType)
519 dataType.decode(_stream, value);
520 _value = value_type(value);
522 virtual void apply(const HLAUInt32DataType& dataType)
525 dataType.decode(_stream, value);
526 _value = value_type(value);
528 virtual void apply(const HLAInt64DataType& dataType)
531 dataType.decode(_stream, value);
532 _value = value_type(value);
534 virtual void apply(const HLAUInt64DataType& dataType)
537 dataType.decode(_stream, value);
538 _value = value_type(value);
540 virtual void apply(const HLAFloat32DataType& dataType)
543 dataType.decode(_stream, value);
544 _value = value_type(value);
546 virtual void apply(const HLAFloat64DataType& dataType)
549 dataType.decode(_stream, value);
550 _value = value_type(value);
558 class HLATemplateEncodeVisitor : public HLAScalarEncodeVisitor {
560 typedef T value_type;
562 HLATemplateEncodeVisitor(HLAEncodeStream& stream, const value_type& value = value_type()) :
563 HLAScalarEncodeVisitor(stream),
567 void setValue(const value_type& value)
569 const value_type& getValue() const
572 virtual void apply(const HLAInt8DataType& dataType)
574 dataType.encode(_stream, _value);
576 virtual void apply(const HLAUInt8DataType& dataType)
578 dataType.encode(_stream, _value);
580 virtual void apply(const HLAInt16DataType& dataType)
582 dataType.encode(_stream, _value);
584 virtual void apply(const HLAUInt16DataType& dataType)
586 dataType.encode(_stream, _value);
588 virtual void apply(const HLAInt32DataType& dataType)
590 dataType.encode(_stream, _value);
592 virtual void apply(const HLAUInt32DataType& dataType)
594 dataType.encode(_stream, _value);
596 virtual void apply(const HLAInt64DataType& dataType)
598 dataType.encode(_stream, _value);
600 virtual void apply(const HLAUInt64DataType& dataType)
602 dataType.encode(_stream, _value);
604 virtual void apply(const HLAFloat32DataType& dataType)
606 dataType.encode(_stream, _value);
608 virtual void apply(const HLAFloat64DataType& dataType)
610 dataType.encode(_stream, _value);
617 inline void HLADataTypeDecodeVisitor::apply(const HLAVariableArrayDataType& dataType)
619 HLATemplateDecodeVisitor<unsigned> numElementsVisitor(_stream);
620 dataType.getSizeDataType()->accept(numElementsVisitor);
621 unsigned numElements = numElementsVisitor.getValue();
622 for (unsigned i = 0; i < numElements; ++i)
623 dataType.getElementDataType()->accept(*this);
626 inline void HLADataTypeEncodeVisitor::apply(const HLAVariableArrayDataType& dataType)
628 HLATemplateEncodeVisitor<unsigned> numElementsVisitor(_stream, 0);
629 dataType.getSizeDataType()->accept(numElementsVisitor);
632 /// Generate standard data elements according to the traversed type
633 class HLADataElementFactoryVisitor : public HLADataTypeVisitor {
635 virtual ~HLADataElementFactoryVisitor();
637 virtual void apply(const HLADataType& dataType);
639 virtual void apply(const HLAInt8DataType& dataType);
640 virtual void apply(const HLAUInt8DataType& dataType);
641 virtual void apply(const HLAInt16DataType& dataType);
642 virtual void apply(const HLAUInt16DataType& dataType);
643 virtual void apply(const HLAInt32DataType& dataType);
644 virtual void apply(const HLAUInt32DataType& dataType);
645 virtual void apply(const HLAInt64DataType& dataType);
646 virtual void apply(const HLAUInt64DataType& dataType);
647 virtual void apply(const HLAFloat32DataType& dataType);
648 virtual void apply(const HLAFloat64DataType& dataType);
650 virtual void apply(const HLAFixedArrayDataType& dataType);
651 virtual void apply(const HLAVariableArrayDataType& dataType);
653 virtual void apply(const HLAEnumeratedDataType& dataType);
655 virtual void apply(const HLAFixedRecordDataType& dataType);
657 virtual void apply(const HLAVariantDataType& dataType);
659 HLADataElement* getDataElement()
660 { return _dataElement.release(); }
663 class ArrayDataElementFactory;
664 class VariantDataElementFactory;
666 SGSharedPtr<HLADataElement> _dataElement;
669 } // namespace simgear