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