]> git.mxchange.org Git - simgear.git/blob - simgear/hla/HLAArrayDataType.cxx
8f6435b602f821f7eecc6e9c56fbbcbaff16eb24
[simgear.git] / simgear / hla / HLAArrayDataType.cxx
1 // Copyright (C) 2009 - 2012  Mathias Froehlich - Mathias.Froehlich@web.de
2 //
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.
7 //
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.
12 //
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.
16 //
17
18 #include "HLAArrayDataType.hxx"
19
20 #include "HLAArrayDataElement.hxx"
21
22 namespace simgear {
23
24 HLAArrayDataType::HLAArrayDataType(const std::string& name) :
25     HLADataType(name),
26     _isOpaque(false),
27     _isString(false)
28 {
29 }
30
31 HLAArrayDataType::~HLAArrayDataType()
32 {
33 }
34
35 void
36 HLAArrayDataType::accept(HLADataTypeVisitor& visitor) const
37 {
38     visitor.apply(*this);
39 }
40
41 const HLAArrayDataType*
42 HLAArrayDataType::toArrayDataType() const
43 {
44     return this;
45 }
46
47 void
48 HLAArrayDataType::releaseDataTypeReferences()
49 {
50     _elementDataType = 0;
51     HLADataType::releaseDataTypeReferences();
52 }
53
54 void
55 HLAArrayDataType::setElementDataType(const HLADataType* elementDataType)
56 {
57     _elementDataType = elementDataType;
58 }
59
60 void
61 HLAArrayDataType::setIsOpaque(bool isOpaque)
62 {
63     _isOpaque = isOpaque;
64 }
65
66 void
67 HLAArrayDataType::setIsString(bool isString)
68 {
69     _isString = isString;
70 }
71
72 void
73 HLAArrayDataType::_recomputeAlignmentImplementation()
74 {
75     unsigned alignment = 1;
76     if (const HLADataType* dataType = getElementDataType())
77         alignment = std::max(alignment, dataType->getAlignment());
78     setAlignment(alignment);
79 }
80
81 ///////////////////////////////////////////////////////////////////////////////////
82
83 HLAFixedArrayDataType::HLAFixedArrayDataType(const std::string& name) :
84     HLAArrayDataType(name)
85 {
86 }
87
88 HLAFixedArrayDataType::~HLAFixedArrayDataType()
89 {
90 }
91
92 void
93 HLAFixedArrayDataType::accept(HLADataTypeVisitor& visitor) const
94 {
95     visitor.apply(*this);
96 }
97
98 bool
99 HLAFixedArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
100 {
101     stream.alignOffsetForSize(getAlignment());
102     unsigned numElements = getNumElements();
103     if (!value.setNumElements(numElements))
104         return false;
105     for (unsigned i = 0; i < numElements; ++i)
106         if (!value.decodeElement(stream, i))
107             return false;
108     return true;
109 }
110
111 bool
112 HLAFixedArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
113 {
114     stream.alignOffsetForSize(getAlignment());
115     unsigned numElementsType = getNumElements();
116     unsigned numElementsValue = value.getNumElements();
117     unsigned numElements = SGMisc<unsigned>::min(numElementsType, numElementsValue);
118     unsigned i = 0;
119     for (; i < numElements; ++i)
120         if (!value.encodeElement(stream, i))
121             return false;
122     for (; i < numElementsType; ++i) {
123         HLADataTypeEncodeVisitor visitor(stream);
124         getElementDataType()->accept(visitor);
125     }
126     return true;
127 }
128
129 /////////////////////////////////////////////////////////////////////////////////
130
131 HLAVariableArrayDataType::HLAVariableArrayDataType(const std::string& name) :
132     HLAArrayDataType(name)
133 {
134     setSizeDataType(new HLAUInt32BEDataType);
135 }
136
137 HLAVariableArrayDataType::~HLAVariableArrayDataType()
138 {
139 }
140
141 void
142 HLAVariableArrayDataType::accept(HLADataTypeVisitor& visitor) const
143 {
144     visitor.apply(*this);
145 }
146
147 bool
148 HLAVariableArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
149 {
150     stream.alignOffsetForSize(getAlignment());
151     HLATemplateDecodeVisitor<unsigned> numElementsVisitor(stream);
152     getSizeDataType()->accept(numElementsVisitor);
153     unsigned numElements = numElementsVisitor.getValue();
154     if (!value.setNumElements(numElements))
155         return false;
156     for (unsigned i = 0; i < numElements; ++i)
157         if (!value.decodeElement(stream, i))
158             return false;
159     return true;
160 }
161
162 bool
163 HLAVariableArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
164 {
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))
171             return false;
172     return true;
173 }
174
175 void
176 HLAVariableArrayDataType::setSizeDataType(const HLABasicDataType* sizeDataType)
177 {
178     _sizeDataType = sizeDataType;
179 }
180
181 void
182 HLAVariableArrayDataType::_recomputeAlignmentImplementation()
183 {
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);
190 }
191
192 } // namespace simgear