1 // Copyright (C) 2009 - 2012 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.
19 # include <simgear_config.h>
22 #include <simgear/compiler.h>
24 #include "HLAArrayDataElement.hxx"
26 #include <simgear/debug/logstream.hxx>
28 #include "HLADataElementVisitor.hxx"
32 HLAAbstractArrayDataElement::HLAAbstractArrayDataElement(const HLAArrayDataType* dataType) :
37 HLAAbstractArrayDataElement::~HLAAbstractArrayDataElement()
42 HLAAbstractArrayDataElement::accept(HLADataElementVisitor& visitor)
48 HLAAbstractArrayDataElement::accept(HLAConstDataElementVisitor& visitor) const
54 HLAAbstractArrayDataElement::decode(HLADecodeStream& stream)
56 if (!_dataType.valid())
58 return _dataType->decode(stream, *this);
62 HLAAbstractArrayDataElement::encode(HLAEncodeStream& stream) const
64 if (!_dataType.valid())
66 return _dataType->encode(stream, *this);
69 const HLAArrayDataType*
70 HLAAbstractArrayDataElement::getDataType() const
72 return _dataType.get();
76 HLAAbstractArrayDataElement::setDataType(const HLADataType* dataType)
78 const HLAArrayDataType* arrayDataType = dynamic_cast<const HLAArrayDataType*>(dataType);
80 SG_LOG(SG_NETWORK, SG_WARN, "HLAArrayDataType: unable to set data type!");
83 _dataType = arrayDataType;
88 HLAAbstractArrayDataElement::getElementDataType() const
90 if (!_dataType.valid())
92 return _dataType->getElementDataType();
95 ////////////////////////////////////////////////////////////////////////
97 HLAArrayDataElement::DataElementFactory::~DataElementFactory()
101 HLAArrayDataElement::HLAArrayDataElement(const HLAArrayDataType* dataType) :
102 HLAAbstractArrayDataElement(dataType)
106 HLAArrayDataElement::~HLAArrayDataElement()
112 HLAArrayDataElement::setNumElements(unsigned size)
114 unsigned oldSize = _elementVector.size();
117 _elementVector.resize(size);
118 for (unsigned i = oldSize; i < size; ++i)
119 _elementVector[i] = newElement(i);
125 HLAArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
127 HLADataElement* dataElement = getElement(i);
130 return dataElement->decode(stream);
134 HLAArrayDataElement::getNumElements() const
136 return _elementVector.size();
140 HLAArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
142 const HLADataElement* dataElement = getElement(i);
145 return dataElement->encode(stream);
148 const HLADataElement*
149 HLAArrayDataElement::getElement(unsigned index) const
151 if (_elementVector.size() <= index)
153 return _elementVector[index].get();
157 HLAArrayDataElement::getElement(unsigned index)
159 if (_elementVector.size() <= index)
161 return _elementVector[index].get();
165 HLAArrayDataElement::getOrCreateElement(unsigned index)
167 if (_elementVector.size() <= index)
168 if (!setNumElements(index + 1))
170 return _elementVector[index].get();
174 HLAArrayDataElement::setElement(unsigned index, HLADataElement* value)
176 unsigned oldSize = _elementVector.size();
177 if (oldSize <= index) {
178 _elementVector.resize(index + 1);
179 for (unsigned j = oldSize; j < index; ++j)
180 _elementVector[j] = newElement(j);
182 if (_elementVector[index].valid())
183 _elementVector[index]->clearStamp();
184 _elementVector[index] = value;
186 value->attachStamp(*this);
191 HLAArrayDataElement::setDataElementFactory(HLAArrayDataElement::DataElementFactory* dataElementFactory)
193 _dataElementFactory = dataElementFactory;
196 HLAArrayDataElement::DataElementFactory*
197 HLAArrayDataElement::getDataElementFactory()
199 return _dataElementFactory.get();
203 HLAArrayDataElement::_setStamp(Stamp* stamp)
205 HLAAbstractArrayDataElement::_setStamp(stamp);
206 for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) {
209 (*i)->attachStamp(*this);
214 HLAArrayDataElement::newElement(unsigned index)
216 if (!_dataElementFactory.valid())
218 HLADataElement* dataElement = _dataElementFactory->createElement(*this, index);
221 dataElement->attachStamp(*this);
225 ////////////////////////////////////////////////////////////////////////
227 HLAVariantArrayDataElement::HLAVariantArrayDataElement() :
228 HLAAbstractArrayDataElement(0)
232 HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
238 HLAVariantArrayDataElement::setDataType(const HLADataType* dataType)
240 const HLAArrayDataType* arrayDataType = dataType->toArrayDataType();
241 if (!arrayDataType) {
242 SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type, dataType is not an array data type!");
245 const HLAVariantRecordDataType* variantRecordDataType = arrayDataType->getElementDataType()->toVariantRecordDataType();
246 if (!variantRecordDataType) {
247 SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type: arrayDataTypes element data type is no a variant data type!");
250 _dataType = arrayDataType;
255 HLAVariantArrayDataElement::setNumElements(unsigned size)
257 unsigned oldSize = _elementVector.size();
260 _elementVector.resize(size);
261 for (unsigned i = oldSize; i < size; ++i)
262 _elementVector[i] = newElement();
268 HLAVariantArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
270 HLAVariantRecordDataElement* dataElement = getElement(i);
273 return dataElement->decode(stream);
277 HLAVariantArrayDataElement::getNumElements() const
279 return _elementVector.size();
283 HLAVariantArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
285 const HLADataElement* dataElement = getElement(i);
288 return dataElement->encode(stream);
291 const HLAVariantRecordDataElement*
292 HLAVariantArrayDataElement::getElement(unsigned index) const
294 if (_elementVector.size() <= index)
296 return _elementVector[index].get();
299 HLAVariantRecordDataElement*
300 HLAVariantArrayDataElement::getElement(unsigned index)
302 if (_elementVector.size() <= index)
304 return _elementVector[index].get();
307 HLAVariantRecordDataElement*
308 HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
310 if (_elementVector.size() <= index)
311 if (!setNumElements(index + 1))
313 return _elementVector[index].get();
317 HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantRecordDataElement* value)
319 unsigned oldSize = _elementVector.size();
320 if (oldSize <= index) {
321 _elementVector.resize(index + 1);
322 for (unsigned j = oldSize; j < index; ++j)
323 _elementVector[j] = newElement();
325 if (_elementVector[index].valid())
326 _elementVector[index]->clearStamp();
327 _elementVector[index] = value;
329 value->attachStamp(*this);
334 HLAVariantArrayDataElement::setAlternativeDataElementFactory(HLAVariantArrayDataElement::AlternativeDataElementFactory* alternativeDataElementFactory)
336 _alternativeDataElementFactory = alternativeDataElementFactory;
339 HLAVariantArrayDataElement::AlternativeDataElementFactory*
340 HLAVariantArrayDataElement::getAlternativeDataElementFactory()
342 return _alternativeDataElementFactory.get();
346 HLAVariantArrayDataElement::_setStamp(Stamp* stamp)
348 HLAAbstractArrayDataElement::_setStamp(stamp);
349 for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) {
352 (*i)->attachStamp(*this);
356 HLAVariantRecordDataElement*
357 HLAVariantArrayDataElement::newElement()
359 const HLAArrayDataType* arrayDataType = getDataType();
362 const HLADataType* elementDataType = arrayDataType->getElementDataType();
363 if (!elementDataType)
365 const HLAVariantRecordDataType* variantRecordDataType = elementDataType->toVariantRecordDataType();
366 if (!variantRecordDataType)
368 HLAVariantRecordDataElement* variantRecordDataElement = new HLAVariantRecordDataElement(variantRecordDataType);
369 variantRecordDataElement->setDataElementFactory(_alternativeDataElementFactory.get());
370 variantRecordDataElement->attachStamp(*this);
371 return variantRecordDataElement;