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 "HLAArrayDataType.hxx"
20 #include "HLAArrayDataElement.hxx"
24 HLAArrayDataType::HLAArrayDataType(const std::string& name) :
31 HLAArrayDataType::~HLAArrayDataType()
36 HLAArrayDataType::accept(HLADataTypeVisitor& visitor) const
41 const HLAArrayDataType*
42 HLAArrayDataType::toArrayDataType() const
48 HLAArrayDataType::releaseDataTypeReferences()
51 HLADataType::releaseDataTypeReferences();
55 HLAArrayDataType::setElementDataType(const HLADataType* elementDataType)
57 _elementDataType = elementDataType;
61 HLAArrayDataType::setIsOpaque(bool isOpaque)
67 HLAArrayDataType::setIsString(bool isString)
73 HLAArrayDataType::_recomputeAlignmentImplementation()
75 unsigned alignment = 1;
76 if (const HLADataType* dataType = getElementDataType())
77 alignment = std::max(alignment, dataType->getAlignment());
78 setAlignment(alignment);
81 ///////////////////////////////////////////////////////////////////////////////////
83 HLAFixedArrayDataType::HLAFixedArrayDataType(const std::string& name) :
84 HLAArrayDataType(name)
88 HLAFixedArrayDataType::~HLAFixedArrayDataType()
93 HLAFixedArrayDataType::accept(HLADataTypeVisitor& visitor) const
99 HLAFixedArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
101 stream.alignOffsetForSize(getAlignment());
102 unsigned numElements = getNumElements();
103 if (!value.setNumElements(numElements))
105 for (unsigned i = 0; i < numElements; ++i)
106 if (!value.decodeElement(stream, i))
112 HLAFixedArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
114 stream.alignOffsetForSize(getAlignment());
115 unsigned numElementsType = getNumElements();
116 unsigned numElementsValue = value.getNumElements();
117 unsigned numElements = SGMisc<unsigned>::min(numElementsType, numElementsValue);
119 for (; i < numElements; ++i)
120 if (!value.encodeElement(stream, i))
122 for (; i < numElementsType; ++i) {
123 HLADataTypeEncodeVisitor visitor(stream);
124 getElementDataType()->accept(visitor);
129 /////////////////////////////////////////////////////////////////////////////////
131 HLAVariableArrayDataType::HLAVariableArrayDataType(const std::string& name) :
132 HLAArrayDataType(name)
134 setSizeDataType(new HLAUInt32BEDataType);
137 HLAVariableArrayDataType::~HLAVariableArrayDataType()
142 HLAVariableArrayDataType::accept(HLADataTypeVisitor& visitor) const
144 visitor.apply(*this);
148 HLAVariableArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
150 stream.alignOffsetForSize(getAlignment());
151 HLATemplateDecodeVisitor<unsigned> numElementsVisitor(stream);
152 getSizeDataType()->accept(numElementsVisitor);
153 unsigned numElements = numElementsVisitor.getValue();
154 if (!value.setNumElements(numElements))
156 for (unsigned i = 0; i < numElements; ++i)
157 if (!value.decodeElement(stream, i))
163 HLAVariableArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
165 stream.alignOffsetForSize(getAlignment());
166 unsigned numElements = value.getNumElements();
167 HLATemplateEncodeVisitor<unsigned> numElementsVisitor(stream, numElements);
168 getSizeDataType()->accept(numElementsVisitor);
169 for (unsigned i = 0; i < numElements; ++i)
170 if (!value.encodeElement(stream, i))
176 HLAVariableArrayDataType::setSizeDataType(const HLABasicDataType* sizeDataType)
178 _sizeDataType = sizeDataType;
182 HLAVariableArrayDataType::_recomputeAlignmentImplementation()
184 unsigned alignment = 1;
185 if (const HLADataType* dataType = getElementDataType())
186 alignment = std::max(alignment, dataType->getAlignment());
187 if (const HLADataType* dataType = getSizeDataType())
188 alignment = std::max(alignment, dataType->getAlignment());
189 setAlignment(alignment);
192 } // namespace simgear