]> git.mxchange.org Git - simgear.git/blob - simgear/hla/HLAArrayDataType.cxx
hla: for rti13 queue all callbacks.
[simgear.git] / simgear / hla / HLAArrayDataType.cxx
1 // Copyright (C) 2009 - 2011  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::setElementDataType(const HLADataType* elementDataType)
49 {
50     // FIXME this only works if we do not reset the alignment to something smaller
51     if (getAlignment() < elementDataType->getAlignment())
52         setAlignment(elementDataType->getAlignment());
53     _elementDataType = elementDataType;
54 }
55
56 void
57 HLAArrayDataType::setIsOpaque(bool isOpaque)
58 {
59     _isOpaque = isOpaque;
60 }
61
62 void
63 HLAArrayDataType::setIsString(bool isString)
64 {
65     _isString = isString;
66 }
67
68 ///////////////////////////////////////////////////////////////////////////////////
69
70 HLAFixedArrayDataType::HLAFixedArrayDataType(const std::string& name) :
71     HLAArrayDataType(name)
72 {
73 }
74
75 HLAFixedArrayDataType::~HLAFixedArrayDataType()
76 {
77 }
78
79 void
80 HLAFixedArrayDataType::accept(HLADataTypeVisitor& visitor) const
81 {
82     visitor.apply(*this);
83 }
84
85 bool
86 HLAFixedArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
87 {
88     stream.alignOffsetForSize(getAlignment());
89     unsigned numElements = getNumElements();
90     if (!value.setNumElements(numElements))
91         return false;
92     for (unsigned i = 0; i < numElements; ++i)
93         if (!value.decodeElement(stream, i))
94             return false;
95     return true;
96 }
97
98 bool
99 HLAFixedArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
100 {
101     stream.alignOffsetForSize(getAlignment());
102     unsigned numElementsType = getNumElements();
103     unsigned numElementsValue = value.getNumElements();
104     unsigned numElements = SGMisc<unsigned>::min(numElementsType, numElementsValue);
105     unsigned i = 0;
106     for (; i < numElements; ++i)
107         if (!value.encodeElement(stream, i))
108             return false;
109     for (; i < numElementsType; ++i) {
110         HLADataTypeEncodeVisitor visitor(stream);
111         getElementDataType()->accept(visitor);
112     }
113     return true;
114 }
115
116 /////////////////////////////////////////////////////////////////////////////////
117
118 HLAVariableArrayDataType::HLAVariableArrayDataType(const std::string& name) :
119     HLAArrayDataType(name)
120 {
121     setSizeDataType(new HLAUInt32BEDataType);
122 }
123
124 HLAVariableArrayDataType::~HLAVariableArrayDataType()
125 {
126 }
127
128 void
129 HLAVariableArrayDataType::accept(HLADataTypeVisitor& visitor) const
130 {
131     visitor.apply(*this);
132 }
133
134 bool
135 HLAVariableArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
136 {
137     stream.alignOffsetForSize(getAlignment());
138     HLATemplateDecodeVisitor<unsigned> numElementsVisitor(stream);
139     getSizeDataType()->accept(numElementsVisitor);
140     unsigned numElements = numElementsVisitor.getValue();
141     if (!value.setNumElements(numElements))
142         return false;
143     for (unsigned i = 0; i < numElements; ++i)
144         if (!value.decodeElement(stream, i))
145             return false;
146     return true;
147 }
148
149 bool
150 HLAVariableArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
151 {
152     stream.alignOffsetForSize(getAlignment());
153     unsigned numElements = value.getNumElements();
154     HLATemplateEncodeVisitor<unsigned> numElementsVisitor(stream, numElements);
155     getSizeDataType()->accept(numElementsVisitor);
156     for (unsigned i = 0; i < numElements; ++i)
157         if (!value.encodeElement(stream, i))
158             return false;
159     return true;
160 }
161
162 void
163 HLAVariableArrayDataType::setSizeDataType(const HLADataType* sizeDataType)
164 {
165     // FIXME this only works if we do not reset the alignment to something smaller
166     if (getAlignment() < sizeDataType->getAlignment())
167         setAlignment(sizeDataType->getAlignment());
168     _sizeDataType = sizeDataType;
169     // setAlignment(SGMisc<unsigned>::max(_sizeDataType->getAlignment(), _elementDataType->getAlignment());
170 }
171
172 } // namespace simgear