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.
18 #include "HLAArrayDataElement.hxx"
20 #include <simgear/debug/logstream.hxx>
22 #include "HLADataElementVisitor.hxx"
26 HLAAbstractArrayDataElement::HLAAbstractArrayDataElement(const HLAArrayDataType* dataType) :
31 HLAAbstractArrayDataElement::~HLAAbstractArrayDataElement()
36 HLAAbstractArrayDataElement::accept(HLADataElementVisitor& visitor)
42 HLAAbstractArrayDataElement::accept(HLAConstDataElementVisitor& visitor) const
48 HLAAbstractArrayDataElement::decode(HLADecodeStream& stream)
50 if (!_dataType.valid())
52 return _dataType->decode(stream, *this);
56 HLAAbstractArrayDataElement::encode(HLAEncodeStream& stream) const
58 if (!_dataType.valid())
60 return _dataType->encode(stream, *this);
63 const HLAArrayDataType*
64 HLAAbstractArrayDataElement::getDataType() const
66 return _dataType.get();
70 HLAAbstractArrayDataElement::setDataType(const HLADataType* dataType)
72 const HLAArrayDataType* arrayDataType = dynamic_cast<const HLAArrayDataType*>(dataType);
74 SG_LOG(SG_NETWORK, SG_WARN, "HLAArrayDataType: unable to set data type!");
77 _dataType = arrayDataType;
82 HLAAbstractArrayDataElement::getElementDataType() const
84 if (!_dataType.valid())
86 return _dataType->getElementDataType();
89 ////////////////////////////////////////////////////////////////////////
91 HLAArrayDataElement::DataElementFactory::~DataElementFactory()
95 HLAArrayDataElement::HLAArrayDataElement(const HLAArrayDataType* dataType) :
96 HLAAbstractArrayDataElement(dataType)
100 HLAArrayDataElement::~HLAArrayDataElement()
106 HLAArrayDataElement::setNumElements(unsigned size)
108 unsigned oldSize = _elementVector.size();
111 _elementVector.resize(size);
112 for (unsigned i = oldSize; i < size; ++i)
113 _elementVector[i] = newElement(i);
118 HLAArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
120 HLADataElement* dataElement = getElement(i);
123 return dataElement->decode(stream);
127 HLAArrayDataElement::getNumElements() const
129 return _elementVector.size();
133 HLAArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
135 const HLADataElement* dataElement = getElement(i);
138 return dataElement->encode(stream);
141 const HLADataElement*
142 HLAArrayDataElement::getElement(unsigned index) const
144 if (_elementVector.size() <= index)
146 return _elementVector[index].get();
150 HLAArrayDataElement::getElement(unsigned index)
152 if (_elementVector.size() <= index)
154 return _elementVector[index].get();
158 HLAArrayDataElement::getOrCreateElement(unsigned index)
160 if (_elementVector.size() <= index)
161 if (!setNumElements(index + 1))
163 return _elementVector[index].get();
167 HLAArrayDataElement::setElement(unsigned index, HLADataElement* value)
169 unsigned oldSize = _elementVector.size();
170 if (oldSize <= index) {
171 _elementVector.resize(index + 1);
172 for (unsigned j = oldSize; j < index; ++j)
173 _elementVector[j] = newElement(j);
175 if (_elementVector[index].valid())
176 _elementVector[index]->clearStamp();
177 _elementVector[index] = value;
179 value->attachStamp(*this);
183 HLAArrayDataElement::setDataElementFactory(HLAArrayDataElement::DataElementFactory* dataElementFactory)
185 _dataElementFactory = dataElementFactory;
188 HLAArrayDataElement::DataElementFactory*
189 HLAArrayDataElement::getDataElementFactory()
191 return _dataElementFactory.get();
195 HLAArrayDataElement::_setStamp(Stamp* stamp)
197 HLAAbstractArrayDataElement::_setStamp(stamp);
198 for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) {
201 (*i)->attachStamp(*this);
206 HLAArrayDataElement::newElement(unsigned index)
208 if (!_dataElementFactory.valid())
210 HLADataElement* dataElement = _dataElementFactory->createElement(*this, index);
213 dataElement->attachStamp(*this);
217 ////////////////////////////////////////////////////////////////////////
219 HLAVariantArrayDataElement::HLAVariantArrayDataElement() :
220 HLAAbstractArrayDataElement(0)
224 HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
230 HLAVariantArrayDataElement::setDataType(const HLADataType* dataType)
232 const HLAArrayDataType* arrayDataType = dataType->toArrayDataType();
233 if (!arrayDataType) {
234 SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type, dataType is not an array data type!");
237 const HLAVariantRecordDataType* variantRecordDataType = arrayDataType->getElementDataType()->toVariantRecordDataType();
238 if (!variantRecordDataType) {
239 SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type: arrayDataTypes element data type is no a variant data type!");
242 _dataType = arrayDataType;
247 HLAVariantArrayDataElement::setNumElements(unsigned size)
249 unsigned oldSize = _elementVector.size();
252 _elementVector.resize(size);
253 for (unsigned i = oldSize; i < size; ++i)
254 _elementVector[i] = newElement();
259 HLAVariantArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
261 HLAVariantRecordDataElement* dataElement = getElement(i);
264 return dataElement->decode(stream);
268 HLAVariantArrayDataElement::getNumElements() const
270 return _elementVector.size();
274 HLAVariantArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
276 const HLADataElement* dataElement = getElement(i);
279 return dataElement->encode(stream);
282 const HLAVariantRecordDataElement*
283 HLAVariantArrayDataElement::getElement(unsigned index) const
285 if (_elementVector.size() <= index)
287 return _elementVector[index].get();
290 HLAVariantRecordDataElement*
291 HLAVariantArrayDataElement::getElement(unsigned index)
293 if (_elementVector.size() <= index)
295 return _elementVector[index].get();
298 HLAVariantRecordDataElement*
299 HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
301 if (_elementVector.size() <= index)
302 if (!setNumElements(index + 1))
304 return _elementVector[index].get();
308 HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantRecordDataElement* value)
310 unsigned oldSize = _elementVector.size();
311 if (oldSize <= index) {
312 _elementVector.resize(index + 1);
313 for (unsigned j = oldSize; j < index; ++j)
314 _elementVector[j] = newElement();
316 if (_elementVector[index].valid())
317 _elementVector[index]->clearStamp();
318 _elementVector[index] = value;
320 value->attachStamp(*this);
324 HLAVariantArrayDataElement::setAlternativeDataElementFactory(HLAVariantArrayDataElement::AlternativeDataElementFactory* alternativeDataElementFactory)
326 _alternativeDataElementFactory = alternativeDataElementFactory;
329 HLAVariantArrayDataElement::AlternativeDataElementFactory*
330 HLAVariantArrayDataElement::getAlternativeDataElementFactory()
332 return _alternativeDataElementFactory.get();
336 HLAVariantArrayDataElement::_setStamp(Stamp* stamp)
338 HLAAbstractArrayDataElement::_setStamp(stamp);
339 for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) {
342 (*i)->attachStamp(*this);
346 HLAVariantRecordDataElement*
347 HLAVariantArrayDataElement::newElement()
349 const HLAArrayDataType* arrayDataType = getDataType();
352 const HLADataType* elementDataType = arrayDataType->getElementDataType();
353 if (!elementDataType)
355 const HLAVariantRecordDataType* variantRecordDataType = elementDataType->toVariantRecordDataType();
356 if (!variantRecordDataType)
358 HLAVariantRecordDataElement* variantRecordDataElement = new HLAVariantRecordDataElement(variantRecordDataType);
359 variantRecordDataElement->setDataElementFactory(_alternativeDataElementFactory.get());
360 variantRecordDataElement->attachStamp(*this);
361 return variantRecordDataElement;