]> git.mxchange.org Git - simgear.git/blob - simgear/hla/HLADataElement.cxx
hla: Use HLADataElementIndices for HLAInteractionClass.
[simgear.git] / simgear / hla / HLADataElement.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 #ifdef HAVE_CONFIG_H
19 #  include <simgear_config.h>
20 #endif
21
22 #include <simgear/compiler.h>
23
24 #include "HLADataElement.hxx"
25
26 #include <simgear/debug/logstream.hxx>
27
28 #include "HLADataElementVisitor.hxx"
29
30 namespace simgear {
31
32 HLADataElement::PathElement::Data::~Data()
33 {
34 }
35
36 const HLADataElement::PathElement::FieldData*
37 HLADataElement::PathElement::Data::toFieldData() const
38 {
39     return 0;
40 }
41
42 const HLADataElement::PathElement::IndexData*
43 HLADataElement::PathElement::Data::toIndexData() const
44 {
45     return 0;
46 }
47
48 HLADataElement::PathElement::FieldData::FieldData(const std::string& name) :
49     _name(name)
50 {
51 }
52
53 HLADataElement::PathElement::FieldData::~FieldData()
54 {
55 }
56
57 const HLADataElement::PathElement::FieldData*
58 HLADataElement::PathElement::FieldData::toFieldData() const
59 {
60     return this;
61 }
62
63 bool
64 HLADataElement::PathElement::FieldData::less(const Data* data) const
65 {
66     const FieldData* fieldData = data->toFieldData();
67     // IndexData is allways smaller than FieldData
68     if (!fieldData)
69         return false;
70     return _name < fieldData->_name;
71 }
72
73 bool
74 HLADataElement::PathElement::FieldData::equal(const Data* data) const
75 {
76     const FieldData* fieldData = data->toFieldData();
77     // IndexData is allways smaller than FieldData
78     if (!fieldData)
79         return false;
80     return _name == fieldData->_name;
81 }
82
83 void
84 HLADataElement::PathElement::FieldData::append(std::string& s) const
85 {
86     s.append(1, std::string::value_type('.'));
87     s.append(_name);
88 }
89
90 HLADataElement::PathElement::IndexData::IndexData(unsigned index) :
91     _index(index)
92 {
93 }
94
95 HLADataElement::PathElement::IndexData::~IndexData()
96 {
97 }
98
99 const HLADataElement::PathElement::IndexData*
100 HLADataElement::PathElement::IndexData::toIndexData() const
101 {
102     return this;
103 }
104
105 bool
106 HLADataElement::PathElement::IndexData::less(const Data* data) const
107 {
108     const IndexData* indexData = data->toIndexData();
109     // IndexData is allways smaller than FieldData
110     if (!indexData)
111         return true;
112     return _index < indexData->_index;
113 }
114
115 bool
116 HLADataElement::PathElement::IndexData::equal(const Data* data) const
117 {
118     const IndexData* indexData = data->toIndexData();
119     // IndexData is allways smaller than FieldData
120     if (!indexData)
121         return false;
122     return _index == indexData->_index;
123 }
124
125 void
126 HLADataElement::PathElement::IndexData::append(std::string& s) const
127 {
128     s.append(1, std::string::value_type('['));
129     unsigned value = _index;
130     do {
131         s.append(1, std::string::value_type('0' + value % 10));
132     } while (value /= 10);
133     s.append(1, std::string::value_type(']'));
134 }
135
136 HLADataElement::~HLADataElement()
137 {
138 }
139
140 bool
141 HLADataElement::setDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end, HLADataElement* dataElement)
142 {
143     return false;
144 }
145
146 HLADataElement*
147 HLADataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end)
148 {
149     if (begin != end)
150         return 0;
151     return this;
152 }
153
154 const HLADataElement*
155 HLADataElement::getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end) const
156 {
157     if (begin != end)
158         return 0;
159     return this;
160 }
161
162 void
163 HLADataElement::setTimeStamp(const SGTimeStamp& timeStamp)
164 {
165     if (!_stamp.valid())
166         return;
167     _stamp->setTimeStamp(timeStamp);
168 }
169
170 void
171 HLADataElement::setTimeStampValid(bool timeStampValid)
172 {
173     if (!_stamp.valid())
174         return;
175     _stamp->setTimeStampValid(timeStampValid);
176 }
177
178 double
179 HLADataElement::getTimeDifference(const SGTimeStamp& timeStamp) const
180 {
181     if (!_stamp.valid())
182         return 0;
183     if (!_stamp->getTimeStampValid())
184         return 0;
185     return (timeStamp - _stamp->getTimeStamp()).toSecs();
186 }
187
188 void
189 HLADataElement::createStamp()
190 {
191     _setStamp(new Stamp);
192     setDirty(true);
193 }
194
195 void
196 HLADataElement::attachStamp(HLADataElement& dataElement)
197 {
198     _setStamp(dataElement._getStamp());
199 }
200
201 void
202 HLADataElement::clearStamp()
203 {
204     _setStamp(0);
205 }
206
207 void
208 HLADataElement::accept(HLADataElementVisitor& visitor)
209 {
210     visitor.apply(*this);
211 }
212
213 void
214 HLADataElement::accept(HLAConstDataElementVisitor& visitor) const
215 {
216     visitor.apply(*this);
217 }
218
219 std::string
220 HLADataElement::toString(const Path& path)
221 {
222     std::string s;
223     for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
224         i->append(s);
225     return s;
226 }
227
228 HLADataElement::StringPathPair
229 HLADataElement::toStringPathPair(const std::string& s)
230 {
231     Path path;
232     // Skip the initial attribute/parameter name if given
233     std::string::size_type i = s.find_first_of("[.");
234     std::string attribute = s.substr(0, i);
235     while (i < s.size()) {
236         if (s[i] == '[') {
237             ++i;
238             unsigned index = 0;
239             while (i < s.size()) {
240                 if (s[i] == ']')
241                     break;
242                 unsigned v = s[i] - '0';
243                 // Error, no number
244                 if (10 <= v) {
245                     SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid character in array subscript for \""
246                            << s << "\" at \"" << attribute << toString(path) << "\"!");
247                     return StringPathPair();
248                 }
249                 index *= 10;
250                 index += v;
251                 ++i;
252             }
253             path.push_back(index);
254             ++i;
255             continue;
256         }
257         if (s[i] == '.') {
258             // Error, . cannot be last
259             if (s.size() <= ++i) {
260                 SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid terminating '.' for \""
261                        << s << "\"!");
262                 return StringPathPair();
263             }
264             std::string::size_type e = s.find_first_of("[.", i);
265             path.push_back(s.substr(i, e - i));
266             i = e;
267             continue;
268         }
269     }
270
271     return StringPathPair(attribute, path);
272 }
273
274 void
275 HLADataElement::_setStamp(HLADataElement::Stamp* stamp)
276 {
277     _stamp = stamp;
278 }
279
280 }