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