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 #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()
105 HLAArrayDataElement::setNumElements(unsigned size)
107 unsigned oldSize = _elementVector.size();
110 _elementVector.resize(size);
111 for (unsigned i = oldSize; i < size; ++i)
112 _elementVector[i] = newElement(i);
117 HLAArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
119 HLADataElement* dataElement = getElement(i);
122 return dataElement->decode(stream);
126 HLAArrayDataElement::getNumElements() const
128 return _elementVector.size();
132 HLAArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
134 const HLADataElement* dataElement = getElement(i);
137 return dataElement->encode(stream);
140 const HLADataElement*
141 HLAArrayDataElement::getElement(unsigned index) const
143 if (_elementVector.size() <= index)
145 return _elementVector[index].get();
149 HLAArrayDataElement::getElement(unsigned index)
151 if (_elementVector.size() <= index)
153 return _elementVector[index].get();
157 HLAArrayDataElement::getOrCreateElement(unsigned index)
159 if (_elementVector.size() <= index)
160 if (!setNumElements(index + 1))
162 return _elementVector[index].get();
166 HLAArrayDataElement::setElement(unsigned index, HLADataElement* value)
168 unsigned oldSize = _elementVector.size();
169 if (oldSize <= index) {
170 _elementVector.resize(index + 1);
171 for (unsigned j = oldSize; j < index; ++j)
172 _elementVector[j] = newElement(j);
174 _elementVector[index] = value;
178 HLAArrayDataElement::setDataElementFactory(HLAArrayDataElement::DataElementFactory* dataElementFactory)
180 _dataElementFactory = dataElementFactory;
183 HLAArrayDataElement::DataElementFactory*
184 HLAArrayDataElement::getDataElementFactory()
186 return _dataElementFactory.get();
190 HLAArrayDataElement::newElement(unsigned index)
192 if (!_dataElementFactory.valid())
194 return _dataElementFactory->createElement(*this, index);
197 ////////////////////////////////////////////////////////////////////////
199 HLAVariantArrayDataElement::HLAVariantArrayDataElement() :
200 HLAAbstractArrayDataElement(0)
204 HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
209 HLAVariantArrayDataElement::setDataType(const HLADataType* dataType)
211 const HLAArrayDataType* arrayDataType = dataType->toArrayDataType();
212 if (!arrayDataType) {
213 SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type, dataType is not an array data type!");
216 const HLAVariantDataType* variantDataType = arrayDataType->getElementDataType()->toVariantDataType();
217 if (!variantDataType) {
218 SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type: arrayDataTypes element data type is no a variant data type!");
221 _dataType = arrayDataType;
226 HLAVariantArrayDataElement::setNumElements(unsigned size)
228 unsigned oldSize = _elementVector.size();
231 _elementVector.resize(size);
232 for (unsigned i = oldSize; i < size; ++i)
233 _elementVector[i] = newElement();
238 HLAVariantArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
240 HLAVariantDataElement* dataElement = getElement(i);
243 return dataElement->decode(stream);
247 HLAVariantArrayDataElement::getNumElements() const
249 return _elementVector.size();
253 HLAVariantArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
255 const HLADataElement* dataElement = getElement(i);
258 return dataElement->encode(stream);
261 const HLAVariantDataElement*
262 HLAVariantArrayDataElement::getElement(unsigned index) const
264 if (_elementVector.size() <= index)
266 return _elementVector[index].get();
269 HLAVariantDataElement*
270 HLAVariantArrayDataElement::getElement(unsigned index)
272 if (_elementVector.size() <= index)
274 return _elementVector[index].get();
277 HLAVariantDataElement*
278 HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
280 if (_elementVector.size() <= index)
281 if (!setNumElements(index + 1))
283 return _elementVector[index].get();
287 HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantDataElement* value)
289 unsigned oldSize = _elementVector.size();
290 if (oldSize <= index) {
291 _elementVector.resize(index + 1);
292 for (unsigned j = oldSize; j < index; ++j)
293 _elementVector[j] = newElement();
295 _elementVector[index] = value;
299 HLAVariantArrayDataElement::setAlternativeDataElementFactory(HLAVariantArrayDataElement::AlternativeDataElementFactory* alternativeDataElementFactory)
301 _alternativeDataElementFactory = alternativeDataElementFactory;
304 HLAVariantArrayDataElement::AlternativeDataElementFactory*
305 HLAVariantArrayDataElement::getAlternativeDataElementFactory()
307 return _alternativeDataElementFactory.get();
310 HLAVariantDataElement*
311 HLAVariantArrayDataElement::newElement()
313 const HLAArrayDataType* arrayDataType = getDataType();
316 const HLADataType* elementDataType = arrayDataType->getElementDataType();
317 if (!elementDataType)
319 const HLAVariantDataType* variantDataType = elementDataType->toVariantDataType();
320 if (!variantDataType)
322 HLAVariantDataElement* variantDataElement = new HLAVariantDataElement(variantDataType);
323 variantDataElement->setDataElementFactory(_alternativeDataElementFactory.get());
324 return variantDataElement;